CButton::SetIcon
HICON SetIcon( HICON hIcon );
可以選擇的對齊方式有:BS_TOP 、 BS_LEFT 、 BS_RIGHT、
BS_CENTER 、 BS_BOTTOM 、 BS_VCENTER
CBitmapButton對象可以用四個點陣圖,而SetIcon只為每個按鈕設定一個圖示。在按鈕被按下時,圖示看起來也向右下角傾斜。
CButton myIconButton2;
// Create an icon button.
myIconButton2.Create(_T("My button"), WS_CHILD|WS_VISIBLE|BS_ICON, CRect(10,10,60,50), pParentWnd, 1);
// If no icon is defined for the button, define the icon to the
// system error icon.
if (myIconButton2.GetIcon() == NULL)
myIconButton2.SetIcon(::LoadIcon(NULL, IDI_ERROR));
用VC嚮導生成的基於對話框的程式中,在對話框的OnInitDialog()函式中,總可以看到如下的代碼段:
BOOL CXXXDlg::OnInitDialog()
{
......
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
......
}
那SetIcon究竟做了什麼事?為什麼需要調用這函式兩次?對於此函式,MSDN上的解釋說:"Call this member function to set the handle to a specific icon, as identified by hIcon."看了後仍然不甚了了。
自己動手,豐衣足食。在SetIcon處設定一個端點,單步進去,看CWnd::SetIcon究竟做了些什麼。像其它MFC中的代碼一樣,CWnd::SetIcon也只是對訊息進行了簡單的封裝。
AFXWIN_INLINE HICON CWnd::SetIcon(HICON hIcon, BOOL bBigIcon)
{
ASSERT(::IsWindow(m_hWnd));
return (HICON)::SendMessage(m_hWnd, WM_SETICON, bBigIcon, (LPARAM)hIcon);
}
喔,原來是向視窗(視窗句柄為m_hWnd)傳送了一個WM_SETICON訊息,再呼出MSDN,對於這個訊息,MSND上有比較詳細的解釋。如訊息名SETICON所揭示的那樣,傳送這個訊息給視窗,是為了讓這個視窗和大圖示(large icon)或者小圖示(small icon)關聯。在用戶按ALT+TAB鍵切換視窗時,顯示的就是大圖示,小圖示就是對話框視窗標題欄上的那個圖示。
同一的參數m_hIcon, 卻帶有TRUE或者FALSE,這是頗讓人感到疑惑的地方。說白了其實也是很簡單的事情,我們在用VC的資源編輯器編輯圖示(icon)時,不是可以選擇不同大小的圖片來進行編輯嗎?這些大小不同的圖,最終都存入到同一個.ico檔案中去了。所以m_hIcon指向的是一組圖示,第二個參數(TRUE或者 FALSE)就是用來指定這一組圖示中某一類大小的圖示的,參數值為TRUE時,指明使用大圖示(32*32相素),FALSE指明使用小圖示 (16*16像素)。
當然,一般程式中我們並沒有對WM_SETICON訊息進行處理,所以這些設定大小圖示的事情,都被默認的訊息處理函式DefWindowProc給做掉了。