複製鏈接
請複製以下鏈接發送給好友

SetIcon

鎖定
SetIcon圖標將會被自動地放到按鈕的上面,缺省時居中放置。如果圖標太大,則會自動剪裁。
中文名
SetIcon
返回值
此前在按鈕上設置的圖標的句柄
參    數
hIcon圖標的句柄
説    明
本成員函數用於設置按鈕的圖標
內容簡介
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 dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(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給做掉了。 [1] 
參考資料