你的第乙個Windows程式 繪製視窗

2021-09-09 03:06:12 字數 1832 閱讀 8471

msdn原文(英文)

你已經建立了你的視窗,現在你想在它裡面顯示東西。在windows術語裡,這就是所謂的繪製視窗。混合隱喻,乙個視窗是乙個空白畫布,等待你去填充它。

有時你的程式將啟動繪製更新你視窗的外觀。在其它時候,作業系統會通知你,你必須重繪部分視窗。當這種情況發生時,作業系統個視窗傳送乙個wm_paint訊息,視窗中必須重繪的部分被稱為更新區域。

乙個視窗在第一時間顯示時,視窗的整個客戶區一定要繪製。因此,當你顯示乙個視窗,你總是會收到至少乙個wm_paint訊息。

插圖顯示乙個視窗更新區域

你只負責繪製客戶區。周圍的框架,包括標題欄,由作業系統自動繪製。在你完成客戶區的繪製,你要清除更新區域,這是告訴作業系統,它不需要傳送另乙個wm_paint訊息直到有新的變化。

現在假設使用者移動另乙個視窗,使它掩蓋你的視窗的一部分。當被掩蓋的部分再次成為可見,該部分被新增到更新區域,並你的視窗接受另乙個wm_paint訊息。

插圖顯示兩個視窗重疊時如何更改更新區域

如果使用者拉伸視窗,更新區域也會改變,在下面的插圖,使用者拉伸視窗到右邊,在視窗右側新暴露的區域新增到更新區域:

插圖顯示視窗調整大小是如何更改更新區域

在我們的乙個例子程式,繪製程式是非常簡單的。它只是用純色填充整個客戶區。儘管如此,這個例子足以證明一些重要的概念。

通過呼叫beginpaint函式開始繪製操作,這個函式在重繪請求時填充資訊到paintstructs結構,paintstructs結構的成員rcpaint給出了當前的更新區域,此更新區域相對於客戶區:

插圖顯示客戶區的原點

在你的繪製**中,你有兩個基本的選擇:

如果你總是繪製整個客戶區,**會更簡單。如果你具有複雜的繪製邏輯,但是,它可以更有效的調到更新區域以外的區域。

下面的**用乙個單一的顏色填充更細區域,使用系統定義的視窗背景顏色(color_window),由color_window表示的實際顏色取決於使用者的當前配色方案。

fillrect(hdc, &ps.rcpaint, (hbrush) (color_window+1));
在這個例子中,fillrect的細節並不重要,但第二個引數給出的要填充的矩形,在這種情況下,我們傳入整個更新區域(paintstructs結構的成員rcpaint)。在第一次wm_paint訊息,整個客戶區需要繪製,所以rcpaint包含整個客戶區。在隨後的wm_paint訊息,rcpaint可能包含乙個較小的矩形。

fillrect函式是圖形裝置介面(gdi)的一部分,已經支援windows圖形很長一段時間。在windows7,微軟推出了新的圖形引擎,取名direct2d,支援高效能的圖形操作,例如硬體加速。另外windows vista和windows server 2008通過各自的平台更新也支援direct2d(gdi仍然完全支援)。

當你繪製完成以後,呼叫endpaint函式。這個函式清除更新區域,某些訊號傳到windows視窗已經完成本身的繪製。

第乙個windows程式

includeint winapi winmain hinstance hinstance,hinstance hprevinstance,lpstr ipcmdline,int ncmdshow 如題,第乙個win程式,執行結果如圖 首次執行過程出現這個問題 發現是message寫錯,首字母沒有大...

第乙個windows視窗程式

includeint winapi winmain hinstance hinstance,hinstance hprevinstance,pstr szcmdline,int icmdshow 類似命令列的 include,不過更像c 的 include,包含了其他許多的標頭檔案。視窗版也包含了乙...

我的第乙個windows程式

include lresult callback wndproc hwnd,uint,wparam,lparam winmain函式被指定了乙個winapi型態 在表頭檔案中定義的所有windows函式都被指定這種型態 而wndproc函式被指定乙個callback型態。這兩個識別符號都被定義為 s...