这是代码:

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次。

我不太了解发生了什么。

最佳答案

不要直接从SetScrollSizes调用OnDraw()。这是真正的坏习惯。当内容以需要更改滚动位置的方式更改时,调用SetScrollSizes,然后使用OnDraw中的滚动信息。

否则,由于OnDraw决定滚动大小发生变化,您将陷入无休止的循环,这将改变显示的信息量,这要求调用OnDraw,然后由于更改而改变滚动大小,这意味着必须重新显示信息。

关于c++ - 我不知道为什么重复调用OnDraw()函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33894592/

10-15 06:51