消息机制
- 在Windows SDK中,消息是通过消息循环的方式来进行处理
- 在MFC中,消息通过消息映射的机制来进行处理
具体过程如下:每个消息都会附带一个指针指向消息的窗口句柄,通过该句柄找到对应的C++对象的指针,并将该指针传入基类交由 WindowProc 函数来处理(这是一个虚函数),该函数调用 OnWndMsg 函数,这才是对消息处理的核心函数。
MFC运行过程中会先在头文件中判断在 DECLARE_MESSAGE_MAP 之上有没有消息映射函数的声明,之后在源文件中判断在 BEGIN_MESSAGE_MAP 和 END_MESSAGE_MAP 之间有没有消息相应映射的宏。如果全都具备,就会调用消息处理函数
作图
DC:
全称Device Context设备描述表,C++中在所有类前加字母C,即CDC。
要在窗口中输出文字或者显示图形,就需要用到设备描述表,即DC。DC是一个包含设备(物理输出设备,如显示器,以及设备驱动程序)信息的结构体,在Windows平台下,所有的图形操作都是利用DC来完成的。
设备描述表是一个Windows数据结构,它包含了一个设备(比如显示器和打印机)绘图属性的相关信息。所有的绘图操作的调用都是通过一个设备描述表类型的对象来实现,这个类对象封装了Windows API(Application Programming Interface,应用程序编程接口)函数中关于划线、作图和输入输出文本的的相关操作。设备描述表允许在窗口上进行与设备无关的绘图操作,设备描述表可以用在往屏幕、打印机或者图元文件的绘图操作。方法一:
HDC hdc;
hdc = ::GetDC(m_hWnd);
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NUll);
LineTo(hdc,point.x,point.y);
::ReleaseDC(m_hWnd,hdc);
- 方法二:
CDC *pDC = GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);
- 方法三:
CClientDC可以自动调用 GetDC 和 ReleaseDC,是CDC类派生出来的
CClientDC dc(this);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
- 方法四:
CWindowDC可以自动调用 GetDC 和 ReleaseDC,并且可以在整个屏幕(包括客户区和非客户区)作图,是CDC类派生出来的
//在View内画图
//CWindowDC dc(this);
//在整个程序内画图
//CWindowDC dc(GetParent());
//在整个屏幕画图
//CWindowDC dc(GetDesktopWindow());
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
画笔、画刷
- 画笔
CPen pen(PS_SOLID,1,RGB(255,0,0));
CClientDC dc(this);
CPen *pOldPen = dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);
- 画刷
CBrush brush(RGB(255,0,0));
CClientDC dc(this);
dc.FillRect(CRect(m_ptOrigin,point),&brush);