zoukankan      html  css  js  c++  java
  • 隐藏基于对话框的MFC应用程序窗口的方法

    隐藏基于对话框的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.
    ");
            AfxPostQuitMessage(0);
        }
        return CWinThread::Run();
    }
    复制代码

    呵呵,原来只要 m_pMainWnd 不为 NULL, 则主线程就可以转起来.至此,所有的问题就迎刃而解。

  • 相关阅读:
    无法加载文件或程序集“System.Net.Http,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a”
    Linux中安装Oracle jdk
    算符优先文法,中缀式求值,栈的典型应用
    数据结构之--双链表MyLinkedList
    数据结构之--单链表MyArrayList
    Java中的函数对象
    (11)连个工具类之间的比较4.Collections与Arrays
    javaList容器中容易忽略的知识点
    (27)回复泛型,注解、日志组件、枚举在实际项目中的使用
    无问西东,哪怕重头来过
  • 原文地址:https://www.cnblogs.com/ruingking/p/10874737.html
Copyright © 2011-2022 走看看