在視窗中繪製滑鼠拖曳框

2021-09-20 19:12:25 字數 2296 閱讀 6508

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...