天天看点

VC/MFC 控件置顶 窗体内控件置顶

窗体内指定某个控件置顶,使用SetWindowPos函数。但不能这样用    ::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); 这是窗体在桌面置顶

控件置顶(id: IDC_X1)   IDC_Y是窗体上ID最大的控件。 IDC_X1 放在 IDC_Y(insertAfter)后面  IDC_X1变成置顶效果。

GetDlgItem(IDC_X1)->SetWindowPos(GetDlgItem(IDC_Y), 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

需要注意后续置顶IDC_X2时,Z序(Y,X1,X2)

GetDlgItem(IDC_X2)->SetWindowPos(GetDlgItem(IDC_X1), 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

如果insertAfter依旧设为IDC_Y,会导致IDC_X2非置顶(IDC_X2显示在IDC_X1下面)  Z序(Y,X2,X1)

/*设置窗口置顶   控件按照Z序(从小到大) 逐个渲染   Z值大的, 最后渲染 显示在最前面(置顶)
    A->SetWindowPos B(insertAfter)   效果就是A放在B后面   Z序(BA)   A显示在B上面
    首次设置X  放在置顶控件后面,X变成置顶
    后续设置Y  放在置顶控件(X)后面,Y变成置顶
    如果控件 已经置顶 则不需要操作
*/
if (m_DragData.LastWidgetId == -1)
    GetDlgItem(m_DragData.WidgetId)->SetWindowPos(
                GetDlgItem(IDC_Pic50), 
                0, 0, 0, 0, 
                SWP_NOMOVE | SWP_NOSIZE);
else if (m_DragData.LastWidgetId !=m_DragData.WidgetId)
    GetDlgItem(m_DragData.WidgetId)->SetWindowPos(
                GetDlgItem(m_DragData.LastWidgetId), 
                0, 0, 0, 0, 
                SWP_NOMOVE | SWP_NOSIZE);