隐藏基于对话框的MFC应用程序窗口的方法 (推荐这个方法,非常好用)
来源:互联网 发布:南京水科院怎么样知乎 编辑:程序博客网 时间:2024/06/07 04:00
隐藏基于对话框的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 openCCommandLineInfo cmdInfo;ParseCommandLine(cmdInfo);// Dispatch commands specified on the command lineif (!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应用程序窗口的方法 (推荐这个方法,非常好用)
- .隐藏基于对话框的MFC应用程序窗口的方法
- 隐藏基于对话框的MFC应用程序窗口的方法
- 基于MFC对话框隐藏的方法
- 基于对话框的MFC PocketPC应用程序全屏方法
- 几种MFC对话框的隐藏方法
- 几种MFC对话框的隐藏方法
- mfc对话框隐藏的几种方法
- 几种MFC对话框的隐藏方法
- 几种MFC对话框的隐藏方法
- 几种MFC对话框的隐藏方法
- MFC基于对话框程序启动时隐藏窗口的实现
- 隐藏窗口的方法枚举 (VC/MFC)
- MFC隐藏主窗口的方法
- 关于MFC窗口隐藏的方法
- MFC隐藏主窗口的方法
- MFC隐藏主窗口的方法
- MFC基于对话框加载菜单栏的方法
- Ubuntu 16.04 桌面版安装后的一些注意事项
- 仿小红书的图片标签
- 使用jmap和MAT分析JVM堆内存
- 微信支付
- JavaSE 集合框架(9)- ConcurrentHashMap
- 隐藏基于对话框的MFC应用程序窗口的方法 (推荐这个方法,非常好用)
- 浅谈web自适应
- 项目总结
- MySql sql语句
- 用IDEA基于maven项目使用mybatis-generator-plugin生成mapper和pojo
- datatabls 合并行,及在列前面添加数字
- Unity中Gizmos 画线参考
- AngularJS系列(一)——常用指令
- Fragment 中嵌入fragment切换页面报错