现在的位置: 首页 > 综合 > 正文

vc++深入详解 第四章

2013年09月15日 ⁄ 综合 ⁄ 共 3233字 ⁄ 字号 评论关闭
主要是画图什么的.

按照书上敲代码,没有发现什么大的问题,就是一些设置事件监听和添加成员变量的方法和位置变了
// WindowView.cpp : CWindowView类的实现
#include "stdafx.h"
#include "Window.h"
#include"WindowDoc.h"
#include"WindowView.h
#ifdef _DEBUG
#define newDEBUG_NEW
#endif
// CWindowView
IMPLEMENT_DYNCREATE(CWindowView,CView)
BEGIN_MESSAGE_MAP(CWindowView,CView)

// 标准打印命令

ON_COMMAND(ID_FILE_PRINT,&CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_DIRECT,&CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_PREVIEW,&CView::OnFilePrintPreview)

ON_WM_LBUTTONUP()

ON_WM_LBUTTONDOWN()

ON_WM_MOUSEMOVE()

END_MESSAGE_MAP()

// CWindowView 构造/析构

CWindowView::CWindowView(): m_ptOrigin(0), m_bDraw(0), m_ptOld(0)
{
// TODO: 在此处添加构造代码

//初始时,鼠标左键未按下
m_bDraw = FALSE;

}

CWindowView::~CWindowView()
{

}

BOOLCWindowView::PreCreateWindow(CREATESTRUCT&cs)
{
// TODO: 在此处通过修改
//  CREATESTRUCT cs来修改窗口类或样式
returnCView::PreCreateWindow(cs);

}

// CWindowView 绘制
void CWindowView::OnDraw(CDC*)

{

CWindowDoc* pDoc =GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc)

return;

// TODO:在此处为本机数据添加绘制代码

}

// CWindowView 打印
BOOLCWindowView::OnPreparePrinting(CPrintInfo* pInfo)

{

// 默认准备

returnDoPreparePrinting(pInfo);

}
voidCWindowView::OnBeginPrinting(CDC* , CPrintInfo* )

{

// TODO:添加额外的打印前进行的初始化过程

}

void CWindowView::OnEndPrinting(CDC*, CPrintInfo* )

{
// TODO:添加打印后进行的清理过程
}
// CWindowView 诊断

#ifdef _DEBUG

void CWindowView::AssertValid()const

{

CView::AssertValid();

}
voidCWindowView::Dump(CDumpContext& dc)const
{
CView::Dump(dc);
}
CWindowDoc*CWindowView::GetDocument() const // 非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWindowDoc)));
return(CWindowDoc*)m_pDocument;
}

#endif //_DEBUG
// CWindowView消息处理程序
void CWindowView::OnLButtonUp(UINTnFlags, CPoint point)
{
// TODO:在此添加消息处理程序代码和/或调用默认值
//MessageBox(_T("鼠标抬起!"));
//左键抬起了
m_bDraw = FALSE;


CView::OnLButtonUp(nFlags,point);

}

void CWindowView::OnLButtonDown(UINTnFlags, CPoint point)

{

// TODO:在此添加消息处理程序代码和/或调用默认值

//MessageBox(_T("鼠标点击!"));4

m_ptOrigin = point;

//鼠标左键按下了

m_bDraw = TRUE;

//按下时,记录边缘开始的点

m_ptOld = point;

CView::OnLButtonDown(nFlags,point);

}




void CWindowView::OnMouseMove(UINTnFlags, CPoint point)

{

// TODO:在此添加消息处理程序代码和/或调用默认值

//当鼠标左键按下并移动时,画线

CClientDC dc(this);

CPenpen(PS_SOLID,1,RGB(255,0,0));

CPen *pOldPen =dc.SelectObject(&pen);

if(m_bDraw){

dc.MoveTo(m_ptOrigin);

dc.LineTo(point);

//注释掉改行,可以使得每次按下鼠标左键并移动时,会以开始点为中心绘制很多条线段

//m_ptOrigin = point;//每次画完,都将终点作为下一次的起点

dc.LineTo(m_ptOld);//绘制边缘,从新确定的点到原来的边缘点

m_ptOld = point;

}

dc.SelectObject(pOldPen);

CView::OnMouseMove(nFlags,point);

}

主要是获得DC,使用了MFC封装的CDC及其子类.CClientDC来获取DC,管理DC.
其中有几个什么RGB啊,CRect啊,CPen啊CBrush啊,这些东西的
还有个CBitmap位图对象,使用这个位图来作为画刷.这里用到了LoadBitmap去加载位图资源的.
还有个透明画刷的,使用GetStockObject去获取一个空画刷,又要强制转换类型从HGDIOBJECT转换为HBRUSH类型.然后通过静态方法 CBrush::FromHandle从该句柄获取一个画刷指针.
前面还讲了那个消息映射表,在MFC中没有使用虚函数来实现消息的映射,而是自建消息映射表.每个可操作的类的宏定义中,有相关数据.例如
在我们的WindowView.cpp中
BEGIN_MESSAGE_MAP(CWindowView,CView)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT,&CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,&CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,&CView::OnFilePrintPreview)
ON_WM_LBUTTONUP()
ON_WM_LBUTTONDOWN()
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()
这就是消息映射表,这里的就有我们添加的鼠标左键按下,抬起,移动的相关信息.
在WindowView.h中
public:
afx_msg void OnLButtonUp(UINT nFlags,CPoint point);
public:
afx_msg void OnLButtonDown(UINTnFlags, CPoint point);
public:
afx_msg void OnMouseMove(UINT nFlags,CPoint point);
这些就是映射关系,对应的事件调用的函数.
哈有就是我们自己编写的事件处理函数了.这三部分就是消息映射表的相关信息了.
而具体实现是通过一个CWnd::WindowProc的虚函数来搞的.当然次希函数里面是调用了OnWndMsg函数来实现具体的消息路由的.

抱歉!评论已关闭.