今天,我创建了简单的ActiveX MFC控件。我的目的是将此控件插入Excel工作表中,并创建一个带有边距的子控件(或设置ActiveX的填充)。我不能为此使用C#和Windows窗体控件(仅c ++,这是项目要求)
我创建了简单的MFC ActiveX控件并导出了1个函数-SetContent(HWND newContent),该函数应该在ActiveX控件中插入任何窗口。我希望该窗口以边距显示。
https://pasteboard.co/I74MTVN.png-这是开始时的控制方式
https://pasteboard.co/I74NW7T.png-这是我开始滚动工作表时的外观
您可以看到当我滚动时子控件(浅绿色)正在移动
void MyActiveXControl::SetContent(OLE_HANDLE newContent)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (this->m_lReadyState == READYSTATE_COMPLETE)
{
if (newContent != 0)
{
::SetParent(HWND(newContent), this->GetSafeHwnd());
int width, height;
this->GetControlSize(&width, &height);
::MoveWindow(HWND(newContent), 10, 10, width - 20, height - 20, 0);
m_content = HWND(newContent);
}
}
}
这只是使用控件进行操作(在SetContent方法中)的一句代码
这是绘画:
void MyActiveXControl::OnPaint()
{
CRect rcBounds;
CPaintDC pdc(this);
this->GetClientRect(&rcBounds);
pdc.FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(BLACK_BRUSH)));
}
我尝试过的:
1)设置具有不同标志(例如NOSIZE,NOMOVE等)的SetWindowPos而不是MoveWindow。
2)覆盖OnSize消息-存在大小事件每滚动1次触发2次的问题:
1. With actual ActiveX control size (width: 500, height: 500)
2. With the size of the area that is visible (width: 500, height: 250)
如何解决我的问题并防止子控件移入ActiveX控件?