关于MFC窗口隐藏的方法

很多时候我们需要做一些后台的服务程序,这时我们就不需要弹出程序的窗口,因此便需要隐藏程序的窗口,以下就是一些我从网上或者其它途径获取的隐藏程序窗口的方法,一般的MFC应用程序有基于对话框的,单文档和多文档,而单文档和多文档的方法是一样的,所以这里只以单文档为例:


1.隐藏基于对话框的MFC应用程序窗口的方法   (推荐这个方法,非常好用)


很多人可能会将窗口创建出来,然后用一个ShowWindow(SW_HIDE)的方法去隐藏窗口,当然这是可以做到隐藏的功能,但是有一点不足的地方就是窗口在隐藏之前会有一下短瞬的闪烁,而以下这种方法可以解决这种问题:


在C***App::InitInstance()的函数中将以下的这一段注释掉:


C***Dlg dlg;


m_pMainWnd = &dlg;


int nResponse = dlg.DoModal();


if (nResponse == IDOK)


{


  // TODO: Place code here to handle when the dialog is


  //  dismissed with OK


}


else if (nResponse == IDCANCEL)


{


  // TODO: Place code here to handle when the dialog is


  //  dismissed with Cancel


}


// Since the dialog has been closed, return FALSE so that we exit the


//  application, rather than start the application's message pump.


return FALSE;


换成:


C***Dlg *dlg = new C***Dlg;


m_pMainWnd = dlg;


return dlg->Create(IDD_***_DIALOG);


同时将IDD_***_DIALOG的对话框资源的"More Stytles"属性页的Visible属性的勾去掉即可.


这是我认为最简单的一种方法,还有另外一种方法,就是在工作区的资源菜单中插入一个新的对话框,然后用ClassWizard新建一个与之对应的类, 而下面


C***Dlg *dlg = new C***Dlg;


m_pMainWnd = dlg;


return dlg->Create(IDD_***_DIALOG);


这里的C***Dlg和IDD_***_DIALOG改为与你新建的对话框的对应即可,方法的原理与上面的一样,只是麻烦了一点点而已.


2.隐藏基于单文档的MFC应用程序窗口的方法


1) 最简单的方法是从网上的找到的:


"CMainFrame::ActiveFrame()  


  {  


              nCmdShow=   SW_HIDE;  


              CFrameWnd::ActivateFrame(nCmdShow);  


  }  


  C??App::Initstance()  


  {  


          m_pMainWnd->ShowWindow(SW_HIDE);  


          //UpdateWindow();  


    


  }  


    


  因为   MFC   有两个步骤来显示   SDI   主窗口,   所有必须在这两个地方都   SW_HIDE,   否则就会闪动.  


    


  即便   HWND   没有   WS_VISIBLE   属性,   用ShowWindow(SW_SHOW)   还是可以显示该   HWND   的.   所以vcbear的方法有问题.   "


这里的ActiveFrame函数可以在ClassWizard中添加.


2)第二种方法则相对繁琐得多


第一步,将CMainFrame的构造函数改为public属性(默认是protected的)


第二步,将C***App::InitInstance()里面的下面代码注释掉:


CSingleDocTemplate* pDocTemplate;


pDocTemplate = new CSingleDocTemplate(


  IDR_MAINFRAME,


  RUNTIME_CLASS(CTestHideDoc),


  RUNTIME_CLASS(CMainFrame),       // main SDI frame window


  RUNTIME_CLASS(CTestHideView));


AddDocTemplate(pDocTemplate);


// Parse command line for standard shell commands, DDE, file open


CCommandLineInfo cmdInfo;


ParseCommandLine(cmdInfo);


// Dispatch commands specified on the command line


if (!ProcessShellCommand(cmdInfo))


  return FALSE;


// The one and only window has been initialized, so show and update it.


m_pMainWnd->ShowWindow(SW_SHOW);


m_pMainWnd->UpdateWindow();


换成以下的代码:


m_pMainWnd = new CMainFrame();


BOOL bRet = ((CMainFrame *)m_pMainWnd)->LoadFrame(IDR_MAINFRAME);


if (bRet)


{


  m_pMainWnd->UpdateWindow();


}


else


{


  if (m_pMainWnd)


  {


   delete m_pMainWnd;


   m_pMainWnd = NULL;


  }


}


这样子编绎出来的程序运行时便不会有主窗口.


纵观上面的隐藏窗口的方法,除了使用ShowWIndow(SW_HIDE)的方法之外,其实都是将程序中m_pMainWnd指针换一下面目,原来是正常显示的,就改为不显示,或者用其它的对话框或者自身新建一个不同类别的框架指针.


我一开始的疑惑是既然C***App会有自已的线程和消息循环机制,那么为什么还必要要这么一个框架类CMainFrame作为它的支撑呢?后来查了一下源码发现在C***App类的Run()函数里面有这么一段(关于Run函数这里不做详细讲解,有兴趣可以去查看"深入浅出MFC"):


int CWinApp::Run()


{


if (m_pMainWnd == NULL && AfxOleGetUserCtrl())


{


  // Not launched /Embedding or /Automation, but has no main window!


  TRACE0("Warning: m_pMainWnd is NULL in CWinApp::Run - quitting application.\n");


  AfxPostQuitMessage(0);


}


return CWinThread::Run();


}


呵呵,原来只要m_pMainWnd不为NULL, 则主线程就可以转起来.至此,所有的问题就迎刃而解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值