窗体内指定某个控件置顶,使用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);