最近遇到一個(gè)跟Windows(不是指操作系統(tǒng),而是一個(gè)::CreateWindow的結(jié)果)有關(guān)的問題。
情況是這樣的,通常的應(yīng)用程序內(nèi)的事件傳遞一般場景都是類似在窗體A上點(diǎn)擊按鈕1,彈出一個(gè)窗體B。面對這樣的場景只要::SetWindowActive(HWND wnd)即可,這里其實(shí)有個(gè)隱含的前提,就是wnd的父窗口是出于TOP的狀態(tài),也就是它的父窗口是置頂?shù)?,也就是我們能夠在界面上看到它,否則你的其他置頂窗口將依舊置頂。
下面的代碼示意了如何將窗口置頂,因?yàn)橐矝]有對各個(gè)方法做深入分析,所以就不多發(fā)表言論了:
/*場景:
目標(biāo):將子窗口放到置頂(且是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、放在后面的原因是避免子窗口還未彈出,點(diǎn)擊窗體外的時(shí)候被放到后面去,所以等窗口出來后再取消置頂*/
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 );
}