关于MFC窗口隐藏的方法
最近做的一个项目要用到隐藏窗口。个人很想编程命令行下的。但是没办法。。不会,找了找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.利用window的属性 function isMinStatus() { var isMin = false; if (window.outerWidth != ...
- PowerShell隐藏不显示窗口的多种方法
转载 https://www.jb51.net/article/68186.htm 隐藏不显示窗口的多种方法这篇文章主要介绍了PowerShell隐藏不显示窗口的多种方法,本文讲解了启动PowerSh ...
- python 隐藏进程_python在windows下创建隐藏窗口子进程的方法
python在windows下创建隐藏窗口子进程的方法 发布于 2015-11-08 20:56:53 | 213 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一 ...
- MFC OpenCV:刷新图片以及防止窗口抖动的方法
MFC OpenCV:刷新图片以及防止窗口抖动的方法 一.背景 二.刷新方法 2.1 先使PictrueContral控件不可见,后使其重新可见 2.2 填充与MFC图像窗口背景相同的颜色 2.3 填 ...
- 不小心把VisualStudio的解决方案资源管理器和输出等窗口隐藏了,找不到的话,可以用以下的解决方法
不小心把VisualStudio的解决方案资源管理器和输出等窗口隐藏了,找不到的话,可以用以下的解决方法 前言 不小心把VisualStudio的解决方案资源管理器和输出等窗口隐藏了,找了好久找不到, ...
- c语言mfc窗口跳到下个窗口,MFC停靠窗口实现(CDockablePane)
工作中编写MFC界面程序时用到了停靠窗口,为了避免之后用到时再去查询,这里记录下. 步骤 1.定义一个继承自CDockablePane的类 Class CDockableTest : public C ...
- html 自动 浏览器窗口,一种html文件实现显示浏览器窗口内容的方法
一种html文件实现显示浏览器窗口内容的方法 [技术领域] [0001]本发明涉及html领域,特别涉及一种html文件实现显示浏览器窗口内容的方法. [背景技术] [0002]-般的浏览器窗口显示需 ...
- MFC 窗口分割与通信
一.关于CSplitterWnd类 我们在使用CuteFtp或者NetAnt等工具的时候,一般都会被其复杂的界面所吸引,在这些界面中窗口被分割为若干的区域,真正做到了窗口的任意分割. 那么我们自己如何 ...
- 关于Mac中窗口隐藏与最小化快捷键的多种用法
From: http://www.macx.cn/thread-2035603-2-1.html Safari 5.1.2 Mac OS X 10.7.2 首先来说说大家都知道的最基本的两个快捷键 ...
- opencv在mfc窗口显示图片
mfc显示mat图片的两种方式 方式一:将opencv的窗口嵌入到mfc的窗口内 将opencv窗口与mfc窗口绑定之后就可以通过cv::imshow("video",img)显示 ...
最新文章
- MySQL的索引特性
- ubuntu下面pycharm设置pyspark的配置
- 1003 我要通过!(20)(20 分)
- Swift中文教程(二十一) 协议
- UID 修改 UID 锁死修复
- MapReduce 支持的部分数据挖掘算法
- Exchange 2010安装各角色先决条件的Powershell
- mysql手机客户端_图解MySQL索引--B-Tree(B+Tree)
- 打印有向图的强连通分量-----kosaraju算法(最简单的实现)
- EAS后台事务的超时时长如何设置?
- 图片用Adobe PDF打开后尺寸变大的问题解决
- Opencv学习——LSD直线检测
- class path resource [springMVC-servlet.xml] cannot be opened because it does not exist
- C++常成员函数与普通成员函数访问比较
- php文本框添加表情,仿微信在对话框文字中插入Emoji表情包
- AMBA总线---APB总线协议
- Google的OR-Tools
- Qt之QThread(深入理解)
- 【状态观测器】全维状态观测器
- Android 系统的安全性分析(1)--移动设备上的安全威胁
热门文章
- 爱心动画c语言,jquery+html5烂漫爱心表白动画代码分享
- 【建议收藏】50 道硬核的 Python 面试题
- ipad如何与手机微信连接服务器地址,如何设置微信在手机和ipad同步 - 卡饭网
- Android 5.1.1 源码目录结构
- 无线局域网WLAN的入门概念
- 小程序云开发前端显示云存储的图片
- IBM服务器无法启动怎么恢复
- 解决:Docker Container exited with code 137
- mysql ix is_关于MySQL中的共享锁(S)、排它锁(X)、意向共享锁(IS)、意向排它锁(IX)...
- 人工智能写歌词?看我是如何用Python来C位出道的……