用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、调用CWnd::Create函数手动创建编辑框、下拉控件以及按钮等控件; 2、调用CWnd::CreateEx函数手动创建下陷风格的编辑框和列表控件等; 3、调用CWnd::Create函数手动创建日期控件;
CWnd *pWnd=CWnd::FindWindow(NULL,str); if(pWnd) pWnd->SendMessage(WM_COMM,0,0); } //发送消息命令二 void CSenderDlg::OnCommand2() { //找到接收消息的窗口(窗口名为Receiver) ...
怎样将CWnd转换为HWND和HWND转换为CWnd
你是否还还在用Windows API提供的CFileDialog类来打开文件,用SHBrowseForFolder来打开文件夹,SelectDialog类,是设计的一个既可以打开文件夹,还能打开多个文件的类库,调用方式和CFileDialog相同。
VISUAL_C++的MFC模块 编程实例,使用VC 6.0 ++ 以上版本开发工具
CWnd类提供了微软基础类库中所有窗口类的基本功能。 CWnd对象与Windows的窗口不同,但是两者有紧密联系。CWnd对象是由CWnd的构造函数和析构函数创建或销毁的。另一方面,Windows的窗口是Windows的一种内部数据结构,...
VS2008下创建了model对话框和modeless对话框,验证了函数CDialog::DoModal(),CDialog::Create(),CWnd::ShowWindow(),CWnd::DestroyWindow()的使用。
void TransparentWnd::OnLButtonDown(UINT nFlags, CPoint point) ... CWnd::OnLButtonDown(nFlags, point) //实现无标题拖动 PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x,point.y)) }
通过HWND获得CWnd指针 可以调用CWnd::FromHandle函数
如何通过HWND获得CWnd指针
VC 6.0“显示桌面”程序 一键最小化所有程序,也就是让... CWnd* pWnd = CWnd::FindWindow(_T("Shell_TrayWnd"), NULL); //发送ID为0x1F5(Win M)的WM_HOTKEY消息 pWnd->SendMessage(WM_HOTKEY, 0x1F5); }
要想通过CWnd类控制窗口,必须先取得CWnd类(或派生类)的对像或指针。主要方法有四: 一,系统已经定义好的类。 二,自己定义对像,并操作它。 三,利用类向导为控件关联变量(前面已讲,不再详细讲解)。 四,利用...
自己整理的CWnd类成员函数详解,摘自《MFC类库详解》。
从CWnd直接派生的按钮控件
如何关闭窗口 调用 CWnd::SendMessage函数发送WM_CLOSE消息
根据crkchina在http://topic.csdn.net/u/20081023/22/99b0d49a-d07b-4837-a8df-7f9c4b629bd3.html中对子窗体的要求,写的一个基于CWnd类的透明窗体。 效果还是不进满意,只能等待高手给出更好的意见了。 代码都是...
原文链接:《第十八篇:在SOUI中实现PreTranslateMessage》在MFC中,通常可以通过重载CWnd::PreTranslateMessage这样
CWnd* pWnd = CWnd::GetDesktopWindow(); //获得窗口大小 CRect rect; pWnd->GetClientRect(rect); CString strText = _T(""); strText.Format(_T("桌面窗口大小:%d×%d"), rect.Width(), rect....
学习VC++必备,CWnd类所有函数的中文翻译,共300多个函数,超赞!