橡皮線的工作原理:就必須不停地在新位置畫出線段,並把以前的畫出的線段擦掉。如果背景是單一的顏色,那就好辦了,只需要構造一支背景顏色的畫筆和一支前景顏色的畫筆,然後首先用背景色畫筆擦出上次的線段,再用前景顏色的畫筆畫出新的線段,就可以實現橡皮線了。由於橡皮線的起點是不變的,而終點在不停地改變,因此,還需要記錄下前一條線段的終點位置。
但是,這種方法還有問題存在,乙個問題是假如背景色不是單一的,就不好辦了。另乙個問題就算是單一背景色,移動的橡皮線還會把已存在的圖形破壞掉。其解決辦法是採用混合模式。
如果在畫橡皮條是直接把線條混合模式設定為r2_not(反色)模式,則負負得正,畫兩次剛好回到螢幕上的圖形。也可以設定為r2_notxorpen(非異或)模式或者r2_xorpen(異或)模式。
程式設定如下:
在檢視類中新增如下成員變數:
cpoint m_begin,m_end;
//記錄線條的起點、終點
bool m_lmouseisdown;
//記錄滑鼠左鍵是否按下
bool m_lmouseisup;
//記錄滑鼠左鍵是否彈起
在檢視類成員函式中初始化這三個成員變數
m_begin.x=m_begin.y=0;
m_end.x=m_end.y=0;
m_lmouseisdown=false; //初始時滑鼠左鍵沒有被按下
m_lmouseisup=true; //初始時滑鼠左鍵處於彈起狀態
在你的檢視類新增一下三個訊息處理函式
void cexamplelineview::onlbuttondown(uint nflags, cpoint point)
void cexampleline3view::onmousemove(uint nflags, cpoint point)
m_mouseisup=false;
m_end=point; //重新記錄上一次線段的終點
dc.moveto(m_begin);
dc.lineto(m_end);
}cview::onmousemove(nflags, point);
}void cexampleline3view::onlbuttonup(uint nflags, cpoint point)
非模態對話方塊的建立和銷毀過程
建立非模態對畫框的過程 見 乙個非模態的mfc視窗的銷毀過程 假設自己通過 new建立了乙個視窗物件 pwnd 然後pwnd create 則銷毀視窗的呼叫次序 1.手工呼叫 pwnd destroywindow 一般在對話方塊類中的 oncancle 函式中postmessage wm desto...
模態對話方塊和非模態對話方塊的建立彈出
一 模態對話方塊的建立及顯示 1 windows對話方塊分為兩類 模態對話方塊和非模態對話方塊。模態對話方塊 當它彈出後,本應用程式其他視窗將不再接受使用者輸入,只有該對話方塊響應使用者輸入,在對它進行相應操作退出後,其他視窗才能繼續與使用者互動。非模態對話方塊 它彈出後,本程式其他視窗仍能響應使用...
模態對話方塊與非模態對話方塊
1.對話方塊分類 按工作方式不同,可將對話方塊分成兩類 模態對話方塊 modal 在關閉模態對話方塊之前,程式不能進行其他工作 如一般的 開啟檔案 對話方塊 非模態對話方塊 modeless 非模態對話方塊開啟後,程式仍然能夠進行其他工作 如一般的 查詢與替換 對話方塊 2.對話方塊建立 模態對話方...