在绘制图形(比如直线、椭圆、矩形等)时,我们通常利用两个消息响应函数即可完成:WM_LBUTTONDOWN和WM_LBUTTONUP。在使用单文档模板创建应用程序时,我们须注意一个小细节,通常单文档应用程序的标题栏都支持双击最大化功能,当在绘图过程中双击标题栏最大化时经常看到又多了一个预期外的图形。这种情况是应用程序在响应鼠标单击、双击的先后顺序的不同造成的,鼠标双击一次可分解成两次单独的单击的组合,于是依次发出5个消息:WM_LBUTTONDOWN---->WM_LBUTTONUP---->WM_LBUTTONDOWN---->WM_NCLBUTTONDBLCLK---->WM_LBUTTONUP.通常问题的关键在于WM_NCLBUTTONDBLCLK消息响应之后,系统又响应了一个WM_LBUTTONUP消息。而我们的作图代码通常又放在该消息处理函数之中或被其调用。具体的解决方法可以在框架类中重载BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) 函数,截获WM_NCLBUTTONDBLCLK消息并放弃对该消息的响应,这样可以消除原来的问题,但同时也使得应用程序窗体失去了双击最大化的功能;另外一个方法是在BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) 函数中设置一个静态布尔型开关变量bDBCLK,初始化该变量为FALSE,当截获的消息为WM_NCLBUTTONDBLCLK时设置其为TRUE;当截获的消息为WM_LBUTTONUP消息时首先判断bDBCLK是否为真,若为真则放弃对该消息的处理,同时设置bDBCLK为FALSE,否则进行消息响应。这种做法就是在WM_NCLBUTTONDBLCLK消息响应后放弃对WM_LBUTTONUP消息的响应即可。
一个图形绘制时的问题
最新推荐文章于 2022-10-01 15:34:38 发布