最近需要做一个主窗体常态隐藏的程序,类似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的主窗体的更多相关文章

  1. MFC基于Dialog的工程中使用OSG

    osg的例子有osgviewerMFC,是MDI类型的MFC工程,我一般用基于对话框的MFC较多. 注意观察MFC_OSG.h文件中的cOSG构造函数,参数是一个窗口句柄hWnd,这里的窗口可以不只局 ...

  2. Chapter 11. Frame, MainWindow, and Toplevel Widgets 框架,主窗体,顶级部件

    Chapter 11. Frame, MainWindow, and Toplevel Widgets   框架,主窗体,顶级部件 框架和Toplevels 都是设计用于其他部件的容器. 它们的不同在 ...

  3. Android应用Activity、Dialog、PopWindow、Toast窗体加入机制及源代码分析

    [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重劳动成果] 1 背景 之所以写这一篇博客的原因是由于之前有写过一篇<Android应用setCont ...

  4. (转载)用vs2010开发基于VC++的MFC 串口通信一*****两台电脑同一个串口号之间的通信

    此文章以visual C++数据採集与串口通信測控应用实战为參考教程 此文章适合VC++串口通信入门 一.页面布局及加入控件 1, 安装好vs2010如图 2, 新建一个基于VC++的MFC项目com ...

  5. MFC获取各个窗体(体)之间的指针(对象)

    MFC在非常多的对话框操作中,我们常常要用到在一个对话框中调用还有一个对话框的函数或变量.能够用例如以下方法来解决.    HWND hWnd=::FindWindow(NULL,_T("S ...

  6. windows程序里新窗体不在任务栏显示,无标题拖动,键盘事件,始终显示在主窗体上面,单实例运行等

    不显示在任务栏,Alt+Tab也不显示 protected override CreateParams CreateParams { get { const int WS_EX_APPWINDOW = ...

  7. 主窗体里面打开子窗体&&打印饼图《Delphi 6数据库开发典型实例》--图表的绘制

    \Delphi 6数据库开发典型实例\图表的绘制 1.在主窗体里面打开子窗体:ShowForm(Tfrm_Print); procedure Tfrm_Main.ShowForm(AFormClass ...

  8. 基于Opencv和Mfc的图像处理增强库GOCVHelper(索引)

    GOCVHelper(GreenOpen Computer Version Helper )是我在这几年编写图像处理程序的过程中积累下来的函数库.主要是对Opencv的适当扩展和在实现Mfc程序时候的 ...

  9. MFC无边框窗体不响应任务栏点击问题

    为了提升用户体验,需要隐藏主窗体的边框,使用图片绘制新的标题栏.标题栏绘制之后,发现用户点击任务栏上应用程序的图标,应用程序不会随着点击交替隐藏显示. 分析结果是问题出现窗体风格设置上. 最初为了省事 ...

随机推荐

  1. CSS快速入门-鼠标悬浮(hover伪类)

    一.概述 hover伪类:在鼠标移到元素上时向此元素添加特殊的样式.比较普通的就是一个url,当你鼠标放上去后,会变颜色. 在现实的应用场景也非常之多.最常见的是网站的悬浮导航,当鼠标放到导航条上时, ...

  2. matplotlib简单示例

    一.简介 以下引用自百度百科 Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形 . 通过 Matplotlib,开发者可以仅需要 ...

  3. Ubuntu根目录下各文件夹的作用

    Ubuntu上常识和常用命令: 1.Ubuntu文件结构 在ubuntu上硬盘的目录和Windows上不同,Windows可以根据自己的需求分不同的盘符,但ubuntu上只有一个盘,从根目录开始每个目 ...

  4. 修复bug有哪些更快的技术?做好这6点就够了

    你有没有想过为什么有时修复错误似乎比它应该花费更长的时间?当你终于找到问题时,事实证明你所需要的只是一个小小的改变.然而,花了很多时间才能找到正在发生的事情.这种情况比我想象的更频繁. 另一方面,当您 ...

  5. flask的jinja2模板中过过滤器的相关小内容

    jinja2模板中有自带的过滤器,有需要直接拿来使用.也可以自己定义过滤器 在过滤器中,有一些常见得操作及关键字.有对字符串的操作,还有对大小写转换的操作.还有对list的操作 过滤器的语法 {# 过 ...

  6. Kubernetes集群部署篇( 一)

    K8S集群部署有几种方式:kubeadm.minikube和二进制包.前两者属于自动部署,简化部署操作,我们这里强烈推荐初学者使用二进制包部署,因为自动部署屏蔽了很多细节,使得对各个模块感知很少,非常 ...

  7. XSS跨站脚本

    1.反射型 非持久化,需要用户自己点击才可以触发 通常出现在搜索框 <?php $id=$_GET['id']; echo $id; ?> http://127.0.0.1/test/sc ...

  8. Bing词典vs有道词典比对测试报告——体验篇之成长性及用户控制权

    成长性: 会记住曾经查询过的单词或例句与有道词典实现基本一样,并无特别亮点. 用户有控制权: 必应词典和有道词典都能实现基本的查询前进和后退.以及无法查找结果,能顺利进行反馈. 我们在输入完单词按下回 ...

  9. Scrum Meeting 11.11

    成员 今日任务 明日计划 用时 徐越 学习UI设计并重构上传下载界面     赵庶宏       薄霖 UI代码更新     卞忠昊 Xfermode与PorterDuff     武鑫 界面设计:独 ...

  10. 20172329 2018-2019《Java程序设计与数据结构》课程总结

    作者:lalalouye(20172329王文彬) 2018-2019年大二Java程序设计与数据结构课程总目录:第一周 第二周 第三周 第四周 第五周 第六周 第七周 第八周 第九周 实验一 实验二 ...