posts - 29,comments - 10,trackbacks - 0
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 阅读(442) 评论(0)  编辑 收藏 引用 所属分类: VC实践

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理