2 2 1 8 練習 Windows 程式模型

Mondo 科技 更新 2024-01-29

/*--

008 程式設計大師 Win32 API 日常練習。

第 8 個示例是 hellowinC:Windows 程式模型。

c) www.bcdaren.com 編碼高手。

#include

lresult callback wndproc (hwnd, uint, wparam, lparam) ;視窗過程-訊息函式。

int winapi winmain (hinstance hinstance, hinstance hprevinstance,pstr szcmdline, int icmdshow) pstr 非寬字串指標字元*

static tchar szappname = text ("hellowin") ;視窗類的名稱。

hwnd hwnd ;視窗把手。

msg msg ;訊息結構變數 -f1

wndclass wndclass ;視窗類結構變數。

第 1 步:初始化視窗類。

wndclass.style = cs_hredraw | cs_vredraw ;視窗類樣式 - 水平和垂直識別符號 - been。

更改時,將重新繪製類的所有視窗。

wndclass.lpfnwndproc = wndproc ;視窗處理程式---函式指標。

wndclass.cbclsextra = 0 ;視窗被擴充套件,cb 表示位元組數。

wndclass.cbwndextra = 0 ;視窗例項擴充套件。

wndclass.hinstance = hinstance ;程序例項控制代碼。

wndclass.hicon = loadicon (null, idi_application) ;視窗的最小化圖示。

wndclass.hcursor = loadcursor (null, idc_arrow) ;視窗滑鼠游標。

wndclass.hbrbackground = (hbrush) getstockobject (white_brush);背景顏色。

wndclass.lpszmenuname = null ;視窗選單。

wndclass.lpszclassname = szappname ;視窗類的名稱。

第 2 步:註冊視窗類。

if (!registerclass (&wndclass))

messagebox(null, text("註冊失敗!"),szappname, mb_iconerror);

return 0;

第 3 步:建立乙個視窗。

hwnd = createWindow( szappname,視窗類的名稱。

text ("建立視窗"),視窗標題。

ws overlappedwindow,視窗樣式。

cw usedefault,視窗的初始水平位置。

cw usedefault,視窗的初始垂直位置。

cw usedefault,視窗的寬度,以裝置單位表示

cw usedefault,視窗的高度(以裝置單位為單位)

null,父視窗的控制代碼。

null,視窗選單控制代碼。

hinstance,程式例項控制代碼。

null) ;建立引數。

第四步顯示和更新視窗。

showwindow (hwnd, icmdshow) ;顯示視窗。

updatewindow (hwnd) ;更新視窗。

第 5 步:訊息迴圈。

而 (getMessage (&msg, null, 0, 0)) 訊息佇列,則訊息是。

wm quit 返回 0 退出訊息迴圈。

將 msg 結構返回到 Windows,並將虛擬鍵訊息轉換為字元訊息。

translatemessage(&msg);

再次將 msg 結構返回到 Windows,並將訊息分發給視窗程式。

dispatchmessage(&msg);

msg.wparam 來自指示退出的訊息,並將此值返回給系統,從而退出。

return msg.wparam ;

視窗程序。 lresult callback wndproc (hwnd hwnd, uint message, wparam wparam, lparam param)

hdc hdc ;外部環境控制代碼 (裝置上下文控制代碼) 。

paintstruct ps ;用於繪製應用程式擁有的視窗的工作區。

rect rect ;矩形結構由其左上角和右下角的坐標定義。

switch (message)

case wm create:建立視窗訊息。

return 0 ;

case wm paint:重繪視窗訊息。

hdc = beginpaint (hwnd, &ps);開始繪圖(獲取裝置環境) - 在本例中為顯示。

getclientrect (hwnd, &rect) ;此函式獲取視窗工作區的大小。

drawtext (hdc, text ("hello, windows!")、1、&rect、-1 表示零字串。

dt_singleline | dt_center | dt_vcenter) ;繪圖格式:指定。

矩形文字顯示在水平和垂直居中的單行上。

endpaint (hwnd, &ps) ;在指定視窗中標記繪圖的結束。

return 0 ;

case wm destroy:退出訊息迴圈。

postquitmessage (0) ;向系統指示執行緒已請求終止(退出)。

return 0 ;

“呼叫作業系統預設視窗”過程為應用程式未處理的任何視窗訊息提供預設處理。

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

結果:“注釋”圖示、標題和“系統”選單都位於標題欄中,標題欄下方的區域是“客戶端”區域。

圖2-1 建立視窗。

在hellowin中C程式的功能是繪製乙個自定義視窗,並在視窗工作區輸出文字字串“hello, Windows!””。

該程式分為兩部分:主程式 WinMain 和視窗過程 WndProc。

主程式

winmain 函式。

winmain函式是Windows視窗程式的入口函式,而console程式的入口函式是main函式。 建立專案時,會選擇桌面應用程式,因此“專案屬性”->“鏈結器”-“>系統”->“子系統”選項預設為“視窗”,如圖所示。 當然,如果此選項設定為“未設定”,鏈結器會根據函式名稱“winmain”判斷它是乙個視窗程式。

2-2 與視窗子系統選項。

Winmain函式原型:

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

它也可以是: int winapi winmain( hinstance hinstance, hinstance hprevinstance,lpstr lpcmdline, int ncmdshow);

函式的返回值為 int 型別。 返回值 0 表示正常結束,非 0 值表示異常結束。

函式呼叫約定為:winapi,即 stdcall 呼叫約定。

引數 1 hinstance hinstance:是當前程序的控制代碼,由作業系統在建立和初始化程序時給出。

引數 2 hinstance hprevinstance:上乙個程序控制代碼,是 win16 系統遺留的引數。 Win16 是乙個 16 位單任務實模式作業系統,該引數用於判斷上乙個程序是否已經結束,只有當上乙個程序結束時,才能建立當前程序。

引數 3 pstr szcmdline:是指向包含命令列引數的以 null 結尾的字串的長指標。

引數 4 int icmdshow:乙個整數值,用於確定主視窗的顯示方式。 它可以是這樣的:

SW 隱藏:隱藏視窗,並啟用另乙個視窗。

SW 最大化:最大化視窗,然後啟用它。

SW 最小化:最小化視窗並啟用下乙個頂級視窗。

SW RESTORE:啟用並顯示視窗。 如果視窗最小化或最大化,視窗將恢復到其原始大小和位置。

SW show:以當前大小和位置顯示並啟用視窗。

SW showdefault:根據啟動應用程式時傳遞給 createProcess 函式的 startupinfo 結構的 WSHOWWewWindowField 設定第乙個顯示視窗的狀態。

SW showmaximized:最大化視窗並啟用它。

SW showminimized:最小化視窗,然後啟用它。

SW showminnoactive:最小化視窗,但不要啟用它。

SW showna:以當前狀態顯示視窗,但不啟用它。

SW shownoactivate:以最接近的大小和位置顯示視窗,但不啟用它。

SW shownormal:與SW恢復類似,它根據視窗的預設位置和大小顯示和啟用。

預設值為正常大小的顯示視窗。

winmain 函式中需要定義 4 個變數:

static tchar szappname = text ("hellowin") ;定義視窗類名稱,該名稱通常也是程序的名稱。

hwnd hwnd ;定義乙個視窗控制代碼,通過該控制代碼可以操作視窗。

msg msg ;定義訊息結構變數。

wndclass wndclass ;定義視窗類結構變數。 視窗類在上一節中已經解釋過了,所以我不會重複它們。

如果我們想檢視相關的幫助資訊,我們可以選擇它,然後按F1鍵檢視MSDN相關資訊。 您也可以選擇它,點選滑鼠右鍵,快速掌握定義或進入定義,vs操作非常方便。

主程式建立視窗的五個步驟:

第 1 步:初始化視窗類。 如果要建立自定義視窗,則必須指定有關該視窗的資訊並將其傳遞給作業系統。 簡單來說,就是初始化視窗類結構體的字段。 如果不需要或沒有字段,可以將其設定為 null。 但是,視窗樣式、視窗過程和視窗類名字段是必填字段。

第 2 步:註冊視窗類。 初始化新的視窗類後,我們需要向 WinodWS 系統註冊該視窗類並呼叫 API 函式 RegisterClass。

第 3 步:呼叫 createwindow 函式建立視窗。

第 4 步:顯示和更新視窗。

showwindow (hwnd, icmdshow) ;顯示視窗。

updatewindow (hwnd) ;更新視窗。

第 5 步:迴圈訊息。

如果訊息為 wm quit,則返回 0 並退出訊息迴圈。

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

將 msg 結構返回到 Windows,並將虛擬鍵訊息轉換為字元訊息。

translatemessage(&msg);

再次將 msg 結構返回到 Windows,並將訊息分發給視窗程式。

dispatchmessage(&msg);

訊息迴圈是乙個 while 迴圈結構,它呼叫 getmessage 函式從視窗訊息佇列中獲取訊息,如果訊息為 wm quit 退出訊息迴圈,則返回 0。 否則,translatemessage 函式和 dispatchmessage 函式會處理它。

主程式建立視窗的五個步驟是強制性的、固定的,可以用作 Windows 程式的模板。 在大多數情況下,只需複製它並使用它就可以了。 如果要新增子視窗或處理控制訊息或選單快捷方式訊息,可以稍作更改。 Windows 程式設計的基礎知識比看起來要簡單得多。

視窗程序。

視窗程序負責處理 Windows 系統傳送到視窗的各種訊息。

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

我們會發現,視窗程序的四個引數是 msg 訊息結構的前四個字段。 這是 Windows 作業系統傳遞的訊息引數。

引數 hwnd:當前視窗的控制代碼。 用於標識視窗或應用程式子視窗的唯一識別符號。

訊息:描述視窗需要處理的訊息型別,如wm paint(視窗需要重繪)、wm destroy(視窗即將被銷毀)等。

引數 wparam:是特定於訊息的附加資訊。 內容將根據特定的訊息型別而有所不同。

引數 lparam: 也是特定於訊息的附加資訊。 內容將根據特定的訊息型別而有所不同。

返回值 lresult 是訊息處理完畢後返回的資訊,返回資訊因訊息型別而異。

每當發生事件(如滑鼠單擊、鍵盤擊鍵、計時器事件等)時,Windows 都會向相應的視窗傳送訊息,並通過 WNDPROC 函式處理該訊息。

對於大多數訊息,一旦 wndproc 處理完它們,它應返回 0。 對於某些訊息,例如 WM Create 和 WM Paint,返回的值可能包含某些資訊。 所有這些資訊都在每條訊息的具體說明中進行了詳細說明。

如果訊息沒有被 wndproc 處理,那麼你應該呼叫 Windows 系統預設視窗過程的 defwindowproc 函式,讓系統以預設方式處理它。 絕大多數訊息由 defwindowproc 函式處理。

WNDPROC 的呼叫約定是 callback,與 WinAPI 相同,並且與 stdcall 呼叫約定相同。 之所以使用callback,顧名思義,wndproc 是乙個 ** 函式,即 Windows 系統呼叫 wndproc 來處理各種訊息。

wndproc 視窗程序主要包含乙個 switch 結構,根據不同的訊息 ID 分別處理,處理後直接返回 0;返回。 預設情況下,其他未處理的訊息將留給 defwindowproc 按原樣處理。

接下來,我們將分解這個模板程式,一步一步地實現視窗建立過程,這樣我們就可以分析視窗實現過程了。

相關問題答案

    1 5 6 3 7 printf 輸出字串

    程式設計大師 Win API 日常練習。第三個示例是 SprintFc 控制台程式 printf 輸出字串。spritf 的函式。c www.bcdaren.com 編碼高手。include 在控制台中使用 printf int main int a char szbuffer sprintf s ...

    年紀越大越妖,第8冠、第40冠、第22冠,快50歲的奧沙利文還在巔峰!

    奧沙利文第八次奪得英錦賽冠軍 英錦賽決賽,奧沙利文以 的比分擊敗丁俊暉,奪得職業生涯第個英錦賽冠軍,在歲生日前一天奪得職業生涯第個排名賽冠軍,結束了年零個月的排名賽冠軍荒,而丁俊暉年的排名賽冠軍荒仍在繼續。丁俊暉在年 年和年次奪得英錦賽冠軍,在上賽季英錦賽決賽中,丁俊暉也晉級決賽,但遺憾的是以 輸給...

    這位在中超射手榜上排名第4的南韓前鋒打進了本賽季的第8個進球,身價為1800萬歐元

    這位在中超射手榜上排名第的南韓前鋒打進了本賽季的第個進球,身價為萬歐元 在這場亞洲 的比賽中,國家足球隊對陣南韓隊,展現了其在亞洲的頂級水平。這也讓南韓人在中超聯賽中表現出色,尤其是黃熙燦,他在第輪再次引起了人們的注意,並上演了一場精彩的表演。黃熙燦是效力於狼隊的南韓人,也是第一位加入 中資球隊 的...

    4 0!2 0!亞洲第8次疫情有望時隔36年重返世界盃,國足晉級難度已達

    世界盃是世界上最知名的足球比賽,每四年一次。作為亞洲最重要的活動世界預選賽它也備受關注。在亞洲強賽結束的前兩輪小組賽中,有支球隊保持了勝利記錄,其中包括日本和南韓等亞洲一流球隊沙地阿拉伯除了澳大利亞,還有阿聯和伊拉克,它們在亞洲是二流水平。由於世界盃擴軍的原因是阿聯和伊拉克有望重返決賽圈,而國家足球...

    產後第8天的坐月子食譜了解多少

    洗淨公尺飯,鍋中放入適量清水,加入公尺飯和黑棗,大火煮沸,然後轉小火煮約分鐘。公尺粒煮熟後,倒入牛奶攪拌均勻,繼續用小火燉 分鐘,直到公尺粒粘稠,散發出乳香。吃的時候可以加糖調味 推薦理由 黑棗中的維生素C含量非常高,與公尺飯一起煮,除了補鈣外,還有滋胃養血的滋補作用 時間 紅芝麻茶。將黑芝麻磨碎,...