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();
}
{
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消息,從而執行那段代碼。 總之,一般情況下可以不要這段代碼,它的特殊用途我也不是很了解,但是我們至少可以知道它是怎么樣工作的。