工作线程中弹出带Doc/View的窗口
2014-04-03 09:37
218 查看
关键词:MFC 多线程,弹出窗口,Doc/View,自定义消息
一、问题提出
不是弹出对话框,是那种带框架(FrameWnd)的支持Doc-View并且有自己独立菜单、工具条状态条的看起来像一个独立进程的窗口。
按正常的创建弹出窗口流程,遇到了创建窗口返回 NULL,窗口无法创建。跟踪到
CWinThread*pThread = AfxGetThread();
无法取得线程指针(在工作线程中无法得到,在UI线程中是不是可以?副组长未曾试验)。导致无法创建弹出窗口。
二、解决办法
在子线程中发送一个用户自定义消息到主线程,让主线程创建窗口,窗口指针/句柄传给线程使用。
三、实现过程:
准备工作
添加资源。在菜单、工具条等需要的部分分别中添加ID为IDR_NEWFRAM的资源。可以参考IDR_MAINFRAME。
创建框架类,从CFrameWnd类派生(如class CUserFrameWnd : public CFrameWnd)。如果需要初始化工具条和状态条,建立消息响应函数OnCreate(),在里面做初始化工作。
创建2个新类,一个Doc类,从CDocment类派生,一个View类,从你需要的类(如CScrollView类)派生。
在子线程中向主框架发送请求创建弹出窗口的消息
::SendMessage(theApp.m_pMainFrame->GetSafeHwnd(),UM_CREATE_USER_FRAMEWND,nViewType,(LPARAM)name);
第1个参数是消息目的地窗口句柄,通常AfxGetMainWnd()->GetSafeHwnd(),子线程中可能无法成功,使用全局theApp(副组长个人观点)。第2个参数是自定义消息。后两个分别是窗口类型(EditView、ScrollView等)和窗口名称。
在CMainFrame类添加消息影射、写消息响应函数
ON_MESSAGE(UM_CREATE_USER_FRAMEWND,OnCreateUserFrameWnd)
写消息响应函数,在这个函数中创建弹出窗口
LRESULTCMainFrame::OnCreateUserFrameWnd(WPARAM wParam, LPARAM lParam)
{
…
//这里只是ScrollView的一个例子
CUserFrameWnd* pFrame = newCUserFrameWnd;
CCreateContext Context;
CUserScrollDoc* pMsgsManagerDoc = newCUserScrollDoc;
Context.m_pCurrentDoc = pMsgsManagerDoc ;
Context.m_pNewViewClass =RUNTIME_CLASS(CUserScrollView);
pFrame->LoadFrame(IDR_NEWFRAME,WS_OVERLAPPEDWINDOW| FWS_ADDTOTITLE,NULL, &Context );
pFrame->ShowWindow(TRUE);
pFrame->SetWindowText((LPSTR) lParam);
…
}
建立多个窗口时的管理、销毁
…
四、存在问题
ScrollView类动态创建时不自动执行OnInitialUpdate()!!!为什么?
添加重载函数PreCreateWindow(CREATESTRUCT&cs),在里面
CSizesizeTotal;
sizeTotal.cx= sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT,sizeTotal);
主要是需要这个MM_TEXT或其它…
关键词:MFC 多线程,弹出窗口,Doc/View,自定义消息
一、问题提出
不是弹出对话框,是那种带框架(FrameWnd)的支持Doc-View并且有自己独立菜单、工具条状态条的看起来像一个独立进程的窗口。
按正常的创建弹出窗口流程,遇到了创建窗口返回 NULL,窗口无法创建。跟踪到
CWinThread*pThread = AfxGetThread();
无法取得线程指针(在工作线程中无法得到,在UI线程中是不是可以?副组长未曾试验)。导致无法创建弹出窗口。
二、解决办法
在子线程中发送一个用户自定义消息到主线程,让主线程创建窗口,窗口指针/句柄传给线程使用。
三、实现过程:
准备工作
添加资源。在菜单、工具条等需要的部分分别中添加ID为IDR_NEWFRAM的资源。可以参考IDR_MAINFRAME。
创建框架类,从CFrameWnd类派生(如class CUserFrameWnd : public CFrameWnd)。如果需要初始化工具条和状态条,建立消息响应函数OnCreate(),在里面做初始化工作。
创建2个新类,一个Doc类,从CDocment类派生,一个View类,从你需要的类(如CScrollView类)派生。
在子线程中向主框架发送请求创建弹出窗口的消息
::SendMessage(theApp.m_pMainFrame->GetSafeHwnd(),UM_CREATE_USER_FRAMEWND,nViewType,(LPARAM)name);
第1个参数是消息目的地窗口句柄,通常AfxGetMainWnd()->GetSafeHwnd(),子线程中可能无法成功,使用全局theApp(副组长个人观点)。第2个参数是自定义消息。后两个分别是窗口类型(EditView、ScrollView等)和窗口名称。
在CMainFrame类添加消息影射、写消息响应函数
ON_MESSAGE(UM_CREATE_USER_FRAMEWND,OnCreateUserFrameWnd)
写消息响应函数,在这个函数中创建弹出窗口
LRESULTCMainFrame::OnCreateUserFrameWnd(WPARAM wParam, LPARAM lParam)
{
…
//这里只是ScrollView的一个例子
CUserFrameWnd* pFrame = newCUserFrameWnd;
CCreateContext Context;
CUserScrollDoc* pMsgsManagerDoc = newCUserScrollDoc;
Context.m_pCurrentDoc = pMsgsManagerDoc ;
Context.m_pNewViewClass =RUNTIME_CLASS(CUserScrollView);
pFrame->LoadFrame(IDR_NEWFRAME,WS_OVERLAPPEDWINDOW| FWS_ADDTOTITLE,NULL, &Context );
pFrame->ShowWindow(TRUE);
pFrame->SetWindowText((LPSTR) lParam);
…
}
建立多个窗口时的管理、销毁
…
四、存在问题
ScrollView类动态创建时不自动执行OnInitialUpdate()!!!为什么?
添加重载函数PreCreateWindow(CREATESTRUCT&cs),在里面
CSizesizeTotal;
sizeTotal.cx= sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT,sizeTotal);
主要是需要这个MM_TEXT或其它…
相关文章推荐
- 略谈如何从工作线程中弹出对话框
- 在工作线程中处理UI线程报错:Only the original thread that created a view hierarchy can touch its views.
- 在MFC中从一个线程工作函数中向窗口发送消息(this指针的妙用)
- 在工作线程中处理UI线程报错:Only the original thread that created a view hierarchy can touch its views.
- 工作线程中调用UI线程创建的窗口的UpdateData会导致Assert的问题及解决办法
- android.view.ViewRootImpl$CalledFromWrongThreadException: UI线程和子线程(工作线程)冲突
- detailview按钮列 点击弹出窗口中使用datagrid
- 如何在工作线程中创建窗口?
- 【转】如何在工作线程中创建窗口?
- 工作线程中调用UI线程创建的窗口的UpdateData会导致Assert的问题及解决办法.
- 主窗口退出时等待工作线程退出
- 工作线程中弹出对话框
- 工作中碰到的一些东西【弹出窗口】【拖放】【异步文件上传】
- 在MFC中从一个线程工作函数中向窗口发送消息(this指针的妙用) .
- 非主线程创建窗口也能工作正常,只要我们注意一点:消息循环必须要和创建窗口在同一线程!
- 在MFC中从一个线程工作函数中向窗口发送消息(this指针的妙用)
- 工作中碰到的一些东西【弹出窗口】【拖放】【异步文件上传】
- 如何在工作线程中创建窗口?
- WebView点击加载的页面中的按钮时不弹出新窗口以及在加载后执行javascript
- 窗口和线程漫谈之工作线程如何将数据的处理结果显示到窗口