在MFC程序中,由于改变光标会造成闪烁,网上已经介绍了一种在CView中消除闪烁的方法,
方法是重载PreCreateWindow,消除系统的光标,然后自己重新设置自己的光标
//以下代码转自VCKBASE
BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
// 创建自己的窗口类,窗口不设置光标,以便根据需要进行设置
if (cs.lpszClass == NULL)
cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS);
return CScrollView::PreCreateWindow(cs);
}
在OnMouseMove或OnTimer中设置光标, 个人推荐在后者中实现,在MouseMove中,鼠标停止时不会改变
void CMyView::OnMouseMove(UINT nFlags, CPoint point)
{
// 设置光标表示当前的操作
if (m_nOperation == OPERATION_1)//当你要求的条件成立时,设置自己的光标
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_MYCURSOR));
else // 同时也要记得,鼠标已经被消除了,在自己的条件不成立时,也要设一个系统默认的光标
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
}
而在CFormView中, 这种方法是不必要的,而且也是无效的,
你只需要重载SetCurSor即可:
BOOL CMyFormView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
return true;//这里直接返回,消除光标
}
///下面继续在OnMouseMove或OnTimer中设置光标
方法是重载PreCreateWindow,消除系统的光标,然后自己重新设置自己的光标
//以下代码转自VCKBASE
BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
// 创建自己的窗口类,窗口不设置光标,以便根据需要进行设置
if (cs.lpszClass == NULL)
cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS);
return CScrollView::PreCreateWindow(cs);
}
在OnMouseMove或OnTimer中设置光标, 个人推荐在后者中实现,在MouseMove中,鼠标停止时不会改变
void CMyView::OnMouseMove(UINT nFlags, CPoint point)
{
// 设置光标表示当前的操作
if (m_nOperation == OPERATION_1)//当你要求的条件成立时,设置自己的光标
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_MYCURSOR));
else // 同时也要记得,鼠标已经被消除了,在自己的条件不成立时,也要设一个系统默认的光标
::SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
}
而在CFormView中, 这种方法是不必要的,而且也是无效的,
你只需要重载SetCurSor即可:
BOOL CMyFormView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
return true;//这里直接返回,消除光标
}
///下面继续在OnMouseMove或OnTimer中设置光标