MFC:在运行时设置控件的位置

MFC: Set controls position at runtime

本文关键字:控件 位置 设置 运行时 MFC      更新时间:2023-10-16

我有一个mfc对话框窗口,其中包含一些按钮控件和一个activeX web浏览器控件。现在,我在对话框窗口上拖放控件,这样它们的位置就有点硬编码,而不是相对于对话框。我想在运行时对话框窗口打开时设置它们的位置。

我试着做SetWindowPos(GetDlgItem(IDC_EXPLORER), 0,0,a,b,1);,但什么都没做。我还能尝试什么?

SetWindowPos就是您刚刚使用错误的参数。您已经指定了SWP_NOSIZE的最后一个标志,但我认为这不是您想要的。试试这个:

GetDlgItem(IDC_EXPLORER)->SetWindowPos( NULL, 0, 0, a, b, SWP_NOZORDER | SWP_NOMOVE | SWP_SHOWWINDOW );

如果您希望根据父控件动态调整控件大小。这里有一个绝对的解决方案:

http://www.codeguru.com/cpp/misc/misc/article.php/c323/Method-to-achieve-repositioningresizing-of-child-controls.htm

您的问题不清楚是只想更改窗口的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);

如果您有很多控件,将DeferWindowPosBeginDeferWindowPosEndDeferWindowPos结合使用可以提高性能并减少闪烁。

来自Raymond Chen的样品:

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);