(1)加载资源ID,可以是系统自带的(如ID_CROSS),或者是程序员自己加入的光标ID:HCURSOR hCursor = ::LoadCursor(NULL,MAKEINTRESOURCE(IDC_CROSS)); SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)hCursor ); //或者指针::SetClassLongPtr(this->GetSafeHwnd(),GCL_HCURSOR,(LONG_PTR) hCursor);
(2)从.cur或.ani文件加载:HCURSOR hCursor= ::LoadCursorFromFile( _T("hand.cur"));SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)hCursor );
注意:SetClassLong()才能保证设置新光标后,以后一直是新光标.而如果只是SetCursor()只是变化成新光标,马上就还原了,不行.如要用SetCursor(),还需要拦截WM_SETCURSOR消息,然后修改OnSetCursor()函数:BOOL CMFC_frameView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message){ // TODO: 在此添加消息处理程序代码和/或调用默认值
if ( m_hcursor != NULL) { ::SetCursor( m_hcursor);//m_hcursor为前面设置的光标句柄 return TRUE; //注意,一定要return TRUE,否则下面下面的基类CView::OnSetCursor()后 //光标又被还原了 }
return CView::OnSetCursor(pWnd, nHitTest, message);}
不拦截WM_SETCURSOR消息只是SetCursor(),是没用的.
使用SetClassLong函数要小心。例如,可以通过使用SetClassLong来改变类的背景颜色,但是这种改变不会马上生效,直到属于该类的窗体下次重绘,除非使用UpdateWindow()强迫窗体更新。