隐藏基于Dialog的MFC的主窗体
最近需要做一个主窗体常态隐藏的程序,类似360卫士那样,只有托盘图标常显示。本以为隐藏主窗体很简单,但遇到了意想不到的情况。
无效的做法
最初的想法是设置主对话框资源的 Visiable 属性为 false, 并在OnInitDialog函数里调用 ShowWindow(SW_HIDE) ,发现这些操作根本没有作用,对话框还是好好的显示在那里。开始还以为是改错了项目,或者当前启动项目设置错了,检查了一遍,确认没错,只好开始百度。
最初发现的解决方法是在OnInitDialog函数中执行以下代码:
SetWindowPos(&wndNoTopMost,,,,,SWP_HIDEWINDOW);
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);//移除任务栏图标显示
ShowWindow(SW_HIDE);
结果是窗体的大部分隐藏了,还剩了点没隐藏,就是下图这个要死不活的样子

既然还剩了一部分,那我就把对话框资源的 Caption 属性为空,SystemMenu属性设置为false,结果文字和关闭按钮确实都不见了,但还是剩下了一些东西,就是下图中的小长条

只能继续研究。
有效的做法
1 将界面像素置为0,移动界面至屏幕角落
int nFullWidth = GetSystemMetrics(SM_CXSCREEN);
int nFullHeight = GetSystemMetrics(SM_CYSCREEN);
SetWindowPos(NULL, nFullWidth, nFullHeight, , , SWP_NOZORDER); //设置0像素,移到最角落 或者:MoveWindow(0,0,0,0);
ShowWindow(SW_HIDE);
ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW); //移除任务栏图标显示
这种做法只是将上述的小长条移到了不易看到的地方,用户一旦操作界面的任一部位,窗口都会因为失活而不再显示,达到了隐藏界面的目的。但是这种做法明显属于凑合,而且一旦需要显示主界面,还需要将对话框的类型改回来,不能为工具窗口,否则任务栏不显示。
2 采用定时器,在窗口初始化完成后马上隐藏
在OnInitDialog中创建一个定时器SetTimer(1,1,NULL);
然后在OnTimer函数中调用ShowWindow(SW_HIDE)
这种做法的缺点就是窗口会闪烁一次,而且这种手法太野路子,不优雅。
3 响应WM_NCPAINT消息
在第一次处理WM_NCPAINT消息是,调用ShowWindow(SW_HIDE)方法,之所以只调用一次,是为了之后可以将主窗口再显示出来。
这种方法比较优雅,推荐采用
void CMFCApplication1Dlg::OnNcPaint()
{
// TODO: 在此处添加消息处理程序代码
static bool bNotPaint = true;
if (bNotPaint)
{
ShowWindow(SW_HIDE);
bNotPaint = false;
}
else
{
CDialogEx::OnNcPaint();
}
}
4 改变主窗体的创建方式
将 C***App::InitInstance() 函数中的代码
CMFCApplication1Dlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
替换为
CMFCApplication1Dlg dlg;
m_pMainWnd = &dlg;
//INT_PTR nResponse = dlg.DoModal();
INT_PTR nResponse = dlg.Create(CMFCApplication1Dlg::IDD);
dlg.ShowWindow(SW_HIDE);
dlg.RunModalLoop();
同样比较优雅,推荐使用
综上所述,由于CDialog的创建隐藏了太多细节,只有弄清楚基于Dialog的窗体的创建方式、绘制时机、消息循环方式才能够优雅的实现功能,当然,我还没有弄明白。
隐藏基于Dialog的MFC的主窗体的更多相关文章
- MFC基于Dialog的工程中使用OSG
osg的例子有osgviewerMFC,是MDI类型的MFC工程,我一般用基于对话框的MFC较多. 注意观察MFC_OSG.h文件中的cOSG构造函数,参数是一个窗口句柄hWnd,这里的窗口可以不只局 ...
- Chapter 11. Frame, MainWindow, and Toplevel Widgets 框架,主窗体,顶级部件
Chapter 11. Frame, MainWindow, and Toplevel Widgets 框架,主窗体,顶级部件 框架和Toplevels 都是设计用于其他部件的容器. 它们的不同在 ...
- Android应用Activity、Dialog、PopWindow、Toast窗体加入机制及源代码分析
[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重劳动成果] 1 背景 之所以写这一篇博客的原因是由于之前有写过一篇<Android应用setCont ...
- (转载)用vs2010开发基于VC++的MFC 串口通信一*****两台电脑同一个串口号之间的通信
此文章以visual C++数据採集与串口通信測控应用实战为參考教程 此文章适合VC++串口通信入门 一.页面布局及加入控件 1, 安装好vs2010如图 2, 新建一个基于VC++的MFC项目com ...
- MFC获取各个窗体(体)之间的指针(对象)
MFC在非常多的对话框操作中,我们常常要用到在一个对话框中调用还有一个对话框的函数或变量.能够用例如以下方法来解决. HWND hWnd=::FindWindow(NULL,_T("S ...
- windows程序里新窗体不在任务栏显示,无标题拖动,键盘事件,始终显示在主窗体上面,单实例运行等
不显示在任务栏,Alt+Tab也不显示 protected override CreateParams CreateParams { get { const int WS_EX_APPWINDOW = ...
- 主窗体里面打开子窗体&&打印饼图《Delphi 6数据库开发典型实例》--图表的绘制
\Delphi 6数据库开发典型实例\图表的绘制 1.在主窗体里面打开子窗体:ShowForm(Tfrm_Print); procedure Tfrm_Main.ShowForm(AFormClass ...
- 基于Opencv和Mfc的图像处理增强库GOCVHelper(索引)
GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库.主要是对Opencv的适当扩展和在实现Mfc程序时候的 ...
- MFC无边框窗体不响应任务栏点击问题
为了提升用户体验,需要隐藏主窗体的边框,使用图片绘制新的标题栏.标题栏绘制之后,发现用户点击任务栏上应用程序的图标,应用程序不会随着点击交替隐藏显示. 分析结果是问题出现窗体风格设置上. 最初为了省事 ...
随机推荐
- restful framework之频率组件
一.频率简介 为了控制用户对某个url请求的频率,比如,一分钟以内,只能访问三次 二.自定义频率类.自定义频率规则 自定义的逻辑 #(1)取出访问者ip # (2)判断当前ip不在访问字典里,添加进去 ...
- HTTP 请求/响应报文结构
请求报文和响应报文都是由以下4部分组成: 1.请求行/响应行 2.请求头/响应头 3.空行 4.消息主体(请求体/响应体) 请求报文结构 请求行 格式为:Method Request-URI HTTP ...
- Shader食谱 Chapter3--Toonshader卡通效果
Shader食谱 Chapter3--Toonshader卡通效果 unity shader toon 卡通Shader Shader食谱 Chapter3--Toonshader卡通效果 Over ...
- 零基础学python之构建web应用(入门级)
构建一个web应用 前面的学习回顾: IDLE是Python内置的IDE,用来试验和执行Python代码,可以是单语句代码段,也可以是文本编辑器中的多语句程序. 四个内置数据结构:列表.字典.集合和元 ...
- SICP读书笔记 2.4
SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...
- Scikit-learn数据变换
转载自:https://blog.csdn.net/Dream_angel_Z/article/details/49406573 本文主要是对照scikit-learn的preprocessing章节 ...
- vue 使用ref获取DOM元素和组件引用
在vue中可以通过ref获取dom元素,并操作它,还可以获取组件里面的数据和方法. HTML部分: <div id="app"> <input type=&quo ...
- Flink BLOB架构
Flink中支持的BLOB文件类型 jar包 被user classloader使用的jar包 高负荷RPC消息 1. RPC消息长度超出了akka.framesize的大小 2. 在HA摸式中,利用 ...
- Vue03
5.组件化开发 组件[component] 在网页中实现一个功能,需要使用html定义功能的内容结构,使用css声明功能的外观样式,还要使用js来定义功能的特效,因此就产生了把一个功能相关的[HTML ...
- 从零开始的Python学习Episode 16——模块
一.模块 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相 ...