在线程中运行一个对话框,如何实现其消息循环

Flood1984 2009-09-11 02:43:05
这是一个新线程。
想实现:在线程中运行一个对话框。当对话框关闭时,线程退出。
在运行期间,这个对话框应该能响应输入输出消息。
UINT CPDLG_Thread(LPVOID para)
{
MSG msg;

//新创建对话框
g_cpDlg = new CConnectProcessDlg();
if(g_cpDlg == NULL)
{
goto end ;
}

//初始化
if( !g_cpDlg->Create(IDD_DIALOG_CONNECT_PROCESS) )
{
goto end ;
}
g_cpDlg->InitData();
g_cpDlg->ShowWindow(SW_SHOW);
g_cpDlg->CenterWindow( (CWnd*)para );

//以下想实现:在对话框关闭前,在本线程中响应对话框的所有消息,在对话框销毁时退出线程。
while (GetMessage(&msg,NULL, NULL, NULL ))//处理自己的消息循环
{//这个地方好像不能接收到本对话框的所有消息,为什么?
if(msg.message == WM_DESTROY)
{//经测试:程序执行不到这个地方。SendMessage(WM_DESTROY,0,0)也得不到。
g_cpDlg->DestoryWindow();
break ;
}
TranslateMessage( &msg );
DispatchMessage( &msg );
}

end:
if(g_cpDlg)
{
delete g_cpDlg;
g_cpDlg = NULL ;
}
return 0;
}
...全文
414 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
g15896894 2009-09-11
  • 打赏
  • 举报
回复
楼主试试这样是可以的。

#include <Windows.h>
#include <tchar.h>
#include <stdio.h>

HINSTANCE hins;

LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);

DWORD WINAPI Thread1(LPVOID lparam)
{
WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_CROSS);
wndclass.hIcon=LoadIcon(NULL,IDI_WINLOGO);
wndclass.hInstance= hins;
wndclass.lpfnWndProc=WinSunProc;
wndclass.lpszClassName="Weixin";
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
RegisterClass(&wndclass);

HWND hwnd;
hwnd=CreateWindow("Weixin","北京维新科学技术培训中心",WS_OVERLAPPEDWINDOW,
225,160,600,400,NULL,NULL,hins,NULL);

::ShowWindow(hwnd,SW_SHOWNORMAL);
::UpdateWindow(hwnd);

MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}

LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg)
{
case WM_CHAR:
char szChar[20];
sprintf(szChar,"char is %d",wParam);
MessageBox(hwnd,szChar,"weixin",0);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,255,50,"维新培训",strlen("维新培训"));
EndPaint(hwnd,&ps);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"Left Button Clicked","weixin",0);
HDC hdc1;
hdc1=GetDC(hwnd);
TextOut(hdc1,225,100,"计算机编程语言培训",strlen("计算机编程语言培训"));
ReleaseDC(hwnd,hdc1);
break;
case WM_RBUTTONDOWN:
MessageBox(hwnd,"Right Button Clicked","weixin",0);
HDC hdc2;
hdc2=GetDC(hwnd);
TextOut(hdc2,225,150,"计算机编程语言培训",strlen("计算机编程语言培训"));
ReleaseDC(hwnd,hdc2);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}

int WINAPI _tWinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
hins = hInstance;
HANDLE h = ::CreateThread(NULL, 0, Thread1, NULL, 0, 0);
WaitForSingleObject(h, INFINITE);
return 0;
}

ProgrammerNO1 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zyq5945 的回复:]
LZ要是真想在线程中创建窗口可以这样创建.
感觉LZ是不是没明白模态和非模态对话框,非模态对话框与模态对话框不同,非模态对话框不垄断用户的输入,用户打开非模态对话框后,仍然可以与其它界面进行交互。
C/C++ code
LRESULT CALLBACK WinSunProc(
HWND hwnd,// handle to window UINT uMsg,// message identifier WPARAM wParam,// first message parameter LPARAM lParam// second message parameter);


这显然就是孙鑫的例子啊,移植

DWORD C*Dlgr::Thread1(LPVOID lparam)
{
WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_CROSS);
wndclass.hIcon=LoadIcon(NULL,IDI_WINLOGO);
wndclass.hInstance=AfxGetInstanceHandle();
wndclass.lpfnWndProc=WinSunProc;
wndclass.lpszClassName="Weixin";
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
RegisterClass(&wndclass);

HWND hwnd;
hwnd=CreateWindow("Weixin","北京维新科学技术培训中心",WS_OVERLAPPEDWINDOW,225,160,600,400,NULL,NULL,AfxGetInstanceHandle(),NULL);

::ShowWindow(hwnd,SW_SHOWNORMAL);
::UpdateWindow(hwnd);

MSG msg;while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
AfxMessageBox("tc");return0;
}

LRESULT CALLBACK WinSunProc(
HWND hwnd,// handle to window UINT uMsg,// message identifier WPARAM wParam,// first message parameter LPARAM lParam// second message parameter )
{switch(uMsg)
{case WM_CHAR:char szChar[20];
sprintf(szChar,"char is %d",wParam);
MessageBox(hwnd,szChar,"weixin",0);break;case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,255,50,"维新培训",strlen("维新培训"));
EndPaint(hwnd,&ps);break;case WM_LBUTTONDOWN:
MessageBox(hwnd,"Left Button Clicked","weixin",0);
HDC hdc1;
hdc1=GetDC(hwnd);
TextOut(hdc1,225,100,"计算机编程语言培训",strlen("计算机编程语言培训"));
ReleaseDC(hwnd,hdc1);break;case WM_RBUTTONDOWN:
MessageBox(hwnd,"Right Button Clicked","weixin",0);
HDC hdc2;
hdc2=GetDC(hwnd);
TextOut(hdc2,225,150,"计算机编程语言培训",strlen("计算机编程语言培训"));
ReleaseDC(hwnd,hdc2);break;case WM_CLOSE:if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO))
{
DestroyWindow(hwnd);
}break;case WM_DESTROY:
PostQuitMessage(0);break;default:return DefWindowProc(hwnd,uMsg,wParam,lParam);
}return0;
}
[/Quote]
zyq5945 2009-09-11
  • 打赏
  • 举报
回复
LZ要是真想在线程中创建窗口可以这样创建.
感觉LZ是不是没明白模态和非模态对话框,非模态对话框与模态对话框不同,非模态对话框不垄断用户的输入,用户打开非模态对话框后,仍然可以与其它界面进行交互。

LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);

DWORD C*Dlgr::Thread1(LPVOID lparam)
{
WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_CROSS);
wndclass.hIcon=LoadIcon(NULL,IDI_WINLOGO);
wndclass.hInstance=AfxGetInstanceHandle();
wndclass.lpfnWndProc=WinSunProc;
wndclass.lpszClassName="Weixin";
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
RegisterClass(&wndclass);

HWND hwnd;
hwnd=CreateWindow("Weixin","北京维新科学技术培训中心",WS_OVERLAPPEDWINDOW,
225,160,600,400,NULL,NULL,AfxGetInstanceHandle(),NULL);

::ShowWindow(hwnd,SW_SHOWNORMAL);
::UpdateWindow(hwnd);

MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
AfxMessageBox("tc");
return 0;
}

LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg)
{
case WM_CHAR:
char szChar[20];
sprintf(szChar,"char is %d",wParam);
MessageBox(hwnd,szChar,"weixin",0);
break;
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,255,50,"维新培训",strlen("维新培训"));
EndPaint(hwnd,&ps);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd,"Left Button Clicked","weixin",0);
HDC hdc1;
hdc1=GetDC(hwnd);
TextOut(hdc1,225,100,"计算机编程语言培训",strlen("计算机编程语言培训"));
ReleaseDC(hwnd,hdc1);
break;
case WM_RBUTTONDOWN:
MessageBox(hwnd,"Right Button Clicked","weixin",0);
HDC hdc2;
hdc2=GetDC(hwnd);
TextOut(hdc2,225,150,"计算机编程语言培训",strlen("计算机编程语言培训"));
ReleaseDC(hwnd,hdc2);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
jameshooo 2009-09-11
  • 打赏
  • 举报
回复
直接调用模式对话框即可,无需消息循环
CConnectProcessDlg dlg;
dlg.DoModal();
return 0;
xwsn007 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 flood1984 的回复:]
每个对话框单独有一个自己线程吗?好像不是,父对话框和子对话框会在同一个线程中运行。
父对话框运行一个长任务时,会导致子对话框也不能响应WM_消息。
为了用子对话框来显示父对话框长任务的进度,所以我新开了一个线程。
[/Quote]

你开的是工作线程,不带界面的,所以没有自己的消息队列,真的不行,就算在里面创建一个窗口也不行。
线程有两种:工作者线程和有界面的UI线程。只有UI线程才有消息队列,响应外界的操作。程序的主线程就是一个UI线程
dirdirdir3 2009-09-11
  • 打赏
  • 举报
回复
直接用有界面的thread不就是了,不需要自己搞吧。CWinThread...........
http://www.vckbase.com/document/viewdoc/?id=1706
Flood1984 2009-09-11
  • 打赏
  • 举报
回复
每个对话框单独有一个自己线程吗?好像不是,父对话框和子对话框会在同一个线程中运行。
父对话框运行一个长任务时,会导致子对话框也不能响应WM_消息。
为了用子对话框来显示父对话框长任务的进度,所以我新开了一个线程。
xwsn007 2009-09-11
  • 打赏
  • 举报
回复
起个UI线程,楼主用的是工作者线程
feilinhe 2009-09-11
  • 打赏
  • 举报
回复
线程不该这么使用,LZ只是创建与显示一个对话框,没必要用线程的
zyq5945 2009-09-11
  • 打赏
  • 举报
回复
MFC对话框自己有消息循环线程,想要这个线程收到消息用PostThreadMessage在子对话框销毁的时候给它发消息,
干吗要创建个线程呢,直接在父对话框中响应个函数创建就可以了吧.

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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