3.创建对话框的代码
3.1 OnPaint
void CDrawButtonDlg::OnPaint() //接收到绘图消息WM_PAINT时调用此函数!
{
//是否为最小化窗口
if (IsIconic())
{
CPaintDC dc(this); // device context for painting 用于画图
//图标背景删除
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
//把图标(icon)放到客户区中心位置
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);//取得客户区 矩形大小
//计算x,y 坐标
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
//用dc.DrawIcon 画 图标.
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
当Windows或应用程序请求重画应用程序窗口的一部分时,框架调用这个成员函数。WM_PAINT在调用UpdateWindow或RedrawWindow成员函数时发出。当设置了RDW_INTERNALPAINT标志并调用RedrawWindow成员函数时,窗口可能会接收到内部重画消息。在这种情况下,窗口可能没有更新区域。应用程序必须调用GetUpdateRect成员函数以确定窗口是否具有更新区域。如果GetUpdateRect返回0,则应用程序不应调用BeginPaint和EndPaint成员函数。
应用程序负责检查是否需要内部重画或更新,这可通过查看每条WM_PAINT消息的内部数据结构来完成,因为一条WM_PAINT可能是由于一个无效区域或由于使用RDW_INTERNALPAINT标志调用了RedrawWindow成员函数而引起的。
Windows只发送一次内部WM_PAINT消息。在通过UpdateWindow成员函数向窗口发送了内部WM_PAINT消息以后,将不会再向窗口发送其它WM_PAINT消息,直到再次使用RDW_INTERNALPAINT标志调用了RedrawWindow成员函数。
============================================================================================
3.2 OnQueryDragIcon
在用户拖拉最小化窗口的时候为了显示光标,调用这个函数。
// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CDrawButtonDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
返回值
一个双字值,它在低位字中包含了光标或图标的句柄。光标和图标必须与显示器的分辨率匹配。如果应用程序返回NULL,则系统将显示缺省的光标。缺省的返回值是NULL。
如果应用程序 返回图标或光标的句柄,系统将它转换为黑与白。
这个句柄必须标识与显示设备分辨率相兼容的单色光标或图标。应用程序可以调用CWinApp::LoadCursor或CWinApp::LoadIcon成员函数以从它的可执行文件的资源中载入光标或图标并获得其句柄。
============================================================================================
3.3系统响应函数OnSysCommand:主要是截获控制命令的(只是系统命令)
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
框架调用这个成员函数以允许你的应用程序处理一个windows消息。
应用程序可以在任何时候通过向OnSysCommand发送WM_SYSCOMMAND消息来执行任何系统命令。
这个函数响应系统控制菜单的命令.(即左上角图标处)。
OnSysCommand:The framework calls this member function when the user selects a command from the Control menu, or when the user selects the Maximize or the Minimize button.
可以用来获取最大化、最小化、关闭、About等动作发出的系统消息,并可以进行重写。
使用MFC编程的人,在函数里写自己的逻辑。当然也有必要调用一下它的父类这个函数,以便让系统处理一些默认的功能,有如下伪代码表示这个意思:
void OnSysCommand(UINT nID, LPARAM lParam)
{
if("命令码" == 我要专门处理的命令码)
{
这个事儿我来做
}else
{
这些个事儿还是系统来处理
CMainFrame::OnSysCommand(nID, lParam) ;
}
}
至于这个函数谁来调用,那是MFC内核的事情,会调到你自己写的这个重载函数,所以你只要把逻辑写入到这里面就可以了
不同于PreTranslateMessage--截获消息。
这里就要弄清:系统命令消息和一般的消息的区别了?
注意:类CCmdTarget是MFC类库中消息映射体系的一个基类。消息映射把命令或消息引导给用户为之编写的响应函数(命令是由菜单项、命令按钮或者加速键产生的消息!!!)。