MFC消息映射机制的剖析,讲述如何运用ClassWizard,,理解发送给窗口的消息是如何被MFC框架通过窗口句柄映射表和消息映射表来用窗口类的函数进行响应的。掌握设备描述表及其封装类CDC的使用,CDC是如何与具体的设备发生关联的,融合具体的画图程序进行分析。如何设置封闭图形的填充刷子(位图画刷与透明画刷的使用)。
1,
在CMainFrame中
void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
MessageBox("mainframe clicked");
// MessageBox 在CWind中是CWind的成员函数 ,他有数据成员保存了和数据相关的句柄
CFrameWnd::OnLButtonDown(nFlags, point);
}
在CDrawView中 View始终覆盖在Frame之上,所以在窗口上的任何操作都是在我们的View类窗口上的操作,所以我们的Frame类中捕获不到我们的鼠标点击操作,在View类中能够捕获。
新增一个消息响应函数,新增加的内容有
1、 在头文件中
protected:
//{{AFX_MSG(CDrawView)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point); // afx_msg 标示是消息响应的宏的申明
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
2. 在.cpp文件当中
BEGIN_MESSAGE_MAP(CDrawView, CView)
//{{AFX_MSG_MAP(CDrawView)
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
ON_WM_LBUTTONDOWN宏把把 WM_LBUTTONDOWN 消息和我们的OnLButtonDown函数关联起来了
3 OnLButtonDown()函数
MFC 消息映射
1.在基类中针对每种消息做一个虚函数,在子类中重写来完成。
2.消息映射 在后台维护了一个句柄
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_ptOrigin=m_ptOld=point;
m_bDraw=TRUE;
CView::OnLButtonDown(nFlags, point);
}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
/*HDC hdc; //dc 句柄
hdc=::GetDC(m_hWnd);
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL); //把点移动到原点的位置
LineTo(hdc,point.x,point.y); //从当前位置到哪儿
::ReleaseDC(m_hWnd,hdc);*/ //释放DC
/*CDC *pDC=GetDC(); GetDC是wnd的成员函数 //所有与作图相关的类都定义在CDC类中
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);*/ 释放DC 类的成员函数
//CClientDC dc(this); CClientDC从CDC派生出来的
/*CClientDC dc(GetParent()); 框架类中的标题栏和菜单栏为非客户区,view类没有非客户区
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);*/
//CWindowDC dc(this); 可以访问客服区和非客户区
//CWindowDC dc(GetParent());
/*CWindowDC dc(GetDesktopWindow());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);*/
/*CPen pen(PS_DOT,1,RGB(0,255,0)); pen (笔的类型,笔的宽度,笔的颜色)
CClientDC dc(this);
CPen *pOldPen=dc.SelectObject(&pen); 把先前的笔保存在pOldPen中
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);*/ SelectObject返回被替换的对象的指针笔类型
// CBrush brush(RGB(255,0,0));
/*CBitmap bitmap; 图形 新建位图 1,insert 2,resource 选择位图
bitmap.LoadBitmap(IDB_BITMAP1); 加载位图
CBrush brush(&bitmap);*/
/*CClientDC dc(this);
//dc.FillRect(CRect(m_ptOrigin,point),&brush); FillRect用指定的画刷填写一块矩形区域
CRect矩形
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); GetStockObject获取一个画刷的句柄
FromHandle 返回一个CBrush对象的指针 CBrush::FromHandle
CBrush *pOldBrush=dc.SelectObject(pBrush);
dc.Rectangle(CRect(m_ptOrigin,point));
dc.SelectObject(pOldBrush);*/
m_bDraw=FALSE;
CView::OnLButtonUp(nFlags, point);
}
class Point
{
public:
void output()
{
init();
}
static void init()
{
x=0; //在静态的方法中非法引用非静态的成员
y=0;
}
private:
static int x,y;
};
//int Point::x=0;
//int Point::y=0;
void main()
{
/* Point pt;
pt.init(); 可以用类来调用,因为init是一个静态的成员函数
pt.output();*/ 不能直接用类调用output函数
// Point::init();
//Point::output();
}
静态的方法属于类本身,而非静态的方法属于某个具体的对象
在静态函数中不能引用非静态的成员函数
静态的变量,一定要初始化(在类的外部)。
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CPen pen(PS_SOLID,1,RGB(255,0,0));
CPen *pOldPen=dc.SelectObject(&pen);
if(m_bDraw==TRUE)
{
dc.SetROP2(R2_BLACK); //CDC中设置绘画的模式
dc.MoveTo(m_ptOrigin); //
//dc.LineTo(point);
dc.LineTo(m_ptOld); //划线到旧的电
//dc.MoveTo(m_ptOrigin);
dc.MoveTo(m_ptOld); //先到原点
dc.LineTo(point); //到新的点
//m_ptOrigin=point;
m_ptOld=point;
}
dc.SelectObject(pOldPen);
CView::OnMouseMove(nFlags, point);
}
1,
在CMainFrame中
void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
MessageBox("mainframe clicked");
// MessageBox 在CWind中是CWind的成员函数 ,他有数据成员保存了和数据相关的句柄
CFrameWnd::OnLButtonDown(nFlags, point);
}
在CDrawView中 View始终覆盖在Frame之上,所以在窗口上的任何操作都是在我们的View类窗口上的操作,所以我们的Frame类中捕获不到我们的鼠标点击操作,在View类中能够捕获。
新增一个消息响应函数,新增加的内容有
1、 在头文件中
protected:
//{{AFX_MSG(CDrawView)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point); // afx_msg 标示是消息响应的宏的申明
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
2. 在.cpp文件当中
BEGIN_MESSAGE_MAP(CDrawView, CView)
//{{AFX_MSG_MAP(CDrawView)
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
ON_WM_LBUTTONDOWN宏把把 WM_LBUTTONDOWN 消息和我们的OnLButtonDown函数关联起来了
3 OnLButtonDown()函数
MFC 消息映射
1.在基类中针对每种消息做一个虚函数,在子类中重写来完成。
2.消息映射 在后台维护了一个句柄
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_ptOrigin=m_ptOld=point;
m_bDraw=TRUE;
CView::OnLButtonDown(nFlags, point);
}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
/*HDC hdc; //dc 句柄
hdc=::GetDC(m_hWnd);
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL); //把点移动到原点的位置
LineTo(hdc,point.x,point.y); //从当前位置到哪儿
::ReleaseDC(m_hWnd,hdc);*/ //释放DC
/*CDC *pDC=GetDC(); GetDC是wnd的成员函数 //所有与作图相关的类都定义在CDC类中
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);*/ 释放DC 类的成员函数
//CClientDC dc(this); CClientDC从CDC派生出来的
/*CClientDC dc(GetParent()); 框架类中的标题栏和菜单栏为非客户区,view类没有非客户区
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);*/
//CWindowDC dc(this); 可以访问客服区和非客户区
//CWindowDC dc(GetParent());
/*CWindowDC dc(GetDesktopWindow());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);*/
/*CPen pen(PS_DOT,1,RGB(0,255,0)); pen (笔的类型,笔的宽度,笔的颜色)
CClientDC dc(this);
CPen *pOldPen=dc.SelectObject(&pen); 把先前的笔保存在pOldPen中
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);*/ SelectObject返回被替换的对象的指针笔类型
// CBrush brush(RGB(255,0,0));
/*CBitmap bitmap; 图形 新建位图 1,insert 2,resource 选择位图
bitmap.LoadBitmap(IDB_BITMAP1); 加载位图
CBrush brush(&bitmap);*/
/*CClientDC dc(this);
//dc.FillRect(CRect(m_ptOrigin,point),&brush); FillRect用指定的画刷填写一块矩形区域
CRect矩形
CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); GetStockObject获取一个画刷的句柄
FromHandle 返回一个CBrush对象的指针 CBrush::FromHandle
CBrush *pOldBrush=dc.SelectObject(pBrush);
dc.Rectangle(CRect(m_ptOrigin,point));
dc.SelectObject(pOldBrush);*/
m_bDraw=FALSE;
CView::OnLButtonUp(nFlags, point);
}
class Point
{
public:
void output()
{
init();
}
static void init()
{
x=0; //在静态的方法中非法引用非静态的成员
y=0;
}
private:
static int x,y;
};
//int Point::x=0;
//int Point::y=0;
void main()
{
/* Point pt;
pt.init(); 可以用类来调用,因为init是一个静态的成员函数
pt.output();*/ 不能直接用类调用output函数
// Point::init();
//Point::output();
}
静态的方法属于类本身,而非静态的方法属于某个具体的对象
在静态函数中不能引用非静态的成员函数
静态的变量,一定要初始化(在类的外部)。
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CPen pen(PS_SOLID,1,RGB(255,0,0));
CPen *pOldPen=dc.SelectObject(&pen);
if(m_bDraw==TRUE)
{
dc.SetROP2(R2_BLACK); //CDC中设置绘画的模式
dc.MoveTo(m_ptOrigin); //
//dc.LineTo(point);
dc.LineTo(m_ptOld); //划线到旧的电
//dc.MoveTo(m_ptOrigin);
dc.MoveTo(m_ptOld); //先到原点
dc.LineTo(point); //到新的点
//m_ptOrigin=point;
m_ptOld=point;
}
dc.SelectObject(pOldPen);
CView::OnMouseMove(nFlags, point);
}

1268

被折叠的 条评论
为什么被折叠?



