3.24-如何动态的改变某个视图的光标?

来源:互联网 发布:歼15模型淘宝 编辑:程序博客网 时间:2024/05/16 10:04

      每当鼠标指针移动时,Windows通过鼠标指针把WM_SETCURSOR消息传递给窗口,当窗口没有处理WM_SETCURSOR消息时,DefWindowProc()按照下面的方式自动的设置光标:

      ※如果光标位于窗口区域外部,(单击测试代码不等于HI_CLIENT),调用::SetCursor(),设置光标为标准箭头(IDC_ARROW).

    ※如果光标位于窗口区域内部,,(单击测试代码等于HI_CLIENT),调用::SetCursor(),设置光标为与该窗口相关联的WNDCLASS结构的hCursor字段。

这样,通过在自己的代码中处理WM_SETCURSOR消息,当鼠标指针访问窗口的成员区域时,我们就能够动态的选择光标的形状了。

第一步:在视图类中增加HCURSOR类型的成员变量,为每个要显示的光标创建一个变量

HCURSOR m_hcurSquare,m_hcurCircle;

第二步:在视图类的构造函数中增加代码,装载相应的光标,初始化在第一步中声明的HCURSOR成员变量,同时添加光标资源

m_hcurCircle=AfxGetApp()->LoadCursor(IDC_CIRCLE);
 ASSERT(m_hcurCircle != NULL);

 m_hcurSquare=AfxGetApp()->LoadCursor(IDC_SQUARE);
 ASSERT(m_hcurSquare != NULL);

第三步:增加WM_SETCURSOR消息处理函数,

BOOL CDrawView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
 // TODO: Add your message handler code here and/or call default
 // 1 - Use dynamic cursor only in client area
 if( nHitTest == HTCLIENT )
 {
  // 2 - If no dynamic cursor, use cross as default
  if( !m_bDynamicCursor )
  {
   SetCursor( m_hcurCross );
   return TRUE; // Cursor was set
  }
  else
  {
   // 3 - Select correct dynamic cursor
   switch( GetDocument()->m_shape )
   {
    default:
     ASSERT( FALSE );
     break;

    case CDrawDoc::SQUARE:
     SetCursor( m_hcurSquare );
     return TRUE; // Cursor was set

    case CDrawDoc::CIRCLE:
     SetCursor( m_hcurCircle );
     return TRUE; // Cursor was set
   }
  }
 }

 // 4 - Otherwise call base class to get standard cursor
 return CView::OnSetCursor(pWnd, nHitTest, message);
}

原创粉丝点击