要實(shí)現(xiàn)的功能實(shí)際上很簡單,一般人都用到見慣不慣了,但是實(shí)現(xiàn)起來還是有點(diǎn)意思的。
問題詳細(xì)描述:(三步)
單擊鼠標(biāo)左鍵時(shí)記錄下單擊點(diǎn);
鼠標(biāo)拖動(dòng)時(shí),顯示的矩形框能夠動(dòng)態(tài)的跟隨顯示;
釋放鼠標(biāo)左鍵時(shí)擦出矩形框。
這樣分析其實(shí)問題就簡單一些了,只需要對鼠標(biāo)的三個(gè)事件進(jìn)行相應(yīng)就可以了。
代碼主要在三處地方修改了:
第一處:VIEW類中設(shè)置私有變量(VIEW類.h文件中)
private:
BOOL m_startRect; //繪制矩形框標(biāo)志
CPoint m_startPoint; //矩形框開始點(diǎn)
CPoint m_OldPoint; //矩形框終點(diǎn)(但是它是上一次的點(diǎn),所以這里用了Old標(biāo)識(shí))
第二處:VIEW類構(gòu)造函數(shù)中初始化私有變量(VIEW類.cpp文件中)
CMouseDragView::CMouseDragView()
{
//初始化私有變量
m_startRect = FALSE;
m_startRect = 0;
m_OldPoint = 0;
}
第三處:定義消息響應(yīng)函數(shù)(VIEW類.cpp文件中)
//單擊鼠標(biāo)左鍵
void CMouseDragView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_startRect = TRUE; //鼠標(biāo)左鍵單擊,設(shè)置可以開始繪制矩形框
m_startPoint = point; //記錄開始點(diǎn)
m_OldPoint = point; //設(shè)置老點(diǎn)也為開始點(diǎn)
CView::OnLButtonDown(nFlags, point);
}
//拖動(dòng)鼠標(biāo)
void CMouseDragView::OnMouseMove(UINT nFlags, CPoint point)
{
CClientDC dc(this); //獲取設(shè)備句柄
//SetRop2 Specifies the new drawing mode.(MSDN)
//R2_NOT Pixel is the inverse of the screen color.(MSDN)
//即:該函數(shù)用來定義繪制的顏色,而該參數(shù)則將顏色設(shè)置為原屏幕顏色的反色
//這樣,如果連續(xù)繪制兩次的話,就可以恢復(fù)原來屏幕的顏色了(如下)
//但是,這里的連續(xù)兩次繪制卻不是在一次消息響應(yīng)中完成的
//而是在第一次拖動(dòng)響應(yīng)的繪制可以顯示(也就是看到的),第二次拖動(dòng)繪制實(shí)現(xiàn)擦出(也就看不到了)
dc.SetROP2(R2_NOT); //此為關(guān)鍵!!!
dc.SelectStockObject(NULL_BRUSH); //不使用畫刷
if (TRUE == m_startRect) //根據(jù)是否有單擊判斷是否可以畫矩形
{
dc.Rectangle(CRect(m_startPoint,m_OldPoint));
dc.Rectangle(CRect(m_startPoint,point));
m_OldPoint = point;
}
CView::OnMouseMove(nFlags, point);
}
//釋放鼠標(biāo)左鍵
void CMouseDragView::OnLButtonUp(UINT nFlags, CPoint point)
{
m_startRect = FALSE; //重置繪制矩形框標(biāo)志
//消隱最后的一個(gè)矩形(其原理跟拖動(dòng)時(shí)矩形框繪制原理相同)
CClientDC dc(this);
dc.SetROP2(R2_NOT);
dc.SelectStockObject(NULL_BRUSH);
dc.Rectangle(CRect(m_startPoint,m_OldPoint));
CView::OnLButtonUp(nFlags, point);
}