以下是代码:
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次。
我真的不明白发生了什么。
答案 0 :(得分:2)
请勿直接从SetScrollSizes
致电OnDraw()
。这是一个真正糟糕的做法。当内容以需要更改滚动位置的方式更改时调用SetScrollSizes
,然后使用OnDraw
中的滚动信息。
否则,当OnDraw
决定滚动大小发生变化时,您将最终拥有无限循环,这会改变显示的信息量,这需要调用OnDraw
,然后,作为更改后果,更改滚动大小,这意味着必须重新显示信息。