MFC 加载 光标

    技术2022-05-20  34

     

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


    最新回复(0)