2015-11-24 95 views
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次。

我真的不明白髮生了什麼事。

+0

你怎麼知道該函數反覆叫什麼名字?你在函數中有沒有斷點,並且每次你繼續斷點都會再次被打中?這可能是因爲Visual Studio的(我猜你使用VS?)窗口是最有可能掩蓋你的程序的窗口,當你繼續你的窗口被帶到前面,但因爲它是掩蓋它需要這樣redrawed' OnDraw'被調用,你打你的斷點。等等,並在... –

+0

嗯..每次它需要繪製時調用OnDraw,如果你正在調試和覆蓋/移動窗口/改變焦點,它將需要重繪更多.. – paulm

+0

不要調用直接從'OnDraw()'調用'SetScrollSizes'。這是非常糟糕的做法。當內容改變時需要調用'SetScrollSizes',需要改變滾動位置,然後使用'OnDraw'中的滾動信息。 –

回答

2

請勿直接從OnDraw()呼叫SetScrollSizes。這是非常糟糕的做法。呼叫SetScrollSizes當需要滾動位置改變的方式內容的變化,然後使用滾動信息中OnDraw

否則,如果OnDraw決定滾動大小發生改變,這將改變顯示的信息量,這將需要調用OnDraw,否則最終會產生無限循環,然後,作爲更改的結果,會更改滾動大小,這意味着信息必須重新顯示。

相關問題