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);
}