您的位置:首页 > 其它

工作线程中弹出带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或其它…
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐