我有一个mfc对话框窗口,其中包含一些按钮控件和一个activeX Web浏览器控件。 现在我将控件拖放到对话框窗口上,因此它们的位置有些硬编码而不是相对于对话框。 我想在对话框窗口打开时在运行时设置它们的位置。
我尝试过SetWindowPos(GetDlgItem(IDC_EXPLORER), 0,0,a,b,1);
,但它没有做任何事情。
我还能尝试什么?
答案 0 :(得分:1)
SetWindowPos就是您刚刚使用了错误的参数。您指定了SWP_NOSIZE的最终标志,但我认为这不是您想要的。试试这个:
GetDlgItem(IDC_EXPLORER)->SetWindowPos( NULL, 0, 0, a, b, SWP_NOZORDER | SWP_NOMOVE | SWP_SHOWWINDOW );
如果您希望根据父级动态调整控件的大小。这是解决方案的绝对宝石:
答案 1 :(得分:1)
您的问题不清楚是否只想更改窗口的x- / y位置或z位置。我假设你只想x- / y-移动它。
您需要在要更改其位置的窗口上应用SetWindowPos。您没有通过窗口移动到SetWindowPos。请不要将1作为标志传递,请通过SWP_定义。
GetDlgItem(IDC_EXPLORER)->SetWindowPos(&wndTop, 0, 0, a, b, SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOZORDER);
甚至更简单:
GetDlgItem(IDC_EXPLORER)->MoveWindow(0, 0, a, b);
答案 2 :(得分:1)
如果您有很多控件,使用DeferWindowPos
结合BeginDeferWindowPos
和EndDeferWindowPos
可能会提高效果并减少闪烁。
HDWP hdwp = BeginDeferWindowPos(2);
int cxHalf = cx/2;
if (hdwp) hdwp = DeferWindowPos(hdwp, g_hwndChildren[0],
NULL, 0, 0, cxHalf, cy,
SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE);
if (hdwp) hdwp = DeferWindowPos(hdwp, g_hwndChildren[1],
NULL, cxHalf, 0, cx-cxHalf, cy,
SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_NOACTIVATE);
if (hdwp) EndDeferWindowPos(hdwp);