zoukankan      html  css  js  c++  java
  • 一个解决OnNcLButtonUp不能响应消息问题的更好办法

            这几天在写重绘对话框程序,发现好多例子中都是用OnNcLButtonDown来处理系统按钮按下消息,而不是常规的ButtonUp。这样很不爽,鼠标只要一点击按钮,窗口就直接最小化或关闭,这样不符合通常的操作习惯。(通常的Windows应用程序在鼠标键弹起时,才处理事件。)

           当我写程序的时候,才发现,windows不能直接响应OnNcLButtonUp,难怪大家都把事件处理放到OnNcLButtonDown中。在网上搜索了下,原因如下:

            “窗口管理器在处理 OnNcLButtonDown 的时候捕捉了鼠标焦点,即使用了 SetCapture 函数,在捕捉了鼠标焦点后,窗口就不会发送 WM_NCLBUTTONUP 消息,从而不会响应OnNcLButtonUp函数。

    有若干种解决办法:

           方法 一:让对话框的OnNcLButtonDown函数不要调用基类的OnNcLButtonDown函数,即,将CDialog::OnNcLButtonDown注释掉,这样带来一个后遗症,不能拖动窗口了!

          方法二:在适当的时候,重新发送WM_NCLBUTTONUP  消息,来执行OnLButtonUp函数。

    该解决办法来源:http://blog.csdn.net/yowen/article/details/3992710

    在你的CXXDialog中的消息处理函数OnSysCommand()(对WM_SYSCOMMAND的响应)添加下面代码:   
        
      void   CXXXDialog::OnSysCommand(UINT   nID,   LPARAM   lParam)   
      {   
                if(   (nID   &   0xFFF0)   ==   IDM_ABOUTDLG   )   
                {   
                        //   省略...   
                }   
                else   
                {   
                        //   这是本来有的   
                        CDialog::OnSysCommand(nID,   lParam);   
        
                        //   加入下面这2行   
                        if(   (nID   &   0xFFF0)   ==   SC_MOVE   )   
                              PostMessage(WM_NCLBUTTONUP,   nID,   lParam);   
                }   
      }   
            但是,这个方法也有后遗症,就是我们在系统按钮上按下鼠标然后拖动,居然也可以将窗口拖动!

            从上面的这些解决办法中,我们可以隐隐约约看到另一种更好的解决办法。能否将两者结合起来,得到一种完美的结果?答案是肯定的。

            通常我们需要在OnNCLButtonDown函数中,处理鼠标消息,让系统按钮实现按下的效果。如果我们在处理系统按钮按下效果的情况下不去调用基类的OnNCLButtonDown函数,而在没有处理的时候去调用基类的函数,那么,我们就可以实现在按下系统按钮以后得到WM_NCLBUTTONUP消息,而没有按下系统按钮的时候一切照常运行。

    以下是算法伪代码:

    OnNcLButtonDown(point)
    {
    if(point  in   closeButtonRect) then closeButtonState = BS_DOWN ,drawCloseButton()
    else if(point  in  minButtonRect) then minButtonState = BS_DOWN ,drawMinButton()
    else CDialog::OnNcLButtonDown()  //没有处理消息的时候才调用基类
    }
    
    OnNcLButtonUp(point)
    {
    if(point  in  closeButtonRect  and closeButtonState = BS_DOWN) then ExitApplication
    else if(point  int minButtonRect and minButtonState = BS_DOWN) then MinWindow
    ...
    CDialog::OnNcLButtonUp()
    }







  • 相关阅读:
    通过抓取pintpoint2的页面信息把数据存入数据库python3
    jenkins 2.282+Publish over ssh 1.22版本发布日志不能实时显示
    ELKF搭建
    pinpoint2.0.2 定制开发--增加钉钉群通知、@到具体个人,解决手机号码无法输入BUG、删除客户端需要认证、查看数据日期范围扩大等。
    通过命令行通知RANCHER重新部署程序。
    Jenkins rancher cli 配置
    centos7 outlook mailx配置
    创业公司使用的敏捷GIT FLOW管理方式(多BUG、多项目多环境,多任务并发开发,支持需求多变)
    Dubbo Admin 2.6.2 版本连接zk 集群的连接字符串配置
    jenkins典型配置-多分支选择
  • 原文地址:https://www.cnblogs.com/ygxsk/p/7694012.html
Copyright © 2011-2022 走看看