MFC隐藏主窗口的方法

2023-05-16

隐藏基于对话框的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改为与你新建的对话框的对应即可,方法的原理与上面的一样,只是麻烦了一点点而已.

隐藏基于单文档的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, 则主线程就可以转起来.至此,所有的问题就迎刃而解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MFC隐藏主窗口的方法 的相关文章

随机推荐

  • Android 身份认证基本概念

    身份验证 Android 采用通过用户身份验证把关的加密密钥机制 xff0c 该机制需要以下组件 xff1a 加密密钥存储和服务提供程序 存储加密密钥并基于这些密钥提供标准加密例程 Android 支持由硬件支持的密钥库和 Keymaste
  • Gnome增加消息提醒extension 适用于聊天工具如xchat "message notifier" "notifications alert" "permanent notification&quo

    使用如xchat这样的聊天工具 xff0c 有人跟你说话时 xff0c 在KDE桌面中 xff0c 默认系统托盘中的xchat托盘会闪烁 xff0c 直到你点击将xchat切换到前台 xff0c 这是xchat在preference可以设置
  • 读取文件报错:FileNotFoundError: [Errno 2] No such file or directory

    文章目录 问题描述问题分析解决办法 问题描述 使用 img 61 Image open 39 data DSC 8923 jpg 39 读取一张图片时 xff0c 报 FileNotFoundError Errno 2 No such fi
  • CentOS7离线安装图像化界面踩坑及脱坑历程

    CentOS7离线安装图像化界面 背景安装问题尝试一 xff1a 尝试二 xff1a 其他问题总结 背景 很久之前实验室的一台服务器安装了CentOS 7 6 1810版本的linux系统 xff0c 然而当时安装系统的同学不知出于什么目的
  • Eslint 配置及规则说明

    中文官方网站 基本使用教程 安装 可以全局安装 xff0c 也可以在项目下面安装 如下是在项目中安装示例 xff0c 只需要在 package json 中添加如下配置 xff0c 并进行安装 xff1a gt 34 eslint 34 3
  • Ubuntu自动登录图形系统界面(免密码、开机自启动)

    Ubuntu自动登录图形系统界面 xff08 免密码 开机自启动 xff09 操作系统版本 xff1a 18 04 修改50 unity greeter conf xff0c 使其允许root登录 span class token func
  • 学C++有多难,你知道吗?

    都2020年了 xff0c 还要学C 43 43 吗 xff1f C 43 43 好多理工科大学里面都有 xff0c 它的学习难度比其他编程语言比如Python Javascript 和Java等等难 那为什么呢 xff1f C 43 43
  • 搞懂Java高级特性--注解

    1 注解是什么 xff1f Java注解 xff08 Annotation xff09 又称Java标注 xff0c 是JDK5 0引入的一种注释机制 xff0c 注解是元数据的一种形式 xff0c 提供有关于程序但不属于程序本身的数据 x
  • 为什么都说代码改变世界?是因为这五位程序员创造了未来!

    致敬那些为软件开发奠定坚实基础的计算机科学先驱 从 1 和 0 开始 xff0c 编程经历了很长一段路 xff0c 才达到了现在的抽象状态 过去的程序员用伟大的发明 xff0c 为现代程序员轻松地完成工作奠定了坚实的基础 如果我们研究某个软
  • 编译提示缺少libjli.so,jar command not found,javadoc错误等

    这周一周忙于Ubuntu server环境下的Android编译环境的搭建 xff0c 由于刚开始真正使用Linux xff0c xff08 以前虽然用过Ubuntu xff0c 但是就当win用了 就这样还没坚持下来 xff0c 现在工作
  • 银河麒麟系统4.0.2离线安装MySQL教程

    银河麒麟系统4 0 2离线安装MySQL教程 xff08 Ubuntu离线安装MySQL教程 xff09 https www jianshu com p 478dc7c9b9e0 这个教程很详细 xff0c 我不再多说 xff0c 而且亲测
  • 实现线程同步的几种方式

    在多线程中线程的执行顺序是依靠哪个线程先获得到CUP的执行权谁就先执行 xff0c 虽然说可以通过线程的优先权进行设置 xff0c 但是他只是获取CUP执行权的概率高点 xff0c 但是也不一定必须先执行 在这种情况下如何保证线程按照一定的
  • STC开天斧虚拟示波器使用

    开天斧外观图 xff0c 颜值非常可以 1 在keil中添加STC8H8K64U的型号和头文件 xff0c 添加功能在STC IPS软件里 首先点击Keil仿真设置 xff0c 然后选择单片机型号STC8H8K64U xff0c 然后点击添
  • android AlertDialog 弹窗自定义布局 点击外部不关闭弹窗

    AlertDialog span class token punctuation span Builder builder span class token operator 61 span span class token keyword
  • delete释放new[] 以及 delete[]释放new 的问题

    在同花顺 的笔试过程中遇到这么一个类似问题 A ptr 61 new A 10 for int i 61 0 i lt n i 43 43 delete amp ptr i 由此衍生出两个问题 new 申请的空间用delete释放会发生什么
  • C#中的readonly与const区别

    xfeff xfeff const 的概念就是一个包含不能修改的值的变量 常数表达式是在编译时可被完全计算的表达式 因此不能从一个变量中提取的值来初始化常量 如果 const int a 61 b 43 1 b是一个变量 xff0c 显然不
  • 改变无线连接、有线连接的优先级

    有线和无线连的是同一个网络 xff0c 当笔记本打开时 xff0c 总是优先使用无线连接 xff0c 如何转变优先级为有线连接呢 xff1f 1 打开网络和共享中心 2 更改适配器设置 xff0c 打开网络连接窗口 3 单击此窗口的高级菜单
  • 杂感一

    从2014年7月工作至今已有快2年了 xff0c csdn的博客从毕业后就很少上了 工作中有很多收获 技术上 也在不断积累和成长中 不管做什么事情 xff0c 要坚持下去 xff0c 方得初心 xff0c 把坚持养成习惯 xff0c 学习如
  • Kotlin实战---Retrofit网络模型

    没有Kotlin基础的小伙伴先进这里 Koltin基础文章 1 Java和Kotlin互相调用之间的注意事项 1 解决关键字冲突 span class token keyword public span span class token k
  • MFC隐藏主窗口的方法

    隐藏基于对话框的MFC应用程序窗口的方法 推荐这个方法 xff0c 非常好用 很多人可能会将窗口创建出来 然后用一个 ShowWindow SW HIDE 的方法去隐藏窗口 当然这是可以做到隐藏的功能 但是有一点不足的地方就是窗口在隐藏之前