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

浙公网安备 33010602011771号