微软知识库有一篇文章Q131991描述了三种方法来改变基于MFC应用的鼠标光标。其中一种方法是重载CWnd::PreCreateWindow()函数注册自己的要改变鼠标指针的窗口类。这个方法对于要始终使用一个鼠标光标的应用程序很适合。
如果在应用程序中要动态改变鼠标光标,微软知识库的这篇文章建议重载CWnd::OnSetCursor()来实现。但是这种方法有一个缺点,就是当设置鼠标光标及还原时都会出现令人讨厌的光标闪烁。
如果应用程序中要使用几个不同的鼠标光标,为了不发生任何光标闪烁,本文介绍一种方法:首先按照微软知识库文章所说重载PreCreateWindow函数,但是不要指定要使用的鼠标光标,而是使用NULL。这样就防止了Windows或MFC针对鼠标指针做任何操作。
BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
// 创建自己的窗口类,窗口不设置光标,以便根据需要进行设置
if (cs.lpszClass == NULL)
cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS);
return CScrollView::PreCreateWindow(cs);
}
因为窗口类没有任何事先指定好的的鼠标指针,所以以上代码有效地派出了光标的闪烁。(注意这段代码创建的窗口类也没有背景刷,所以窗口的背景色需要自己画。为此要向函数AfxRegisterWndClass()传递第三个参数作为背景刷。)
光标的闪烁是消除了,但同时光标也没了!不用担心。在处理鼠标事件OnMouseMove时设置光标是很容易的事情。实践证明,如果要在应用窗口中改变鼠标指针,在OnMouseMove事件处理模块中设置光标是最方
便的。
void CMyView::OnMouseMove(UINT nFlags, CPoint point)
{
// 设置光标表示当前的操作
if (m_nOperation == OPERATION_1)
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_CROSS));
else if (m_nOperation == OPERATION_2)
::SetCursor(AfxGetApp()->LoadStandardCursor( ??? ));
else // 普通光标指针
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
}
尽管要做一点额外的工作,但它实现了应用中不同的鼠标指针变化,同时消除了闪烁。
进入讨论组讨论。相关专题
- 胆小者勿看 骷髅键盘鼠标惊悚外观(图) (38次浏览)
- 十米无线 四款2.4GHz无线鼠标平民买得起 (27次浏览)
- 贴身伴侣 十款精美笔记本鼠标节前导购 (23次浏览)
- 公认实惠 100元以下4款超值鼠标推荐 (23次浏览)
- 选购必看 网友不买无线鼠标5大理由 (23次浏览)
- 拿什么来爆头 4款200元超值游戏鼠标推荐 (18次浏览)
- 解读工包七个分类与最无耻假货曝光 (18次浏览)
- 办公也要讲卫生 轻松清理键盘全攻略 (18次浏览)
- 罗技微软双飞燕 近期7款大牌键鼠新品推荐 (16次浏览)
- 看重认可度 六款最受关注键鼠套装推荐 (15次浏览)



