VC++&MFC之seticon

转载自:

http://baike.baidu.com/link?url=1dv3PoBIjP2vtr_wbvFaEP1woomAU2vAcheZ7V372uAAgcNDrkJa0qWLgIHgUuCyxT3F3DPuZwSpPQJoU7fT0_

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给做掉了。 [1]  

VC++6.0的MFC框架下,可以使用CDC类来进行绘图操作。下面是一个简单的例子: 1. 在MFC应用程序中添加一个对话框。 2. 在对话框类的头文件中添加以下代码: ``` class CMyDlg : public CDialog { public: CMyDlg(CWnd* pParent = NULL); //{{AFX_DATA(CMyDlg) enum { IDD = IDD_MY_DIALOG }; //}}AFX_DATA //{{AFX_VIRTUAL(CMyDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); //}}AFX_VIRTUAL protected: HICON m_hIcon; //{{AFX_MSG(CMyDlg) virtual BOOL OnInitDialog(); afx_msg void OnPaint(); //}}AFX_MSG DECLARE_MESSAGE_MAP() public: afx_msg void OnMouseMove(UINT nFlags, CPoint point); }; ``` 3. 在对话框类的实现文件中添加以下代码: ``` BOOL CMyDlg::OnInitDialog() { CDialog::OnInitDialog(); // 设置图标 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 return TRUE; } void CMyDlg::OnPaint() { CPaintDC dc(this); // 用于绘制的设备上下文 // TODO: 在此处添加消息处理程序代码 // 不要在调用 CDialog::OnPaint() 前绘制 // 绘制一个矩形 dc.Rectangle(20, 20, 100, 100); } void CMyDlg::OnMouseMove(UINT nFlags, CPoint point) { CClientDC dc(this); // 用于绘制的设备上下文 // 绘制一个圆形 dc.Ellipse(point.x - 10, point.y - 10, point.x + 10, point.y + 10); CDialog::OnMouseMove(nFlags, point); } BEGIN_MESSAGE_MAP(CMyDlg, CDialog) //{{AFX_MSG_MAP(CMyDlg) ON_WM_PAINT() ON_WM_MOUSEMOVE() //}}AFX_MSG_MAP END_MESSAGE_MAP() ``` 4. 在资源视图中添加一个按钮,双击打开对话框类的消息映射器,添加以下代码: ``` void CMyDlg::OnBnClickedButton1() { // 显示对话框 DoModal(); } ``` 5. 编译并运行程序,点击按钮,即可看到绘图效果。 在以上例子中,通过CPaintDC和CClientDC类获取设备上下文,然后使用设备上下文对象的成员函数进行绘图操作。例如,使用Rectangle函数绘制矩形,使用Ellipse函数绘制圆形。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值