最近遇到一个跟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 );
}