SetIcon

SetIcon圖示將會被自動地放到按鈕的上面,預設時居中放置。如果圖示太大,則會自動剪裁。

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給做掉了。

相關詞條

相關搜尋

熱門詞條

聯絡我們