1、创建名为Mouse的SDI项目
初始化一个二维数组m_nGrid[x][y]
=0(用于在视图中显示蓝色或红色方框)cursors[] (构造鼠标形状信息的数组) m_hCursor[15](把预定义的光标加载到一个数组中,当用户在工作区中移动鼠标时使用该数组)。
struct
{
char* id;
char szName[255];
} cursors[]={
IDC_APPSTARTING,"IDC_APPSTARTING",//箭头和小沙漏的组合
IDC_ARROW,"IDC_ARROW", //标准箭头
IDC_CROSS,"IDC_CROSS", //当处于文本文档或编辑控件中时通常会见到的十字形光标
//IDC_HAND,"IDC_HAND",手型光标
IDC_HELP,"IDC_HELP", //用于表示上下文敏感帮助的箭头和问号图标
IDC_IBEAM,"IDC_IBEAM", //与IDC_CROSS相同
IDC_ICON,"IDC_ICON", //用于4.0或更早的版本,已不用
IDC_NO,"IDC_NO", //带杠的圆,用于表示拖放操作中不能作为放置对象的目标
IDC_SIZE,"IDC_SIZE", //用于4.0或更早的版本,已不用
IDC_SIZEALL,"IDC_SIZEALL", //四向箭头,分别指向东、南,西、北,用于表名对象可按箭头所指方向改变大小
IDC_SIZENESW,"IDC_SIZENESW", //双向箭头,分别指向东北、西南,用于表名对象可按箭头所指方向改变大小
IDC_SIZENS,"IDC_SIZENS", //双向箭头,分别指向北、南,用于表名对象可按箭头所指方向改变大小
IDC_SIZENWSE,"IDC_SIZENWSE", //双向箭头,分别指向西北、东南,用于表名对象可按箭头所指方向改变大小
IDC_UPARROW,"IDC_UPARROW", //垂直箭头
IDC_WAIT,"IDC_WAIT" //沙漏,表示耗时很长的操作正在进行
};
CMouseView::CMouseView()
{
// TODO: add construction code here
for(int y=0;y<10;y++)
for(int x=0;x<10;x++)
m_nGrid[x][y]=0;
for(int i=0;i<15;i++)
m_hCursor[i]=::LoadCursor(NULL,cursors[i].id);
}
2、工作区的图像处理
把工作区分成100块,根据鼠标事件改变m_nGrid[x][y]的值使相应的区域的颜色发生改变
void CMouseView::OnDraw(CDC* pDC)
{
CMouseDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
RECT Rect;
GetClientRect(&Rect);
CBrush RedBrush(RGB(255,0,0));
CBrush BlueBrush(RGB(0,0,255));
CBrush WhiteBrush(RGB(255,255,255));
CBrush * pUseBrush;
for(int y=0;y<10;y++)
for(int x=0;x<10;x++)
{
RECT DrawRect;
DrawRect.left=(x*Rect.right)/10;
DrawRect.top=(y*Rect.bottom)/10;
DrawRect.right=DrawRect.left+(Rect.right/10);
DrawRect.bottom=DrawRect.top+(Rect.bottom/10);
pUseBrush=&WhiteBrush;
if(m_nGrid[x][y]==1)
pUseBrush=&BlueBrush;
else if(m_nGrid[x][y]==2)
pUseBrush=&RedBrush;
pDC->FillRect(&DrawRect,pUseBrush);
}
}
3、两个辅助函数
ShowMouseInfo的功能是改变m_nGrid的值改变图像还有就是把点击的位置和数遍的信息显示出来;
GetCursorRegion的功能是获得数组m_hCursor的位置
void CMouseView::ShowMouseInfo( const char * lpszText, CPoint point, int nFlag /* = -1 */ )
{
//if(m_nInfoMode==MOUSE_SHOWGRID)
int x,y;
if(nFlag!=-1)
{
RECT Rect;
GetClientRect(&Rect);
x=(point.x*10)/Rect.right;
y=(point.y*10)/Rect.bottom;
if(m_nGrid[x][y]==nFlag)
m_nGrid[x][y]=0;
else
m_nGrid[x][y]=nFlag;
InvalidateRect(NULL,FALSE);
//该函数向指定的窗体添加一个矩形,然后窗口客户区域的这一部分将被重新绘制
UpdateWindow();
//通过发送重绘消息 WM_PAINT 给目标窗体来更新目标窗体客户区的无效区域
}
CClientDC ClientDC(this);
CString strInfo;
strInfo.Format("X:%d Y:%d %s ",point.x,point.y,lpszText);
ClientDC.TextOut(point.x,point.y,strInfo,strInfo.GetLength());
}
int CMouseView::GetCursorRegion(POINT *lpPt)
{
RECT Rect;
GetClientRect(&Rect);
int x=(lpPt->x*4)/Rect.right;
if(x>3)
x=3;
int y=(lpPt->y*4)/Rect.bottom;
if(y>3)
y=3;
return (y*4+x);
}
4、鼠标移动、左键按下和光标的改变事件
void CMouseView::OnMouseMove(UINT nFlags, CPoint point)
{
CClientDC ClientDC(this);
CPoint pt;
pt=point;
ClientToScreen(&pt);
CString strInfo;
strInfo.Format( "X:%d Y:%d ScnX:%d ScnY:%d ",point.x, point.y,pt.x, pt.y );
ClientDC.TextOut(10,10,strInfo,strInfo.GetLength());
int nCursor=GetCursorRegion(&point);
CString strInfo2;
strInfo2.Format("Cursor:%s ,%d ",cursors[nCursor].szName,nCursor);
ClientDC.TextOut(10,40,strInfo2,strInfo2.GetLength());
CView::OnMouseMove(nFlags, point);
}
void CMouseView::OnLButtonDown(UINT nFlags, CPoint point)
{
ShowMouseInfo("LButtonDown",point,1);
CView::OnLButtonDown(nFlags, point);
}
BOOL CMouseView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
POINT pt;
GetCursorPos(&pt);
ScreenToClient(&pt);
int nCursor = GetCursorRegion( &pt );
::SetCursor(m_hCursor[nCursor]);
return( TRUE );
//return CView::OnSetCursor(pWnd, nHitTest, message);
}
posted on 2009-07-03 11:21
The_Moment 阅读(440)
评论(0) 编辑 收藏 引用 所属分类:
VC实践