1、創(chuàng)建名為Mouse的SDI項(xiàng)目
初始化一個(gè)二維數(shù)組m_nGrid[x][y]
=0(用于在視圖中顯示藍(lán)色或紅色方框)cursors[] (構(gòu)造鼠標(biāo)形狀信息的數(shù)組) m_hCursor[15](把預(yù)定義的光標(biāo)加載到一個(gè)數(shù)組中,當(dāng)用戶(hù)在工作區(qū)中移動(dòng)鼠標(biāo)時(shí)使用該數(shù)組)。
struct
{
char* id;
char szName[255];
} cursors[]={
IDC_APPSTARTING,"IDC_APPSTARTING",//箭頭和小沙漏的組合
IDC_ARROW,"IDC_ARROW", //標(biāo)準(zhǔn)箭頭
IDC_CROSS,"IDC_CROSS", //當(dāng)處于文本文檔或編輯控件中時(shí)通常會(huì)見(jiàn)到的十字形光標(biāo)
//IDC_HAND,"IDC_HAND",手型光標(biāo)
IDC_HELP,"IDC_HELP", //用于表示上下文敏感幫助的箭頭和問(wèn)號(hào)圖標(biāo)
IDC_IBEAM,"IDC_IBEAM", //與IDC_CROSS相同
IDC_ICON,"IDC_ICON", //用于4.0或更早的版本,已不用
IDC_NO,"IDC_NO", //帶杠的圓,用于表示拖放操作中不能作為放置對(duì)象的目標(biāo)
IDC_SIZE,"IDC_SIZE", //用于4.0或更早的版本,已不用
IDC_SIZEALL,"IDC_SIZEALL", //四向箭頭,分別指向東、南,西、北,用于表名對(duì)象可按箭頭所指方向改變大小
IDC_SIZENESW,"IDC_SIZENESW", //雙向箭頭,分別指向東北、西南,用于表名對(duì)象可按箭頭所指方向改變大小
IDC_SIZENS,"IDC_SIZENS", //雙向箭頭,分別指向北、南,用于表名對(duì)象可按箭頭所指方向改變大小
IDC_SIZENWSE,"IDC_SIZENWSE", //雙向箭頭,分別指向西北、東南,用于表名對(duì)象可按箭頭所指方向改變大小
IDC_UPARROW,"IDC_UPARROW", //垂直箭頭
IDC_WAIT,"IDC_WAIT" //沙漏,表示耗時(shí)很長(zhǎng)的操作正在進(jìn)行
};
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、工作區(qū)的圖像處理
把工作區(qū)分成100塊,根據(jù)鼠標(biāo)事件改變m_nGrid[x][y]的值使相應(yīng)的區(qū)域的顏色發(fā)生改變
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、兩個(gè)輔助函數(shù)
ShowMouseInfo的功能是改變m_nGrid的值改變圖像還有就是把點(diǎn)擊的位置和數(shù)遍的信息顯示出來(lái);
GetCursorRegion的功能是獲得數(shù)組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);
//該函數(shù)向指定的窗體添加一個(gè)矩形,然后窗口客戶(hù)區(qū)域的這一部分將被重新繪制
UpdateWindow();
//通過(guò)發(fā)送重繪消息 WM_PAINT 給目標(biāo)窗體來(lái)更新目標(biāo)窗體客戶(hù)區(qū)的無(wú)效區(qū)域
}
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、鼠標(biāo)移動(dòng)、左鍵按下和光標(biāo)的改變事件
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 閱讀(454)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
VC實(shí)踐