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.
// 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处设置一个端点,单步进去,看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给做掉了。