VC++|VC++简单绘图 MFC消息映射机制 MessageBox函数

目录
简单绘图
MFC消息映射机制
MessageBox函数:
接上:VC++ Button Styles Window Styles
接下:VC++ 类向导
简单绘图

接下来将剖析MFC消息映射机制,探讨发送给窗口的消息是如何被MFC框架通过窗口句柄映射表和消息映射表来用窗口类的处理函数进行响应的。另外,还将讲述“类向导”这一工具的运用,讨论设备描述表及其封装类CDC的使用,以及CDC是如何与具体的设备发生关联的,并结合具体的画图程序进行分析。
MFC消息映射机制 首先介绍一些绘图方面的知识,从最简单的画线开始。在程序中画线和在纸上画线不太一样,在纸上画线时,我们只需用笔在纸上拖动一下就可以绘制出一条线,但在程序中画线时需要知道两个点,即线条的起点和终点。程序中如何捕获到这两个点呢?Windows程序是基于消息编程的。在程序运行过程中,当单击鼠标左键时,就可以获得一个点,即线条的起点。接着按住鼠标左键并拖动一段距离后松开鼠标,此时也可以获得一个点,即线条的终点。也就是说,我们需要捕获两个消息,一个是鼠标左键按下消息(WM_LBUTTONDOWN),在该消息响应函数中可以获得将要绘制的线条的起点;另一个是鼠标左键弹起来的消息(WM_LBUTTONUP),在该消息响应函数中可以获得将要绘制的线条的终点。有了这两个点就可以绘制出一条线。下面就来实际编写一个绘制线条的程序。
新建一个单文档类型的MFC应用程序,项目名为Draw,解决方案名为ch05,步骤:VC++MFC应用程序向导。既可以在视类中进行鼠标左键操作消息的捕获,也可以在框架类中进行此项工作。
先在框架类中进行这项工作。我们为 CMainFrame 类添加 WM_LBUTTONDOWN这个消息的响应函数。在此函数内部,添加一条显示消息框的代码(利用MessageBox函数实现),用来表明在程序运行时鼠标左键确实被按下去了。
连接:VC++在窗口中显示按钮 CButton::Create Button Styles Window Styles
VC++|VC++简单绘图 MFC消息映射机制 MessageBox函数
文章图片

代码如下:
void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CFrameWnd::OnLButtonDown(nFlags, point); }

在添加MessageBox函数这行代码时,根据VC++提供的智能提示(代码如下所示),可以发现此处的 MessageBox 函数与我们利用 SDK 编程时使用的MessageBox 函数有所区别,此处的 MessageBox 调用少了一个参数:窗口句柄(HWND类型的变量hWnd)。我们已经介绍过CWnd类定义了一个HWND类型的成员变量m_hWnd,用于保存当前窗口的句柄,并且该成员变量具有public类型的访问权限。这样,窗口的所有操作就不再需要传递这个句柄了,因为它已经是成员变量,可以直接使用。根据类继承性原理,所有派生于CWnd类的子类都拥有这一成员变量,用来保存当前子类窗口的句柄,因此在调用与子类窗口有关的操作时,也不再需要传递这个窗口句柄了。我们知道CMainFrame是CWnd类的一个子类,因此也就应该明白为什么此处MessageBox函数会没有窗口句柄这一参数了。
MessageBox函数: VC++|VC++简单绘图 MFC消息映射机制 MessageBox函数
文章图片

提示:提示的 MessageBox 函数后面多了一个大写的字母W,因为Visual Studio 2017默认使用Unicode字符集(即宽字符,用两个字节表示一个字符),而此处我们使用的MessageBox只是一个宏,它会根据项目使用的字符集在编译时自动转换为宽字符函数版本,或者ANSI字符串函数版本。
同时,可以发现 MessageBox 函数的后两个参数都具有默认值,因此,添加的MessageBox函数调用如下所示。
void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 MessageBox(L"MainFrame Clicked!"); CFrameWnd::OnLButtonDown(nFlags, point); }

【VC++|VC++简单绘图 MFC消息映射机制 MessageBox函数】Build并运行Draw程序,然后在程序窗口上单击鼠标左键,发现程序并未如我们所愿,弹出消息框。这是为什么呢?我们暂时先把这一问题搁置一下,再看一下,如果在视类中捕获鼠标左键操作消息并处理,结果会如何?
接上:VC++ Button Styles Window Styles 接下:VC++ 类向导

    推荐阅读