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