MyMSDN

MyMSDN记录开发新知道

进程间窗体置顶

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

posted on 2010-09-04 12:41 volnet 阅读(1627) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


特殊功能