MFC3.鼠标形状

 
VC3.鼠标形状
以下代码在VC++6.0编译通过
1.光标的13个形状
1.IDC_ARROW,
2.IDC_IBEAM,
3.IDC_WAIT,
4.IDC_CROSS,
5.IDC_UPARROW,
6.IDC_SIZENWSE,
7.IDC_SIZENESW,
8.IDC_SIZEWE,
9.IDC_SIZENS,
10.IDC_SIZEALL,
11.IDC_NO,
12.IDC_APPSTARTING,
13.IDC_HELP
 
2.code demo
下面代码把客户区分为了4 X 4共16个方块区域,鼠标在不同的区标显示不同的鼠标形状
 
第一步,建立相关全局static数组和类的私有成员
在视图类的*.H头文件类声明的前面添加两个数组
static CString strCursor[] = {
                "IDC_ARROW",        "IDC_IBEAM", "IDC_WAIT",    "IDC_CROSS", 
                "IDC_UPARROW",    "IDC_SIZENWSE",    "IDC_SIZENESW", "IDC_SIZEWE",
                "IDC_SIZENS", "IDC_SIZEALL",       "IDC_NO",        "IDC_APPSTARTING",
                "IDC_HELP",     "IDC_ARROW",        "IDC_ARROW",        "IDC_ARROW" };
//set cursor *name
static char *szCursor[] = {
                IDC_ARROW, IDC_IBEAM, IDC_WAIT,
                IDC_CROSS, IDC_UPARROW, IDC_SIZENWSE,
                IDC_SIZENESW, IDC_SIZEWE, IDC_SIZENS,
                IDC_SIZEALL, IDC_NO, IDC_APPSTARTING,
                IDC_HELP, IDC_ARROW, IDC_ARROW, IDC_ARROW };
 
 
 
在视图类的*.H头文件在视图类内部
添加一个私用光标数组变量来用存储16个光标
private:
        HCURSOR m_hCursor[16];
添加一个公有成员函数的声明
public:
        int GetCursorindex(POINT*);
 
*****************************************************************************
2第二步是在CMouseView类中实现*.CPP文件中
2.1手工添加类视图类的构造函数初始化光标数组变量
CCURSORView::CCURSORView()
{
// Load the cursors.
for( int i=0; i<16; i++ )
m_hCursor[i] =::LoadCursor( NULL, szCursor[i] );
}
 
2.2手工添加计算客户区的方块位置函数
int CCURSORView::GetCursorindex(POINT* pt)
{
        RECT Rect;
        GetClientRect( &Rect );
        int x =       ( pt->x * 4 ) / Rect.right;
        if( x > 3 ) x = 3;
        int y =       ( pt->y * 4 ) / Rect.bottom;
        if( y > 3 ) y = 3;
 
        return( y * 4 + x );// get 0-15.
}
 
2.32.3这个函数就会根据鼠标在客户区不同位置,在0,0输出不同的光标的名字
用类向导添加MouseMove消息的响应函数,
类向导自动为我们生成此函数的消息映射的声明和定义
afx_msg void OnMouseMove(UINT nFlags, CPoint point);//消息映射的声明
ON_WM_MOUSEMOVE() //消息映射的定义
并为函数体写上如下代码
void CCURSORView::OnMouseMove(UINT nFlags, CPoint point)
{
        // TODO: Add your message handler code here and/or call default
        InvalidateRect( NULL, TRUE );
        UpdateWindow();
        int nCursor =GetCursorindex( &point );
        CClientDC ClientDC( this );
        CString strInfo;
        strInfo = "Cursor:" +strCursor[nCursor] +"           ";
        ClientDC.TextOut( 0, 0,strInfo, strInfo.GetLength() );
        CView::OnMouseMove(nFlags, point);
}
 
 
2.3这个函数就会根据鼠标在客户区不同位置生成不同的光标形状
用类向导添加WM_SETCURSOR设置的响应函数,
类向导自动为我们生成此函数的消息映射的声明和定义
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);//消息映射的声明
ON_WM_SETCURSOR()    //消息映射的定义
并为函数体写上如下代码
BOOL CCURSORView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
        //if(nHitTest == HTCLIENT)//如果光标是在客户区
        //{
                POINT pt;
                GetCursorPos( &pt );
                ScreenToClient( &pt );
                int index = GetCursorindex( &pt );
                ::SetCursor( m_hCursor[index] );
                return( TRUE );
        //}
        return CView::OnSetCursor(pWnd, nHitTest, message);
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值