chapter i:在wm_mousemove中繪製.
有時候要求在乙個視窗中繪製滑鼠的拖曳框,就像是使用者在桌面上拖曳圖示顯示的框一樣.對於這樣的矩形框windows的api提供了乙個函式drawfocusrect,
當然這個函式是可以的,不過這個函式有兩個小問題,那就是它的第二個引數是乙個rect引數,而且這個矩形的必須有以下特點:
left
在這裡,提供一種自己繪製矩形的辦法,這樣可以根據需要自己來改寫.下面是這個函式的實現(兩個):
void
drawdragrect(
hdchdc, rect& rc)
for(int
i=rc.left; i
for(int
j=rc.top; j
for(int
i=rc.left; i }
void
drawdragrect(
hdchdc, point ptsource, point ptdest)
for(int
i=left; i
for(int
j=top; j
for(int
i=left; i }
可以發現,上面兩個函式都是繪製矩形時都是通過在dc上設定畫素的顏色實現的,gdi/gdi+沒有提供繪製滑鼠拖曳框的辦法(如果有哪位網友發現了請
1)捕捉起點,這個主要是在滑鼠在視窗客戶區按下時刻作為矩形的起點.
2)捕捉過程點,使用者按下滑鼠左鍵,在視窗中拖曳,此時滑鼠滑過的軌跡就會繪製矩形框的終點.
3)結束點,使用者釋放滑鼠左鍵.
另外就是繪製過程中對背景擦除問題,只要使用者釋放滑鼠,就要重繪背景,將矩形框擦除.
下面是**.
rect g_rcdrag = ;//待繪製的矩形框.
lresult
callback wndproc(
hwnd
hwnd,
uint
message,
wparam
wparam,
lparam
lparam)
break
; case
wm_mousemove: }
break
; case
wm_lbuttonup:
break
; case
wm_paint:
按住滑鼠左鍵在視窗客戶區拖動吧,可以發現乙個紅色的矩形框.
chapter ii:更好的繪製辦法
chapter i的**能夠正常工作,不過這是一種理想的情況,但有時候會碰到這樣一種情況:某些時候程式會對視窗背景或前景進行繪製,例如貼乙個,畫一些
rect g_rcdrag = ;#define id_timer 1
lresult
callback wndproc(
hwnd
hwnd,
uint
message,
wparam
wparam,
lparam
lparam)
; getcursorpos(&pt);
screentoclient(hwnd, &pt);
// 待繪製的拖曳矩形的4個點.
if(pt.x <= g_rcdrag.left) g_rcdrag.left = pt.x;
if(g_rcdrag.left != pt.x) g_rcdrag.right = pt.x;
if(pt.y <= g_rcdrag.top) g_rcdrag.top = pt.y;
if(g_rcdrag.top != pt.y) g_rcdrag.bottom = pt.y;
invalidaterect(hwnd, null, true);
updatewindow(hwnd);
} break
; case
wm_lbuttondown:
break
; case
wm_paint:
break
; case
wm_destroy:
killtimer (hwnd, id_timer) ; //銷毀定時器
break
; ...
} ...
} settimer的間隔時間越短,繪製效果越好.
視窗滑鼠事件的響應 在滑鼠視窗中繪製矩形的程式
這裡主要是訓練怎麼去響應滑鼠響應事件,那怎麼去定義滑鼠響應函式呢?void cvmousecallback int event 滑鼠響應事件的型別如滑鼠右鍵彈起,右鍵按下,cv event lbuttondown,cv event lbuttondown int x,滑鼠響應是所在的位置,這裡x,y...
滑鼠在視窗中的座標轉換到 canvas 中的座標
由於需要用到ispointinpath函式,所以必須得將滑鼠在視窗中的座標位置轉換到canvas畫布中的座標,今天發現網上這種非常常見的寫法其實是錯誤的!如下 1.function windowtocanvas canvas,x,y 7.什麼時候會發生錯誤呢?看下面的livescript 1.can...
mfc在視窗中新增右鍵選單
mfc在視窗中新增右鍵選單,大致分為以下三步 一。建立選單 建立基於對話方塊的mfc應用程式popmenu,插入 資源 選單 建立父選單的id為idr popmenu,建立子選單的id分別為id menuitem1,id menuitem2 二 定義函式並且新增訊息對映 宣告函式 afx msg v...