IsIconic()和OnPaint()函數

void CSetAddressDlg::OnPaint() 
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}

}

IsIconic()作用是判斷窗口是否處於最小化狀態(點擊了最小化按鈕之後)。

對於普通的對話框來說,如果你在if (IsIconic()) 下面加入AfxMessageBox("haha") ,你會發現消息框並不會彈出。

原因是,if (IsIconic()) 這段代碼是在OnPaint()函數內,當你最小化了對話框之後,雖然IsIconic()的值是TRUE,但是OnPaint()函數並不會運行。因爲OnPaint()響應的是WM_PAINT消息,而WM_PAINT消息是針對客戶區的。一個最小化了的窗口不需要重繪客戶區。

爲了驗證這一點,可以設置一定時器,在OnTimer()函數裏寫上
if(IsIconic()) MessageBeep(MB_OK);
當你點擊最小化按鈕後,你會聽見嘟嘟聲。

那麼這段代碼究竟有什麼用?它是不是永遠不會被執行呢?當然不是。舉兩個例子。
第一,如果你強行發送WM_PAINT消息,它會執行。
第二,特殊的對話框。比如一個ToolBox風格的對話框。這個對話框不顯示在任務欄,在最小化之後它會變成一個很小的一條顯示在桌面上。這時如果它被遮擋,就會出發WM_PAINT消息,從而執行那段代碼。
 
 總之,一般情況下可以不要這段代碼,它的特殊用途我也不是很瞭解,但是我們至少可以知道它是怎麼樣工作的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章