这是代码:
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/