注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

生命无非记忆

不要在记忆中丢失了自己

 
 
 

日志

 
 

关于MFC隐藏的方法  

2009-12-16 16:26:58|  分类: c/c++/MFC |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
作业的一个程序要用到隐藏窗口。虽然个人很想编程命令行下的。但是没办法。。找了找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();
}
  评论这张
 
阅读(249)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017