MFC 加载 光标

 

(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()强迫窗体更新。

你可能感兴趣的:(MFC)