工作线程中弹出带Doc/View的窗口





关键词:MFC 多线程,弹出窗口,Doc/View,自定义消息


 


一、问题提出


 


不是弹出对话框,是那种带框架(FrameWnd)的支持Doc-View并且有自己独立菜单、工具条状态条的看起来像一个独立进程的窗口。


 


按正常的创建弹出窗口流程,遇到了创建窗口返回 NULL,窗口无法创建。跟踪到


CWinThread*pThread = AfxGetThread();


无法取得线程指针(在工作线程中无法得到,在UI线程中是不是可以?副组长未曾试验)。导致无法创建弹出窗口。


 


二、解决办法


 


在子线程中发送一个用户自定义消息到主线程,让主线程创建窗口,窗口指针/句柄传给线程使用。


 


三、实现过程:


  1. 准备工作

     

    添加资源。在菜单、工具条等需要的部分分别中添加IDIDR_NEWFRAM的资源。可以参考IDR_MAINFRAME

     

    创建框架类,从CFrameWnd类派生(如class CUserFrameWnd : public CFrameWnd)。如果需要初始化工具条和状态条,建立消息响应函数OnCreate(),在里面做初始化工作。

     

    创建2个新类,一个Doc类,从CDocment类派生,一个View类,从你需要的类(如CScrollView类)派生。

     

  2. 在子线程中向主框架发送请求创建弹出窗口的消息

     

    ::SendMessage(theApp.m_pMainFrame->GetSafeHwnd(),UM_CREATE_USER_FRAMEWND,nViewType,(LPARAM)name);

    1个参数是消息目的地窗口句柄,通常AfxGetMainWnd()->GetSafeHwnd(),子线程中可能无法成功,使用全局theApp(副组长个人观点)。第2个参数是自定义消息。后两个分别是窗口类型(EditViewScrollView等)和窗口名称。

     

  3. 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);

           …

    }

     

  4. 建立多个窗口时的管理、销毁

     

    四、存在问题

     

    ScrollView类动态创建时不自动执行OnInitialUpdate()!!!为什么?

    添加重载函数PreCreateWindow(CREATESTRUCT&cs),在里面

    CSizesizeTotal;

    sizeTotal.cx= sizeTotal.cy = 100;

    SetScrollSizes(MM_TEXT,sizeTotal);

    主要是需要这个MM_TEXT或其它





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值