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

消息处理就不用返回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. 在C#中进行单元测试

    单元测试 前言 时隔多个月,终于抽空学习了点新知识,那么这次来记录一下C#怎么进行单元测试,单元测试是做什么的. 我相信大部分刚毕业的都很疑惑单元测试是干什么的?在小厂实习了6个月后,我发现每天除了写 ...

  2. I2S 总线学习:1-有关概念

    背景 I2S总线 是一种常见的总线,也是需要掌握的. 概念 I2S(Inter-IC Sound)总线, 又称 集成电路内置音频总线,是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准, ...

  3. [FLET] 01 可以拖动的方块

    from typing import List import flet from flet import ( Container, Draggable, DragTarget, Page, Row, ...

  4. windows server + iis 部署若伊前端vue项目

    一.背景说明 工作原因,一直使用若伊前后端分离版框架进行二次开发.客户的服务器多数为windows server系统,少部分为linux系统.过去一直是使用nginx进行前端的部署,nginx的代理功 ...

  5. 如何应对红帽不再维护 CentOS

    CentOS(Community Enterprise Operating System,社区企业操作系统)是一种开源的.免费的操作系统.由 Lance Davis 发起,通过社区驱动,目标是创建一个 ...

  6. KubeCube 用户管理与身份认证

    前言 KubeCube (https://kubecube.io) 是由网易数帆近期开源的一个轻量化的企业级容器平台,为企业提供 kubernetes 资源可视化管理以及统一的多集群多租户管理功能.K ...

  7. js 异步 任务 题目解析(chatgpt bug了?)

    最近遇到一道题如下,求输出结果 感觉还是蛮有意思的,找chatgpt做了一下 我是题 async function async1(){ console.log('1'); await async2() ...

  8. C语言基础要点

    C语言基础 C语言基础 C程序编译过程 C程序编译步骤 汇编语言 32关键字 数据类型 常量 size程序 类型限定 goto语句 指针 指针和字符串 作用域 函数 内存 进程内存结构 可执行文件结构 ...

  9. Vue 基于vue-codemirror实现的代码编辑器

    基于vue-codemirror实现的代码编辑器 开发环境 jshint 2.11.1 jsonlint 1.6.3 script-loader 0.7.2 vue 2.6.11 vue-codemi ...

  10. ABC362

    A link 判断即可... 点击查看代码 #include<bits/stdc++.h> using namespace std; int r,g,b; string c; signed ...