• PreTranslateMessage中有调用模态对话框的解决方法


    原文:https://blog.csdn.net/guoguojune/article/details/45332511 

    dlg.DoModal()截住了界面消息,所以返回时原来的pMsg的内容已经更改了,消息,窗口句柄都不在是if以前的值了,

    而且窗口句柄应该是对话框里的子窗口的句柄,所以调用CFrameWnd::PreTranslateMessage(pMsg); 

    时pMsg的窗口句柄是个无效值(窗口已销毁) 

    非常对!

    目前我觉得两种解决方式:

    方式一:

    if (pMsg-> message == WM_CHAR) 
    { 
       MSG msg = *pMsg;//后来发现这样还是有点问题,模态对话框回车后,鼠标不见了 
       CMyDlg dlg; 
       dlg.DoModal(); 
       *pMsg = msg; //后来发现这样还是有点问题,模态对话框回车后,鼠标不见了
    
    
    return TRUE;//最终方法还是在这里直接返回吧,破坏消息循环总是不好的。
    } 

    方式二:

    BOOL CXXXView::PreTranslateMessage(MSG* pMsg)
    
    {
    
        if ( pMsg->message == WM_LBUTTONUP)
    
            {
                GetMainItemID(pMsg);//调用模态对话框函数
                
                return TRUE; // 模态对话框后返回 TURE
            }
    
    
    }                

    看看别人写的原因:

    如果在正常的流程中弹出了模态窗口,就会使正常的PreTranslateMessage机制失效。

    因为模态窗口中已经包含了一个消息循环,接管了线程中缺省的消息循环。而这个消息循环是在DialogBox这个API函数中执行的,显然不可能再有PreTranalateMessage机制了。

    为了解决这一问题,只有让模态窗口也使用和UI线程相同的消息循环,MFC正是这么做的。

    在MFC中,对话框类的DoModal函数,并不是调用DialogBox函数,而是直接使用CreateWindows创建一个非模态窗口在窗口创建成功之后再调用MFC自己的消息循环,这样就可以让PreTranslateMessage继续生效。同时在窗口创建出来之后,必须再做一些别的操作,使这个模态窗口的父窗口失效(一般直接把窗口Disable掉)。同时消息循环里有合适的退出条件,并有恢复现场的一些操作,具体可以查看MFC的DoModal函数。

    方式三:你就不用模态对话框,用非模态对话框。

  • 相关阅读:
    跑mmaction代码遇到的问题:KeyError: 'xxxDataset is not in the dataset registry' when test #3751
    内存 显存 缓存
    fvcore计算模型参数量和计算量
    深度学习中模型参数量和计算量的理解与计算
    linux安装tmux
    findDecoder imread_(...) can't open/read file: check file path/integrity
    self._traceback = tf_stack.extract_stack()
    VRChat制作世界需要的unity包
    onnxruntime、cuda、cudnn、显卡驱动
    耗时统计
  • 原文地址:https://www.cnblogs.com/XiHua/p/11091695.html
Copyright © 2020-2023  润新知