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

Posted

技术标签:

【中文标题】MFC:在运行时设置控件位置【英文标题】:MFC: Set controls position at runtime 【发布时间】:2013-07-03 09:01:49 【问题描述】:

我有一个带有一些按钮控件和一个 activeX 网络浏览器控件的 mfc 对话窗口。 现在,我将控件拖放到我的对话框窗口上,因此它们的位置有些硬编码,并且与对话框无关。 我想在运行时设置它们的位置,当对话框窗口打开时。

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

【问题讨论】:

【参考方案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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于MFC:在运行时设置控件位置的主要内容,如果未能解决你的问题,请参考以下文章

在运行时从 MFC 中的派生类中添加控件

MFC EditBrowse 控件在运行时不显示文件夹图标

在运行时动态分配 MFC 命令 ID

MFC在运行时在优化校准中显示图像[重复]

如何在 MFC 对话框中保持控件的 Z 顺序?

编辑控件 MFC 中光标位置更改时是不是有通知代码?