0
下面的代碼:我不知道爲什麼的OnDraw()函數被調用重複
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次。
我真的不明白髮生了什麼事。
你怎麼知道該函數反覆叫什麼名字?你在函數中有沒有斷點,並且每次你繼續斷點都會再次被打中?這可能是因爲Visual Studio的(我猜你使用VS?)窗口是最有可能掩蓋你的程序的窗口,當你繼續你的窗口被帶到前面,但因爲它是掩蓋它需要這樣redrawed' OnDraw'被調用,你打你的斷點。等等,並在... –
嗯..每次它需要繪製時調用OnDraw,如果你正在調試和覆蓋/移動窗口/改變焦點,它將需要重繪更多.. – paulm
不要調用直接從'OnDraw()'調用'SetScrollSizes'。這是非常糟糕的做法。當內容改變時需要調用'SetScrollSizes',需要改變滾動位置,然後使用'OnDraw'中的滾動信息。 –