这几天学习了自定义模板对话框类,就是说不用系统定义的模板对话框类来创建对话框

消息处理就不用返回0了,可直接返回DefWindowProc

HINSTANCE hInstance = ::GetModuleHandle(NULL);

    if (bUserDlgClsName)
{
TCHAR szDlgClassName[] = TEXT("MyDialogClassName"); WNDCLASSEX wndClsEx = { 0 };
wndClsEx.cbSize = sizeof(WNDCLASSEX);
if (FALSE == GetClassInfoEx(hInstance, szDlgClassName, &wndClsEx))
{
wndClsEx.lpfnWndProc = QWnd::AfxQWindowProc;
wndClsEx.cbClsExtra = 0;
wndClsEx.cbWndExtra = DLGWINDOWEXTRA; //这个必填这
wndClsEx.hInstance = hInstance;
wndClsEx.hIcon = ::LoadIcon(hInstance, IDI_APPLICATION);
wndClsEx.hIconSm = ::LoadIcon(hInstance, IDI_APPLICATION);
wndClsEx.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);
wndClsEx.lpszClassName = szDlgClassName;
wndClsEx.lpszMenuName = NULL;
wndClsEx.style = CS_HREDRAW | CS_VREDRAW;
wndClsEx.hCursor = ::LoadCursor(hInstance, IDC_ARROW); if (FALSE == RegisterClassEx(&wndClsEx))
return FALSE; }
} m_hWnd = ::CreateDialogParam(hInstance,
MAKEINTRESOURCE(id),
pParent ? pParent->m_hWnd : NULL,
(DLGPROC)QWnd::AfxQWindowProc,
(LPARAM)this);

可问题就来了,在这对话框上弹出MessageBox的时候就没反应了,

找了好久,跟踪消息后发现,

MessageBox的消息也进入了消息循环,它就不能直接返回DefWindowProc,要返回0

这就尴尬了,那这自定义对话类就没有意义了,

还是只能在消息循环中判断是否是模板对话框消息来处理了。

在窗口成员变量添加:BOOL m_bDialog;来判断是否是模板对话框的消息

QWnd* pWnd = nullptr;
if (WM_CREATE == uMsg || WM_NCCREATE == uMsg)
{
pWnd = (QWnd*)((LPCREATESTRUCT)lParam)->lpCreateParams;
if (pWnd != nullptr)
{
pWnd->m_hWnd = hWnd;
::SetWindowLongPtr(hWnd, GWLP_USERDATA, LONG_PTR(pWnd)); }
}
else if (WM_INITDIALOG == uMsg)
{
QDialog* pDlg = (QDialog*)lParam;
if (pDlg != nullptr)
{
pDlg->m_hWnd = hWnd;
::SetWindowLongPtr(hWnd, GWLP_USERDATA, LONG_PTR(pDlg));
return pDlg->OnInitDialog(pDlg->m_lParam); }
}
else
{
pWnd = (QWnd*)::GetWindowLongPtr(hWnd, GWLP_USERDATA);
} if (pWnd != nullptr)
{
LRESULT lResult = 0; const MESSAGE_MAP* pMsg = pWnd->FindMessageMap(uMsg, wParam, lParam);
if (pMsg)
{ FuntionStyle funStyle;
funStyle.pfn = pMsg->pfn; switch (pMsg->singStyle)
{
case sing_vv:
(pWnd->*funStyle.pfn_vv)();
break; case sing_v_l:
(pWnd->*funStyle.pfn_v_l)(lParam);
break; case sing_v_wl:
(pWnd->*funStyle.pfn_v_wl)(wParam, lParam);
break; case sing_v_uii:
(pWnd->*funStyle.pfn_v_uii)(wParam, LOWORD(lParam), HIWORD(lParam));
break; case sing_v_up:
(pWnd->*funStyle.pfn_v_up)(wParam, POINT{ LOWORD(lParam), HIWORD(lParam) });
break; case sing_v_uh:
(pWnd->*funStyle.pfn_v_uh)(LOWORD(wParam), (HWND)lParam);
break; case sing_l_v:
lResult = (pWnd->*funStyle.pfn_l_v)();
break; case sing_l_l:
lResult = (pWnd->*funStyle.pfn_l_l)(lParam);
break; case sing_l_wl:
lResult = (pWnd->*funStyle.pfn_l_wl)(wParam, lParam);
break; default:
break;
} if (lResult)
return lResult; } if (pWnd->m_bDialog)
return 0;
} return DefWindowProc(hWnd, uMsg, wParam, lParam);

在消息循环中判断:

if (pWnd->m_bDialog)
return 0;

否则返回DefWindowProc

MessageBox弹出后无响应的更多相关文章

  1. VS2010 根据模型生成数据库 打开edmx.sql文件时 vs出现无响应的解决方案

    今天在VS2010 sp1+sql server 2008 R2+Win7操作系统下测试ADO.NET 实体数据模型时 ,遇到这样一个问题. 首先建好实体模型,然后"根据模型生成数据库&qu ...

  2. win10 死机 无响应

    win10 死机 无响应 用着用着无响应,结束任务出不来,ctrl+alt+delete  无效. 点 窗口的关闭关闭不了. 鼠标键盘无响应. 写的代码变成乱码,影响太严重了,损失惨重. 紧急启动 c ...

  3. 在vue项目中的main.js中直接使用element-ui中的Message 消息提示、MessageBox 弹框、Notification 通知

    需求来源:向后台请求数据时后台挂掉了,后台响应就出现错误,不做处理界面就卡住了,这时需要在main.js中使用axios的响应拦截器在出现相应错误是给出提示.项目使用element-ui,就调用里面的 ...

  4. 分析案例:应用服务无响应,任务管理器中发现大量w3wp僵尸进程----等待异构系统WebService返回值

    问题描述:       某二次开发的项目反馈,不定期出现应用服务器无响应的情况,登录服务器发现任务管理器中有大量的w3wp僵尸进程. 分析过程: 针对同一进程每隔15秒抓取dump,连续抓取3个,对比 ...

  5. c#自动关闭 MessageBox 弹出的窗口

    我们都知道,MessageBox弹出的窗口是模式窗口,模式窗口会自动阻塞父线程的.所以如果有以下代码: MessageBox.Show("内容',"标题"); 则只有关闭 ...

  6. 调用startActivityForResult,onActivityResult无响应的解决办法

    三种情况: 1.执行startActivityForResult,没等到被调用的 Activity 返回,onActivityResult() 就被执行了.找了很久,终于通过小道消息得知,这与 Act ...

  7. IIS服务器运行一段时间后卡死,且无法打开网站(IIS管理无响应,必须重启电脑)

    问题描述: 公司希望使用IIS配合网站显示一些订单跟进的情况并展示出来,所以我们在一台演示的Win7 Pro电脑上安装了IIS,但使用了一段时间后发现每过几天页面就无法正常访问了,而且打开IIS管理器 ...

  8. VC++6.0一些常见问题解决方法(打开多个窗口、行号、添加文件无响应、更改.exe图标及名称等等)

    背景: 最近使用VC++6.0做一个界面,供测试CAN通信使用.由于客户希望我们提供简单方便的函数接口让其最快速使用CAN,DLL(动态链接库)是不二之选.做DLL需要两个VC窗口进行测试才方便.可是 ...

  9. SQL阻塞原因造成系统多功能无响应的分析解决思路

    最近遇到一个sqlserver项目,月底会出现多个财务相关功能出现不定期操作无响应问题 通过查询SQL阻塞信息,定位到阻塞源头spid.该会话的状态.等待事件及执行的SQL脚本 根据spid查询该会话 ...

  10. eclipse启动无响应,停留在Loading workbench状态,或老是加载不了revert resources

    做开发的同学们或多或少的都会遇到eclipse启动到一定程度时,就进入灰色无响应状态再也不动了.启动画面始终停留在Loading workbench状态.反复重启,状态依旧. 多数情况下,应该是非正常 ...

随机推荐

  1. 深入理解Spring AOP中的@EnableAspectJAutoProxy

    本文分享自华为云社区<Spring高手之路20--深入理解@EnableAspectJAutoProxy的力量>,作者: 砖业洋__. 1. 初始调试代码 面向切面编程(AOP)是一种编程 ...

  2. EF Core并发控制

    EF Core并发控制 并发控制概念 并发控制:避免多个用户同时操作资源造成的并发冲突问题. 最好的解决方案:非数据库解决方案 数据库层面的两种策略:悲观.乐观 悲观锁 悲观并发控制一般采用行锁 ,表 ...

  3. Mybatis Plus 3.X版本的insert填充自增id的IdType.ID_WORKER策略源码分析

    总结/朱季谦 某天同事突然问我,你知道Mybatis Plus的insert方法,插入数据后自增id是如何自增的吗? 我愣了一下,脑海里只想到,当在POJO类的id设置一个自增策略后,例如@Table ...

  4. [oeasy]python005_退出游乐场_重启游乐场_系统态shell_应用态_quit

    退出终端_重启游乐场_shell_quit Python 回忆 上次 了解了 python 进入了 python 游乐场   在游乐场 可以做 简单的计算 还可以做 乘方运算   数字特别大之后 游乐 ...

  5. 双指针 & 双向搜索

    双指针 根据人类直觉这个东西需要满足单调性,所以预处理的时候大概率需要排序. 好像常与二分结合使用? 可以用在序列.链表(存储位置)或者树.图上(存储结点). 或者用于其他算法(eg:单调队列.差分) ...

  6. JavaScript实现防抖函数

    什么是防抖?防抖就是避免快速多次点击后执行过多的函数调用,就是本来你点击支付宝支付后不小心在点击一次,导致支付函数被调用了两次,还都执行了,付了两次钱. 防抖函数的思想就是将函数延迟调用,延迟时间内不 ...

  7. Python 按比例获取样本数据或执行任务

    按比例获取样本数据或执行任务 By:授客 QQ:1033553122 开发环境 win 10 python 3.6.5 需求 已知每种分类的样本占比数,及样本总数,需要按比例获取这些分类的样本.比如, ...

  8. Kafka kafka在windows下的安装与配置

    kafka在windows下的安装与配置   By: 授客 QQ:1033553122     1.测试环境.............................................. ...

  9. vue项目 回到顶部功能 定位在头部

    'backBox'是外层容器类名, 根据传入的index,定位在不同的位置 组件: <template> <div class="toTop" @click=&q ...

  10. 全网最适合入门的面向对象编程教程:24 类和对象的 Python 实现-异常的捕获与处理:try/except 语句、文件读写示例、Exception 引用

    全网最适合入门的面向对象编程教程:24 类和对象的 Python 实现-异常的捕获与处理:try/except 语句.文件读写示例.Exception 引用 摘要: 本文主要介绍了在使用 Python ...