一、两个函数
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
标签:窗口,windows,句柄,程序结构,C语言,wndclass,hwnd,msg,NULL
From: https://www.cnblogs.com/exlanyu/p/18444373