Mfc 未在Activex中重新绘制CRectTracker

Mfc 未在Activex中重新绘制CRectTracker,mfc,activex,Mfc,Activex,我使用MFC创建了一个ActiveX项目 创建了CRectTracker类 然后我使用OnPaint函数绘制了一个类。 但是,屏幕不会更新 我使用OnDraw函数进行绘制。 然而,后像仍然存在 你怎么解决这个问题 这个代码是 CArray <CRectTracker, CRectTracker&> m_arrRect; void CWebBrowserCtrl::AddArea() { AFX_MANAGE_STATE(AfxGetStaticModuleStat

我使用MFC创建了一个ActiveX项目

创建了CRectTracker类

然后我使用OnPaint函数绘制了一个类。 但是,屏幕不会更新

我使用OnDraw函数进行绘制。 然而,后像仍然存在

你怎么解决这个问题

这个代码是

CArray <CRectTracker, CRectTracker&> m_arrRect;

void CWebBrowserCtrl::AddArea()
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    CRect rect(0, 0, 100, 100);
    CRectTracker tracker;
    tracker.m_rect = rect;
    tracker.m_nStyle = 0;
    tracker.m_nStyle |= CRectTracker::dottedLine;
    tracker.m_nStyle |= CRectTracker::resizeOutside;

    m_arrRect.Add(tracker);

    this->Invalidate();
}


void CWebBrowserCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /* rcInvalid */)
{
    if (!pdc)
        return;

    int length = m_arrRect.GetCount();
    for (int i = 0; i < length; ++i) {
        CRectTracker tracker = m_arrRect.GetAt(i);
        if ((tracker.m_rect.Width() > 0) && (tracker.m_rect.Height() > 0))
        {
            tracker.Draw(pdc);
        }
    }
}
carraymarrect;
void CWebBrowserCtrl::AddArea()
{
AFX_管理_状态(AFXGetStaticModuleEstate());
正确的rect(0,0,100,100);
纠错跟踪器;
tracker.m_rect=rect;
tracker.mnstyle=0;
tracker.m|nStyle |=CRectTracker::dottedLine;
tracker.m|nStyle |=CRectTracker::resizeOutside;
m_arrect.Add(跟踪器);
此->无效();
}
void CWebBrowserCtrl::OnDraw(CDC*pdc、const-CRect&rcBounds、const-CRect&rcInvalid*/)
{
如果(!pdc)
返回;
int length=m_arrect.GetCount();
对于(int i=0;i0)和&(tracker.m_rect.Height()>0))
{
跟踪器绘制(pdc);
}
}
}

void CThermalViewForWebBrowserCtrl::OnPaint()
{
CPaintDC dc(本);
int length=m_arrect.GetCount();
对于(int i=0;i0)和&(tracker.m_rect.Height()>0))
{
跟踪器。绘图(&dc);
}
}
COleControl::OnPaint(&dc);
}

您是否覆盖了OnEraseBackground()?返回的内容决定控件是否在OnPaint()之前清除背景。因此,要么设置它,使控件正确地擦除自身,要么在绘制rect跟踪器之前,通过对整个客户端rect执行DrawRect()来自己执行(也可以执行较小的区域,但随后必须跟踪OnMouseMove中的前一个矩形)。这可能会导致闪烁,为此您必须使用CMemDC或类似的工具(本质上,实现双缓冲)。不,我没有重写OnEraseBackground(),那么您是否尝试过重写它?看看COleControl,它的OnEraseBackground()实现明确表示“什么都不做-控件在OnDraw中擦除它们的背景”。所以,要么在OnDraw中执行自己的擦除,要么覆盖OnRaseBackground。
void CThermalViewForWebBrowserCtrl::OnPaint()
{
    CPaintDC dc(this);

    int length = m_arrRect.GetCount();
    for (int i = 0; i < length; ++i) {
        CRectTracker tracker = m_arrRect.GetAt(i);
        if ((tracker.m_rect.Width() > 0) && (tracker.m_rect.Height() > 0))
        {
            tracker.Draw(&dc);
        }
    }

    COleControl::OnPaint(&dc);
}