界面上有个刷新按钮,点击后没什么反应,不像windows桌面一样,所有图标会闪一下,所以就想了加一个鼠标等待效果
实现方法如下:
响应WM_SETCURSOR事件:
BEGIN_MESSAGE_MAP(CTabPage, CDialog) //{{AFX_MSG_MAP(CDialogEx) //}}AFX_MSG_MAP ON_WM_SETCURSOR() END_MESSAGE_MAP()
.h文件中添加
public: DWORDm_dwClickTime; afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
.cpp文件
BOOL CTabPage::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { if (GetTickCount() - m_dwClickTime < 1000) { Sleep(200); //保持形状200毫秒 } return CDialog::OnSetCursor(pWnd, nHitTest, message); }
在需要改变鼠标的地方使用SetCursor设置鼠标形状
void CTabPage::SetWaitCursor() { m_dwClickTime = GetTickCount(); HCURSOR hCur = ::LoadCursor( NULL,IDC_WAIT); ::SetCursor(hCur); }
其实直接使用SetCursor是可以成功设置鼠标形状的,但是鼠标移动,新形状会消失。我尝试了下,使用鼠标点击基本看不到鼠标的变化,使用回车来点击按钮可以看到鼠标变化,鼠标一动就消失。
下面这种方法可以长期保持鼠标的形状:
SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (LONG)LoadCursor(NULL, IDC_WAIT));
但是鼠标设置后不会自动还原,需要手动再设置成 IDC_ARROW 样式,另外我发现设置成功之后,当鼠标仍在按钮上时,形状是没有变化的,移到空白的地方才会变。
由于我的需求比较简单,只要鼠标闪下就可以,所以还是用上面的方法比较简单。
OnSetCursor里也可以直接返回true来保护鼠标状态,但鼠标如果不动不会自动还原。
附上鼠标形状参数:
IDC_APPSTARTING 标准的箭头和小沙漏
IDC_ARROW 标准的箭头
IDC_CROSS 十字光标
IDC_HAND Windows 98/Me, Windows 2000/XP: Hand
IDC_HELP 标准的箭头和问号
IDC_IBEAM 工字光标
IDC_ICON Obsolete for applications marked version 4.0 or later.
IDC_NO 禁止圈
IDC_SIZE Obsolete for applications marked version 4.0 or later. Use IDC_SIZEALL.
IDC_SIZEALL 四向箭头指向东、西、南、北
IDC_SIZENESW 双箭头指向东北和西南
IDC_SIZENS 双箭头指向南北
IDC_SIZENWSE 双箭头指向西北和东南
IDC_SIZEWE 双箭头指向东西
IDC_UPARROW 垂直箭头
IDC_WAIT 沙漏,Windows7系统下会显示为选择的圆圈表示等待
发表评论