关于非模态对话框

VirtualRookit 2010-01-29 11:50:16
//帮看下错在哪,运行时整个对话框界面呈现未响应状态
#include <windows.h>
#include <iostream>
#include "resource.h"
using namespace std;
INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
void ShowError();
void main()
{
HWND hwnd;
//要设置Visible属性TRUE
hwnd = ::CreateDialog(::GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);
if (hwnd == NULL)
{
ShowError();
}
system("pause");
}

void Dlg_OnCommand(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
{
cout << "WM_COMMAND" << endl;
}

INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
//对话框整个创建及显示过程都没有产生该消息
case WM_CREATE: cout << "WM_CREATE" << endl; break;

//对话框初始化时发送一个该消息
case WM_INITDIALOG: cout << "WM_INITDIALOG" << endl; break;

//关闭按钮发送一个,任务栏"关闭窗口"时发送一个,任务管理器结束窗口发送两个该消息
case WM_CLOSE:
cout << "WM_CLOSE" << endl;
EndDialog(hwndDlg, 0xff);//用于结构模态对话框,并设置DialogBox()返回值
break;

//此消息在对话框摧毁时发送,例如调用EndDialog()后发送
case WM_DESTROY: cout << "WM_DESTROY" << endl; break;

//控件消息,包括右上角的最大,最小,关闭三个按钮,当按关闭按钮调用EndDialog()有时就没再发送WM_COMMAND
case WM_COMMAND: Dlg_OnCommand(hwndDlg, uMsg, wParam, lParam); break;

//其它WM_KEYDOWN/UP, WM_LBUTTONDOWN/UP....
default: break;
}

return FALSE; //这里肯定要返回 FALSE
}

void ShowError()
{
LPTSTR lpMsgBuf;
::FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
::GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,
0,
NULL);
::MessageBox(NULL, lpMsgBuf, NULL, MB_OK | MB_ICONSTOP);
::LocalFree(lpMsgBuf);//释放操作系统开辟的缓冲区地址
}
...全文
106 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hzy694358 2010-01-29
  • 打赏
  • 举报
回复
没消息泵
wltg2001 2010-01-29
  • 打赏
  • 举报
回复
将main加一个消息循环,改成这样:
void main()
{
MSG msg;
HWND hwnd;
//要设置Visible属性TRUE
hwnd = ::CreateDialog(::GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);
if (hwnd == NULL)
{
ShowError();
}
while(GetMessage(&msg,NULL,NULL,NULL))
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);

}
system("pause");
}
凤朝凰 2010-01-29
  • 打赏
  • 举报
回复
哪个界面不响应?你是怎么看到消息的?跟踪进去看看呢
精锐掷矛手 2010-01-29
  • 打赏
  • 举报
回复
是否无消息循环?
船过水无痕 2010-01-29
  • 打赏
  • 举报
回复
应该是没更新
VirtualRookit 2010-01-29
  • 打赏
  • 举报
回复
确实是没消息泵,以前都是以DialogBox()创建的模态都不用自已设置消息泵,所以创建非模时也没添加消息泵就出错了,如四楼所添加代码即可,谢谢各位

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧