SetCursor(AfxGetApp()->LoadCursor(IDC_ARROW));//为什么不能加载
SetCursor(LoadCursor(NULL,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);
}
}