最近做的一个项目要用到隐藏窗口。个人很想编程命令行下的。但是没办法。。不会,找了找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, 则主线程就可以转起来.至此,所有的问题就迎刃而解.

推荐您有关于“”的文章

关于MFC窗口隐藏的方法相关推荐

  1. 检测浏览器最小化或窗口隐藏的方法

    检测浏览器窗口最小化的两种方法: 1.利用window的属性 function isMinStatus() { var isMin = false; if (window.outerWidth != ...

  2. PowerShell隐藏不显示窗口的多种方法

    转载 https://www.jb51.net/article/68186.htm 隐藏不显示窗口的多种方法这篇文章主要介绍了PowerShell隐藏不显示窗口的多种方法,本文讲解了启动PowerSh ...

  3. python 隐藏进程_python在windows下创建隐藏窗口子进程的方法

    python在windows下创建隐藏窗口子进程的方法 发布于 2015-11-08 20:56:53 | 213 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一 ...

  4. MFC OpenCV:刷新图片以及防止窗口抖动的方法

    MFC OpenCV:刷新图片以及防止窗口抖动的方法 一.背景 二.刷新方法 2.1 先使PictrueContral控件不可见,后使其重新可见 2.2 填充与MFC图像窗口背景相同的颜色 2.3 填 ...

  5. 不小心把VisualStudio的解决方案资源管理器和输出等窗口隐藏了,找不到的话,可以用以下的解决方法

    不小心把VisualStudio的解决方案资源管理器和输出等窗口隐藏了,找不到的话,可以用以下的解决方法 前言 不小心把VisualStudio的解决方案资源管理器和输出等窗口隐藏了,找了好久找不到, ...

  6. c语言mfc窗口跳到下个窗口,MFC停靠窗口实现(CDockablePane)

    工作中编写MFC界面程序时用到了停靠窗口,为了避免之后用到时再去查询,这里记录下. 步骤 1.定义一个继承自CDockablePane的类 Class CDockableTest : public C ...

  7. html 自动 浏览器窗口,一种html文件实现显示浏览器窗口内容的方法

    一种html文件实现显示浏览器窗口内容的方法 [技术领域] [0001]本发明涉及html领域,特别涉及一种html文件实现显示浏览器窗口内容的方法. [背景技术] [0002]-般的浏览器窗口显示需 ...

  8. MFC 窗口分割与通信

    一.关于CSplitterWnd类 我们在使用CuteFtp或者NetAnt等工具的时候,一般都会被其复杂的界面所吸引,在这些界面中窗口被分割为若干的区域,真正做到了窗口的任意分割. 那么我们自己如何 ...

  9. 关于Mac中窗口隐藏与最小化快捷键的多种用法

    From: http://www.macx.cn/thread-2035603-2-1.html Safari 5.1.2 Mac OS X 10.7.2   首先来说说大家都知道的最基本的两个快捷键 ...

  10. opencv在mfc窗口显示图片

    mfc显示mat图片的两种方式 方式一:将opencv的窗口嵌入到mfc的窗口内 将opencv窗口与mfc窗口绑定之后就可以通过cv::imshow("video",img)显示 ...

最新文章

  1. MySQL的索引特性
  2. ubuntu下面pycharm设置pyspark的配置
  3. 1003 我要通过!(20)(20 分)
  4. Swift中文教程(二十一) 协议
  5. UID 修改 UID 锁死修复
  6. MapReduce 支持的部分数据挖掘算法
  7. Exchange 2010安装各角色先决条件的Powershell
  8. mysql手机客户端_图解MySQL索引--B-Tree(B+Tree)
  9. 打印有向图的强连通分量-----kosaraju算法(最简单的实现)
  10. EAS后台事务的超时时长如何设置?
  11. 图片用Adobe PDF打开后尺寸变大的问题解决
  12. Opencv学习——LSD直线检测
  13. class path resource [springMVC-servlet.xml] cannot be opened because it does not exist
  14. C++常成员函数与普通成员函数访问比较
  15. php文本框添加表情,仿微信在对话框文字中插入Emoji表情包
  16. AMBA总线---APB总线协议
  17. Google的OR-Tools
  18. Qt之QThread(深入理解)
  19. 【状态观测器】全维状态观测器
  20. Android 系统的安全性分析(1)--移动设备上的安全威胁

热门文章

  1. 爱心动画c语言,jquery+html5烂漫爱心表白动画代码分享
  2. 【建议收藏】50 道硬核的 Python 面试题
  3. ipad如何与手机微信连接服务器地址,如何设置微信在手机和ipad同步 - 卡饭网
  4. Android 5.1.1 源码目录结构
  5. 无线局域网WLAN的入门概念
  6. 小程序云开发前端显示云存储的图片
  7. IBM服务器无法启动怎么恢复
  8. 解决:Docker Container exited with code 137
  9. mysql ix is_关于MySQL中的共享锁(S)、排它锁(X)、意向共享锁(IS)、意向排它锁(IX)...
  10. 人工智能写歌词?看我是如何用Python来C位出道的……