MFC修改鼠标形状,增加等待效果

2017-09-27 16:18:47  阅读 5093 次 评论 0 条

界面上有个刷新按钮,点击后没什么反应,不像windows桌面一样,所有图标会闪一下,所以就想了加一个鼠标等待效果

mfcchangecursor.gif


实现方法如下:

响应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系统下会显示为选择的圆圈表示等待


本文地址:http://bloguan.com/?id=34
版权声明:本文为原创文章,版权归 博观网 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?