我不知道为什么重复调用OnDraw()函数

时间:2015-11-24 13:09:43

标签: c++ api mfc

以下是代码:

void PinNameView::OnDraw(CDC* pDC)
{
    if(!AdPinData::getFlag()) return;

    for(int i=0; i<numOnPins; i++)
        pButton[i].ShowWindow(SW_SHOW);
    SetScrollSizes(MM_TEXT, CSize(timeFrame*gridX,0));
}

这里是OnUpdate()函数,它在从文本文件中获取引脚名称时将引脚名称设置到按钮框中。

void PinNameView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
    // TODO: Add your specialized code here and/or call the base class
    if(!AdPinData::getFlag()) return;

    numOnPins = AdPinData::getOnPinSize();
    pt_Pin = AdPinData::getPinDataPtr();
    if(pButton) delete [] pButton;          //initialize pButton if the pointer has a last value
    pButton = new CButton[numOnPins]();
    for(int i=0; i<numOnPins; i++){         //to write pinName into each buttons
        string str = pt_Pin[i].pinName;
        pButton[i].Create((CString)str.c_str(),WS_CHILD | WS_VISIBLE | BS_BITMAP/*BS_DEFPUSHBUTTON*/,
            CRect(0,i*gridY,98,(i+1)*gridY),this,i);
    }
    this->Invalidate(false);
}

当在调试模式下运行时,我发现重复调用OnDraw()函数。在SetScrollSizes()函数之后,它再次进入OnDraw()函数的开头,并重复约40-50次。

我真的不明白发生了什么。

1 个答案:

答案 0 :(得分:2)

请勿直接从SetScrollSizes致电OnDraw()。这是一个真正糟糕的做法。当内容以需要更改滚动位置的方式更改时调用SetScrollSizes,然后使用OnDraw中的滚动信息。

否则,当OnDraw决定滚动大小发生变化时,您将最终拥有无限循环,这会改变显示的信息量,这需要调用OnDraw,然后,作为更改后果,更改滚动大小,这意味着必须重新显示信息。