线程中窗口问题,求救!!

hamimelon 2005-06-29 03:39:25
1.在线程中怎样创建窗口(比如说一个对话框或视图等)
2.怎样在该线程中映射该创建的窗口的消息?


CAboutDlg *pDlg = NULL;
void ThreadRun()
{
pDlg = new CAboutDlg;
pDlg->DoModal();
// CAboutDlg dlg;
// dlg.DoModal(); 也不行,运行一会就出错
}
DWORD dwid = 0;
HANDLE hThr = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)ThreadRun, this, 0, &dwid);
if (!hThr)
{
return;
}


请各位帮我看看,或贴点代码给我参考啊,多谢!!
...全文
116 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq82016824 2005-07-07
  • 打赏
  • 举报
回复
学习~~
我遇到同样的问题
DentistryDoctor 2005-06-30
  • 打赏
  • 举报
回复
只要你的线程是UI线程可以了,
CWinThread* AfxBeginThread(
CRuntimeClass* pThreadClass,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);


或者是只要在线程中有GetMessage/PeekMessage之类的处理消息队列的函数被调用,你所创建的线程也会成为UI线程。

UI线程可以ON_THREAD_MESSAGE映射线程消息,但不能映射窗口消息,窗口消息只能由窗口类来映射,或者你处理消息队列

另外,这样创建的窗口,其指针(CWnd*或者是其派生类指针),不能跨线程使用。
hamimelon 2005-06-30
  • 打赏
  • 举报
回复
多谢,可是我想知道怎样在线程中创建窗口啊?
he_sl 2005-06-30
  • 打赏
  • 举报
回复
学习
AntonlioX 2005-06-30
  • 打赏
  • 举报
回复
mark
surstar 2005-06-30
  • 打赏
  • 举报
回复
AfxBeginThread(RUNTIMECLASS(MyThread)) //UI线程
dfyang 2005-06-30
  • 打赏
  • 举报
回复
UINT ThreadRun(LPVOID pParam)
{
pDlg = new CAboutDlg;
pDlg->DoModal();
// CAboutDlg dlg;
// dlg.DoModal(); 也不行,运行一会就出错
return 0;
}
idAnts 2005-06-30
  • 打赏
  • 举报
回复
线程里这样写就可以:
HWND hwnd = CreateDialog(AfxGetInstanceHandle(),
(LPCSTR)IDD_ABOUTBOX,NULL,
(DLGPROC)DialogProc);
ShowWindow(hwnd,SW_SHOW);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

当然了,你要提供一个回调的DialogProc函数。
idAnts 2005-06-29
  • 打赏
  • 举报
回复
这个是因为CDialog不是一个线程安全类!是不能这样访问的!
你应当把窗口句柄给过去,让线程发消息给窗口自己来处理。
细节http://tech.99soft.net/h/2004-4-1/106941.htm

15,471

社区成员

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

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