所有ActiveX控件都会发生这种情况。如果我用DeferWindowPos重新定位ActiveX控件

HDWP hdwp = BeginDeferWindowPos(1);
DeferWindowPos(hdwp, m_pActiveX->GetSafeHwnd(), NULL, left, top, width, height, SWP_NOZORDER);
EndDeferWindowPos(hdwp);

它会转到,但是一旦您在控件内的任意位置单击,便会移动/调整其旧矩形的大小。如果我改用MoveWindow
m_pActiveX->MoveWindow(left, top, width, height);

这不会发生。

其他任何类型的控件都不会发生这种情况,只有ActiveX控件会发生这种情况,所有其他控件都发生这种情况。我进行了测试以确认这一点,创建了一个新的ActiveX控件项目,但未进行任何更改,问题仍然存在。

最佳答案

您永远不会得到适当的答案。我会在这里尝试帮助。

问题在于,MFC在其框架内托管ActiveX控件时隐藏了许多棘手的问题。具体来说,如果您进入MoveWindow调用,它不仅是Win32 MoveWindow函数的包装。它调用OLE控制容器支持类。这基本上是说,如果我们具有控制站点界面,则调用COleControlSite::MoveWindow,否则调用标准Win32 MoveWindow。 CWnd等处理的其他几个窗口函数也会发生同样的情况。例如,COleControlSite::SetWindowPos处理隐藏/显示控件,然后调用COleControlSite::MoveWindow将其移动,然后最终调用:: SetWindowPos(带有move/show标志)屏蔽掉)来处理其余的问题。

一旦进入COleControlSite::MoveWindow,您将注意到它做了几件事:它调用SetExtent,更新它的内部m_rect成员,然后调用SetObjectRects。

直接使用Win32 API(例如,通过DeferWindowPos)为ActiveX控件绕过这些控件会导致其中一些关键步骤被遗漏。根据您的代码布局方式,通常您可以自己处理。

09-30 13:47