windows程式設計(10) 矩形與區域

2021-08-26 22:34:36 字數 3167 閱讀 5093

windows中,矩形結構rect通過左上角和右下角兩個點控制。

rect rect;

rect.left= xleft ;

rect.top= xtop ;

rect.right= xright ;

rect.bottom= xbottom ;

矩形支援操作很多,比如offsetrect (&rect, x, y) ;(將矩形移動);intersectrect (&destrect, &srcrect1, &srcrect2) ;獲得兩個矩形的交集;binrect = ptinrect (&rect, point) ;判斷點是否在矩形裡等。這裡不一一細講了。

有一點需要注意,通常我們可以使用getclientrect來或得整個客戶區,將它存在乙個rect結構中,非常方便。

什麼又是區域呢?區域可以使矩形、橢圓,多邊形,或者是多個它們的組合,如何或得區域呢,以矩形為例,通過createrectrgnindirect就能或得乙個矩形區域了。先看乙個簡單程式:

#include #include lresult callback wndproc (hwnd,uint,wparam,lparam);

int winapi winmain(hinstance hinstance, //當前例項控制代碼

hinstance hprevinstance, //先前例項控制代碼

lpstr lpcmdline, //命令列

int icmdshow) //顯示狀態

//建立視窗

text("我的畫圖"), //視窗標題

cw_usedefault, //x座標

cw_usedefault, //y座標

cw_usedefault, //寬度

cw_usedefault, //高度

null, //父視窗控制代碼

null, //選單視窗控制代碼

hinstance, //高階版本的windos忽略

null);

//顯示視窗

//showwindow(hwnd,sw_showna);

showwindow (hwnd, icmdshow);

//更新視窗

updatewindow(hwnd);

//訊息迴圈

while(getmessage(&msg,null,0,0))

return msg.wparam;

}lresult callback wndproc (hwnd hwnd,uint message,wparam wparam,lparam lparam)

return defwindowproc(hwnd,message,wparam,lparam);

}

這個程式實現了通過單擊滑鼠左鍵是得矩形實現偏移。程式比較簡單,唯一值得注意的是,有兩種方法實現顯示紅色的矩形:第一是用紅刷子對矩形填充,第二是用矩形建立乙個區域,用刷子填充整個區域。

下面這個程式著重討論區域的拼接問題:

#include #include #define two_pi (2.0 * 3.14159)		

lresult callback wndproc (hwnd, uint, wparam, lparam) ;

int winapi winmain (hinstance hinstance, hinstance hprevinstance, pstr szcmdline, int icmdshow)

showwindow (hwnd, icmdshow) ;

updatewindow (hwnd) ;

while (getmessage (&msg, null, 0, 0))

return msg.wparam ; }

lresult callback wndproc (hwnd hwnd, uint imsg, wparam wparam, lparam lparam)

endpaint (hwnd, &ps) ;

return 0 ;

case wm_destroy:

//刪除該區域

deleteobject (hrgnclip) ;

postquitmessage (0) ;

return 0 ;

}return defwindowproc (hwnd, imsg, wparam, lparam) ;

}

程式中將4個橢圓拼接起來,形成了新的區域。fradius是中心到客戶區頂點的距離。

將視口的原點設定到了客戶區的中心,然後對於每一度,計算一條線與客戶區邊沿的交點的x,y座標(加0.5是為了四捨五入),但是由於我們之前定義了區域,所以不論線實際畫了多長,螢幕上只會顯示出現在區域中的部分。

但是這個程式有乙個bug,在win7下,如果將客戶區最大化(或者放的非常大)時,畫的線會出現一些明顯的裂縫,我通過如下**測試:

case   wm_paint:

hdc = beginpaint (hwnd, &ps) ;

//獲取整個區域的輪廓

selectcliprgn (hdc, hrgnclip) ;

hbrush = createsolidbrush(rgb(0,0,0));

fillrgn(hdc,hrgnclip,hbrush);

/*//將視口原點設定到客戶區中心

setviewportorgex (hdc, cxclient / 2, cyclient / 2, null) ;

//選擇我們已經合併好的區域

selectcliprgn (hdc, hrgnclip) ;

//通過兩條直角邊計算斜邊

fradius = _hypot (cxclient / 2.0, cyclient / 2.0) ;

//1度1度的變化

for (fangle = 0.0 ; fangle < two_pi ; fangle += two_pi / 360)

*/endpaint (hwnd, &ps) ;

return 0 ;

發現最大化視窗時,區域依然四個橢圓拼接而成的的,但是畫出的線卻出現了問題。

不論是vs2010還是vc++6.0這個問題依然存在。有人說xp下不會出現這種情況,具體為什麼我也不知道。

第24天 Windows程式設計 對映!矩形!

setwindowextex 設定視窗範圍 setviewportextex 設定視口範圍 setviewportorgex 設定原點 mm isotropic 同比例縮放 mm anisotropic 自由縮放 fillrect 填充矩形 framerect 矩形邊框 invertrect 翻轉矩...

10 Windows程式設計 滑鼠訊息

和滑鼠相關的三個屬於 click,double click,drag 滑鼠訊息和鍵盤訊息不同 只要滑鼠跨越某個視窗,或者在某個視窗中按鍵,訊息。客戶去滑鼠訊息 wm mousemove wm l,m,r buttondown wm l,m,r buttonup wm l,m,r buttondblc...

Windows程式設計之hdc和hwnd的區別

我剛學習windows程式設計時,對那些控制代碼理解很含糊,尤其是hdc和hwnd。用的很多,但其實還是不知道兩者的真正區別,先來看一下其他博主的理解。hwnd handle of window,也可以這麼說 h是型別描述,表示控制代碼 wnd是變數物件描述,表示視窗 是視窗控制代碼,其中包含視窗的...