怎么样让基于对话框的应用有消息偱环? ?什么意思啊?基于对话框的应用本来就有消息循环啊,任何windows的程序都有消息循环吧 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);About为处理消息偱环的函数:LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){ switch (message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return TRUE; } break; } return FALSE;} 你是不是說不用DoModal呀, 你用DoModal就一定無Message Loop(在你的程序中沒有, 但實際上有), 但如果Message Loop由你實現的話, 就要用dlg.Create(...)來建立對話框, 用dlg.ShowWindow(...), dlg.UpdateWindow()來顯示對話框, 最後加入MSG msg;while (GetMessage(....)){ TranslateMessage(&msg); DispatchMessage(&msg);} http://www.csdn.net/expert/TopicView.asp?id=436746 在WINPROC函数中自已使用一个消息循环进行处理。 是这样的,用应用向导建立的对话框应用程序。我想让它在无消息时做些事情,重载了应用类的Run(),在这里面建立了一个消息循环。并且修改对话框创建代码,把DoModal改成 Create 后返回一个true;BOOL CCDXTestApp::InitInstance(){....... CCDXTestDlg dlg; m_pMainWnd = &dlg; dlg.Create(CCDXTestDlg::IDD,NULL); dlg.ShowWindow(m_nCmdShow); dlg.UpdateWindow(); return true;}int CCDXTestApp::Run() { // TODO: Add your specialized code here and/or call the base class CCDXTestDlg* pDlg=(CCDXTestDlg*)AfxGetMainWnd(); for(;;) { if(::PeekMessage(&m_msgCur,NULL,NULL,NULL,PM_NOREMOVE)) { if(!PumpMessage()) return ExitInstance(); } else pDlg->UpDisp(); } ASSERT(false); return CWinApp::Run();} 奇怪的是对话框闪了一下就没了,这个消息循环只收到一个WM_QUIT消息。 呵呵,这个问题我来告诉你如何解决,我以前也碰到过的,这个和消息循环没有任何关系,因为你创建的是一个非模态对话框,你必须创建一个全局变量或用new去创建一个指向对话框的指针,你用局部变量当然不行,退出局部函数的作用域,他就会释放,所以一闪就没有了,呵呵,试试,别忘了给分。CCDXTestDlg dlg;BOOL CCDXTestApp::InitInstance(){.......m_pMainWnd = &dlg;dlg.Create(CCDXTestDlg::IDD,NULL);dlg.ShowWindow(m_nCmdShow);dlg.UpdateWindow();return true;} 单线程 延时问题 DLL转换LIB后调用失败,寻找新的出路 下载的ftp客服端程序如何使用?? 结构体数据的二进制读取 在vc下,我想把从sqlserver数据库里的数据,按照一定的格式输出到word中,我该怎么办?在线等,多谢帮忙。 怎么制作安装程序?急………… 请问MessageBox的一个问题 “关于activeX在Web中应用的问题”我是新手,请各位大虾帮忙。 我想把Edit Box的背景变成黑色,文字颜色变成白色,怎么做? 如何让MFC对话框一运行立马最小化 得到按钮的指针,如何向它发消息,让它按下? 怎么样让基于对话框的应用有消息偱环
About为处理消息偱环的函数:
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE; case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
MSG msg;
while (GetMessage(....))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
我想让它在无消息时做些事情,重载了应用类的Run(),在这里面建立了一个消息循环。
并且修改对话框创建代码,把DoModal改成 Create 后返回一个true;
BOOL CCDXTestApp::InitInstance()
{
....... CCDXTestDlg dlg;
m_pMainWnd = &dlg;
dlg.Create(CCDXTestDlg::IDD,NULL);
dlg.ShowWindow(m_nCmdShow);
dlg.UpdateWindow();
return true;}
int CCDXTestApp::Run()
{
// TODO: Add your specialized code here and/or call the base class
CCDXTestDlg* pDlg=(CCDXTestDlg*)AfxGetMainWnd();
for(;;)
{
if(::PeekMessage(&m_msgCur,NULL,NULL,NULL,PM_NOREMOVE))
{
if(!PumpMessage())
return ExitInstance();
}
else
pDlg->UpDisp();
}
ASSERT(false);
return CWinApp::Run();
}
我以前也碰到过的,这个和消息循环没有任何关系,因为你创建的是一个非模态对话框,你必须创建一个全局变量或用new去创建一个指向对话框的指针,你用局部变量当然不行,退出局部函数的作用域,他就会释放,所以一闪就没有了,呵呵,试试,别忘了给分。CCDXTestDlg dlg;BOOL CCDXTestApp::InitInstance()
{
.......
m_pMainWnd = &dlg;
dlg.Create(CCDXTestDlg::IDD,NULL);
dlg.ShowWindow(m_nCmdShow);
dlg.UpdateWindow();
return true;}