Win32 SDK學習筆記3

2021-07-30 02:11:45 字數 3157 閱讀 7781

1、思考一下,視窗程式中為什麼要註冊視窗類?

你想建立什麼樣的視窗呢?那麼,建立什麼樣的視窗呢?建立前,window系統可不知道你要的是什麼型別的視窗啊(比如標題欄上顯示什麼圖示,滑鼠形狀是什麼,視窗背景顏色等等)。這些型別資訊應在你建立前事先告訴window系統。可以採用這種方法:就是我們事先寫乙份要建立視窗的型別申請表,提交(註冊)給window系統。然後在建立時,可以讓windows按這個申請表來建立你所要的視窗了。也就是說我們還應該先提交乙個申請表,申請成功後再根據這個表建立乙個視窗。

2、視窗控制代碼和例項控制代碼的區別和聯絡

偶理解例項是乙個程序,視窗是乙個程序的圖形介面

例項句抦用來標識乙個程式的乙個具體的程序,他的值實際上是這個例項被載入到程序空間的位址。

說明:例項——在windows環境下,不但可以執行多個應用程式,還可以執行多個應用程式的多份拷貝,每個拷貝叫做乙個例項,並且有不同的例項控制代碼。乙個例項控制代碼是windows可以單獨執行的副本,是唯一可以標誌此例項的整數。

windows視窗就是通過訊息來與作業系統互動,視窗不能直接與使用者交流,使用者移動滑鼠、敲鍵盤都是通過作業系統與視窗通訊的,因此winmain()函式中的訊息迴圈很重要,沒有它視窗便不能工作,而視窗訊息處理函式更為重要,也是我們程式設計的主要物件。

訊息迴圈共用到3個函式,getmessage()的返回值一直不為0,直到接受wm_quit時才為0(也就是false)。dispatchmessage()是將訊息傳給視窗訊息處理函式。對初學者來說,這3個函式寫法比較固定,但不要認為只能這樣寫。對訊息的正確理解是比較關鍵的,學習一下訊息的結構體。

typedef

struct ; msg, *pmsg;

注意:上面訊息迴圈中的三個函式用的訊息是這個結構體的型別,而下面要闡述的訊息處理函式的引數,用的是結構體中的第2-4元素即message、wparam、lparam。

windows中訊息的種類大致有2種,即系統訊息和應用程式訊息,訊息的字首也多種多樣。不過日常用到的訊息大都以「wm_」開頭,而且許多訊息的wparam和lparam都為0(也就是不使用),一般只有「wm_command」選單命令或鍵盤滑鼠的訊息才使用wparam和lparam。

windows中訊息雖然很多,但並不是每一訊息都要程式設計處理,我們一般把不需要特別處理的訊息交給預設訊息處理函式defwindowproc(),例子中的default部分便是。另外,有一函式必須處理,也就是關閉視窗訊息wm_destroy,這時必須呼叫postquitmessage(0)來向作業系統傳送一條終止程式的訊息。

#include 

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

bool initinstance(hinstance, lpcstr, int);

//主入口函式

int winapi winmain(hinstance hcurinst, hinstance hprevinst,

lpstr lpscmdline, int ncmdshow)

//訊息迴圈

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

return (int)msg.wparam;

}

用的最多的訊息可能是wm_paint,當視窗改變大小、或有別的視窗從這個視窗面前經過,這個視窗中的文字或圖案被沖掉,這就必須重新描畫。因此,視窗中要顯示的文字或影象一般都是在wm_paint中實現的。下面我們以在視窗上顯示一行字作例子,不過,這時要稍微知道一點gdi(graphic device inte***ce)的知識。

要在視窗描畫文字或影象,首先要先取得裝置文字(device contexts)。取裝置文字一般有2種方法,beginpaint()函式和getdc()函式。描畫結束後必須呼叫endpaint()函式和releasedc來釋放裝置文字。後面2章將繼續介紹gdi的基礎知識。

要在視窗的某個位置描畫文字,必須取視窗的有效區域(clientrect),因為視窗的邊框、選單、工具條、狀態條等部分是不能利用的。例如,要在視窗的正中間寫乙個字,用視窗寬度和高度的一半來取正中位置是不對的,除非這個視窗無任何邊框、選單、工具條、狀態條等。正確的方法是先定義乙個區域變數(型別為rect),然後用getclientrect()函式取出視窗有效區域放入這個變數中。最後,呼叫drawtext()函式在矩形區輸出文字。drawtext()將在下一章細說,所謂區域型別rect其實就是乙個存放矩形塊座標的結構體,下面是rect的原型。

int drawtext(                                  

hdc hdc, //裝置文字的控制代碼

lpctstr lpstring, //要輸出的字串

int ncount, //字串長度

lprect lprect, //要輸出的區域

uint uformat //輸出的格式

);

typedef

struct _rect rect, *prect;

重繪訊息處理

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

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

return (int)msg.wparam;

}atom myregisterclass(hinstance hinstance)

bool initinstance(hinstance hinstance, int ncmdshow)

showwindow(hwnd, ncmdshow);

updatewindow(hwnd);

return

true;

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

return

0;}

win32 sdk繪製矩形選擇框

普通的繪製會留下 痕跡 但windows程式設計第五版的5.3.8節提到了乙個繪圖模式的概念.具體內容就是我們可以通過呼叫setrop2函式對繪圖模式的設定,預設是r2 copypen,即畫筆畫素覆蓋背景畫素.注意這裡是對畫筆的繪圖模式進行設定,對畫刷沒用影響,所以只能老實的用線條畫矩形 setro...

VC串列埠通訊win32SDK版

vc串列埠通訊win32sdk版 2011年05月14日 win32串列埠程式設計 韓耀旭 在工業控制中,工控機 一般都基於windows平台 經常需要與智慧型儀表通過串列埠進行通訊。串列埠通訊方便易行,應用廣泛。一般情況下,工控機和各智慧型儀表通過rs485匯流排進行通訊。rs485的通訊方式是半...

WPF 通過Win32SDK修改視窗樣式

使用函式為 setwindowlong getwindowlong 註冊函式 dllimport user32.dll entrypoint getwindowlong public static extern int getwindowlong intptr hwnd,int nindex dll...