welcome ...

C语言开发windows程序主要程序结构

一、两个函数

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
posted @ 2024-10-02 06:42  Extreme-LanYu  阅读(517)  评论(0)    收藏  举报