[轉]隱藏基於對話框的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.\n");
        AfxPostQuitMessage(0);
    }
    return CWinThread::Run();
}

 

呵呵,原來只要 m_pMainWnd 不為 NULL, 則主線程就可以轉起來.至此,所有的問題就迎刃而解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM