最近遇到一個跟Windows(不是指操作系統,而是一個::CreateWindow的結果)有關的問題。
情況是這樣的,通常的應用程序內的事件傳遞一般場景都是類似在窗體A上點擊按鈕1,彈出一個窗體B。面對這樣的場景只要::SetWindowActive(HWND wnd)即可,這里其實有個隱含的前提,就是wnd的父窗口是出于TOP的狀態,也就是它的父窗口是置頂的,也就是我們能夠在界面上看到它,否則你的其他置頂窗口將依舊置頂。
下面的代碼示意了如何將窗口置頂,因為也沒有對各個方法做深入分析,所以就不多發表言論了:
/*場景:
目標:將子窗口放到置頂(且是HWND_TOP)模式
說明:hMainWnd是主窗口,m_pMMessageWnd->m_hWnd是子窗口
*/
/*1、將窗口從后臺直接提到最前方,需要先將主窗口移上來。*/
HWND hMainWnd = CFramework::GetInstance()->GetMainWnd();
if( hMainWnd != NULL )
{
SetForegroundWindow(hMainWnd);
BringWindowToTop(hMainWnd);
SetActiveWindow(hMainWnd);
SetWindowPos( hMainWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW );
}
/*2、將子窗口置頂*/
if( m_pMMessageWnd != NULL ) /* true */
{
SetForegroundWindow(m_pMMessageWnd->m_hWnd);
BringWindowToTop(m_pMMessageWnd->m_hWnd);
SetActiveWindow(m_pMMessageWnd->m_hWnd);
SetWindowPos( m_pMMessageWnd->m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW );
SetWindowPos( m_pMMessageWnd->m_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW );
}
/*3、放在后面的原因是避免子窗口還未彈出,點擊窗體外的時候被放到后面去,所以等窗口出來后再取消置頂*/
if( hMainWnd != NULL )
{
SetWindowPos( hMainWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW );
}
/*4、避免被主窗口給壓了*/
if( m_pMMessageWnd != NULL ) /* true */
{
SetWindowPos( m_pMMessageWnd->m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW );
SetWindowPos( m_pMMessageWnd->m_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW );
}