一、兩個函式
1.WinMain,WindowsAPI 主函式。本次示例中WinMain包含的三個內容:
+.註冊視窗
+.建立視窗
+.訊息迴圈
2.視窗過程(WndProc)
視窗過程,透過視窗過程(WndProc)與使用者互動和管理視窗。
二、Windows程式示例
基於C語言開發的windows圖形介面程式
/**
* title:Windows 程式
* date:2024-10-02
* author:lanyu
* version:C99,C11
* info:其實視窗過程函式寫法都是一個樣的。
*/
#include <windows.h>
LPCWSTR reg_class=TEXT("WindowsProgram");
//宣告視窗過程函式。
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
//Windows 應用程式介面函式WinMain(主函式)
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrveInstance,LPSTR szCmdLine,int iCmdShow){
//視窗註冊
WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
wndclass.hInstance=hInstance;
wndclass.hBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=reg_class;
wndclass.lpfnWndProc=WndProcl
if(!RegisterClass(&wndclass)){
MessageBox(NULL,TEXT("The Program register class failure."),TEXT("ERROR"),MB_OK|MB_ICONERROR);
return 0;
}
//視窗建立
HWND hwnd;
hwnd=CreateWindow(
reg_class
,TEXT("Windows應用程式")
,WS_OVERLAPPEDWINDOW
,CW_USEDEFAULT
,CW_USEDEFAULT
,CW_USEDEFAULT
,CW_USEDEFAULT
,NULL
,hInstance
,NULL
,NULL
);
ShowWindow(hwnd,iCmdShow);
UpdateWindow(hwnd);
//定義訊息迴圈
while(GetMessage(&msg,hwnd,0,0)>0){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//定義視窗過程函式內容
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){
switch(msg){
default:
return DefWindowProc(hwnd,msg,wParam,lParam);
}
return 0;
}
三、各部分解釋
介面函式
WINAPI
: 原型為__stdcall
修飾符,使用window的函式呼叫方式。
CALLBACK
:原型為__stdcall
修飾符,使用window的函式呼叫方式。[和WINAPI
一樣的作用,可以不區分,但為了語法嚴謹不建議。]
HINSTANCE
:例項控制代碼。這裡的WinMain
引數中hInstance
例項的控制代碼是指本程式。引數中第二個hPrveInstance
為上一個例項的控制代碼(以後Windows只會為這個引數傳入NULL值)
LPSTR
:字元指標,指向一個傳入程式的字串。
INT
:原型int
,標識這個程式開啟後顯示方式:顯示、隱藏、全屏、最小化等。
視窗註冊
WNDLCASS
:視窗類結構體
欄位 | 設定 |
---|---|
cbWndExtra | 視窗附加記憶體 |
cbClsExtra | 註冊類附加記憶體 |
style | 類樣式 |
hCursor | 游標 |
hIcon | 圖示 |
hbrBackground | 背景 |
lpszClassName | 註冊視窗名 |
lpszMenuName | 選單[字串、ID] |
lpfnWndProc | 視窗過程函式 |
LoadCursor
:載入滑鼠游標宏,原型 HCURSOR LoadCursor(HISNTANCE,LPWSTR)
。
LoadIcon
:載入應用圖示,原型HICON LoadIcon(HINSTANCE,LPWSTR)
。
GetStockObject
:載入windows預設物件。
RegisterClass
:註冊視窗。透過指標指向視窗註冊結構體。
建立視窗
CreateWindow()
:建立windows視窗。視窗建立成功後返回一個視窗控制代碼,這時視窗在桌面是不顯示的。
意義 | 引數 |
---|---|
視窗註冊字串 | LPCWSTR |
視窗名稱 | LPCWSTR |
樣式 | UINT |
X座標 | int |
Y座標 | int |
寬 | int |
高 | int |
父程式 | HWND |
選單 | HMENU |
例項控制代碼 | HINSTANCE |
構建結構體的指標 | LPVOID |
ShowWindow
:顯示視窗。第一個引數由CreateWindow
返回的視窗控制代碼,第二個引數是視窗顯示的標誌位。
UpdateWindow
:更新視窗。傳遞一個視窗控制代碼。
訊息迴圈
MSG
:訊息結構體
欄位 | 意義 |
---|---|
HWND | 視窗控制代碼 |
UINT | 訊息ID |
WPARAM | 字元型引數 |
LPARAM | 長整型引數 |
DWPRD | 時間戳 |
POINT | 滑鼠座標 |
GetMessage
:獲取Widnows操作訊息。第一個為指向MSG
結構體的指標、第二個為視窗控制代碼、第三個為最低訊息整數值、第四個為最高訊息整數值。
TranslateMessage
: 翻譯鍵盤訊息
DispatchMessage
:這個函式會呼叫WndProc(視窗過程函式)
附加:
本示例中視窗過程函式被縮減,目的在於示例。(如下仍然不是最簡,最簡可以直接呼叫預設視窗過程。)
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){
return DefWindowProc(hwnd,msg,wParam,lParam);
}
編譯命令,假設原始檔為: test.c
gcc -Wshadow -Wall -mwindows -DUNICODE=1 -g test.c -o out.exe