在Excel中滚动工作表时,ActiveX控件中的子控件会移动

时间:2019-03-25 16:32:15

标签: c++ excel winapi mfc activex

今天,我创建了简单的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控件?

0 个答案:

没有答案