SetCursor(AfxGetApp()->LoadCursor(IDC_ARROW));//为什么不能加载
SetCursor(LoadCursor(NULL,IDC_ARROW));//这样却可以
两句有什么区别?
第一句中LoadCursor(IDC_ARROW)中的IDC_ARROW是LPCTSTR类型 ,表示系统默认光标,而LoadCursor中的参数是UINT,当然不行
第二句中LoadCursor是API函数,它要求传入一个应用程序实例句柄和LPCTSTR的光标资源名称,当第一个参数为NULL时,表示加载的是系统光标,而非应用程序中的资源,这样一来,第一个参数,传入IDC_ARROW,正好可以加载系统光标。
获取系统光标需使LoadCursor()的参数hInstance=NULL:
HCURSOR hCursor = ::LoadCursor(NULL , IDC_HAND);
所以不能使用如下形式:AfxGetApp()->LoadCursor(IDC_HAND);
获取自定义光标:
HCURSOR hCursor = AfxGetApp()->LoadCursor(MAKEINTRESOURCE(IDC_MYCURSOR));
或::LoadCursor(AfxGetApp()->m_hInstance , MAKEINTRESOURCE(IDC_MYCURSOR) );
BOOL CTestDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { BOOL result; HCURSOR hCursor = ::LoadCursor(NULL , IDC_HAND); if(hCursor) { ::SetCursor(hCursor); result = TRUE; } else { result = CDialog::OnSetCursor(pWnd, nHitTest, message); } return result; }
判断光标在不在矩形区域内
BOOL CMouseCursorView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { CPoint pt; if (::GetCursorPos(&pt)) { ScreenToClient(&pt); if (m_rc.PtInRect(pt)) { ::SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR1)); return TRUE; } else return CView::OnSetCursor(pWnd, nHitTest, message); } }