C語言開發windows程式主要程式結構

Extreme-LanYu發表於2024-10-02

一、兩個函式

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

相關文章