自绘关闭按钮涉及到插入图标资源、鼠标操作、绘制图标的类CDC、设置鼠标形状等操作。
一、至于鼠标操作,必须添加鼠标移动、鼠标左键按下的消息
BEGIN_MESSAGE_MAP(CShowDlg, CDialog)
//{{AFX_MSG_MAP(CShowDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
二、插入图标资源,资源一IDI_ICON1是鼠标在关闭区要显示的形状,资源二IDI_ICON1为鼠标不在关闭区要显示的形状。
void CShowDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
HICON hIcon1=AfxGetApp()->LoadIcon(IDI_ICON1);
CDC *pDC = GetDC();
CBrush br1;
br1.CreateSolidBrush(RGB(0,20,20));
CRect ctrlRct;
ctrlRct.SetRect(50,150,90,190);
/* 为图标添加底色 */
pDC->FillRect(&ctrlRct,&br1);
ctrlRct.SetRect(50,150,90,190);
CPoint pt;
/* 获取当前鼠标在电脑屏幕中的位置 */
GetCursorPos(&pt);
/* 将鼠标在电脑屏幕中的位置转换为窗口位置 */
ScreenToClient(&pt);//此时pt == point都为鼠标在窗口中的相对位置
if(ctrlRct.PtInRect(pt))
{
/* 鼠标在关闭图标按钮内移动 */
#ifndef IDC_HAND
#define IDC_HAND MAKEINTRESOURCE(32649)
#endif /* WINVER >= 0x0500 */
HCURSOR hCur = LoadCursor( NULL , IDC_HAND ) ;
::SetCursor(hCur);
}
else
{
/* 当鼠标不再关闭按钮区域内时,加载显示另一个资源 */
hIcon1=AfxGetApp()->LoadIcon(IDI_ICON2);
}
pDC->DrawIcon(50,150,hIcon1);
DestroyIcon(hIcon1);
DeleteObject(br1);
CDialog::OnMouseMove(nFlags, point);
}
void CShowDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CRect ctrlRct;
/* 设置关闭窗口图标的位置 */
ctrlRct.SetRect(50,150,90,190);
if(ctrlRct.PtInRect(point))
{
AfxMessageBox("关闭窗口");
}
CDialog::OnLButtonDown(nFlags, point);
}
三、设置鼠标形状函数
/* 设置的鼠标形状在本窗口中永久生效 */
SetClassLong(this->GetSafeHwnd(),
GCL_HCURSOR ,
(LONG)LoadCursor(NULL , IDC_ARROW));
而
/* SetCursor设置的鼠标形状只是临时生效,当鼠标移动时没有进行设置则会显示默认鼠标形状 */
#ifndef IDC_HAND
#define IDC_HAND MAKEINTRESOURCE(32649)
#endif /* WINVER >= 0x0500 */
HCURSOR hCur = LoadCursor( NULL , IDC_HAND ) ;
::SetCursor(hCur);
四、鼠标移动函数的MSDN定义
afx_msg void OnMouseMove(
UINT nFlags,
CPoint point
);
当鼠标移动时调用此函数 。
参数:
nFlags
指示各种虚拟按键是否按下 ,此参数可以是任何下列值的组合:
MK_CONTROL当CTRL键按下时。
MK_LBUTTON当鼠标左键按下时。
MK_MBUTTON当鼠标中键按下时。
MK_RBUTTON当鼠标右键按下时.
MK_SHIFT当SHIFT按下时。
point:鼠标的X,Y坐标:该坐标为 鼠标距离截获该消息的窗口左上角的位置 是一个相对位置而不是在屏幕像素上的绝对位置。
例如:当窗口的左上角坐标为(10,10)那么当鼠标在屏幕的(10,10)像素点的时候,OnMouseMove函数point值为(0,0)因为是相对窗口左上角的相对位置。