当前位置:首页 > Windows程序 > 正文

WinMain与WndProc以及窗口诞生过程总结

2021-03-24 Windows程序

一、int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int nCmdShow)

四个参数:

hInstance:程序当前实例的句柄(handle to current instance),,以后随时可以用GetModuleHandle(0)来获得

hPrevInstance:前一个实例的句柄(handle to previous instance),在Win32中,每一个进程都有一个独立的4G地址空间,从0到2G属于进程私有,对其他进程来说是不可见的。所以,在Win32中,hPrevInstance总是为NULL。

szCmdLine:指向以/0结尾的命令行,不包括EXE本身的文件名(pointer to command line),以后随时可以用GetCommandLine()来获取完整的命令行。

iCmdShow:指明应该以什么方式显示主窗口(show state of window)。

宏定义:

WINAPI:#define WINAPI      __stdcall    表示函数调用遵循__stdcall规则

HINSTANCE:

DECLARE_HANDLE(HINSTANCE);
typedef HINSTANCE HMODULE;

#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name

LPSTR:typedef _Null_terminated_ CHAR *NPSTR, *LPSTR, *PSTR;  就是一个以/0结尾的字符串

#ifndef VOID
#define VOID void
typedef char CHAR;

二、LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

参数:

hwnd:窗口句柄

message:消息ID

wParam和lParam:消息参数

宏定义:

LRESULT、WPARAM、LPARAM:

typedef UINT_PTR WPARAM;
typedef LONG_PTR LPARAM;
typedef LONG_PTR LRESULT;

typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;

typedef _W64 long LONG_PTR, *PLONG_PTR;

CALLBACK:#define CALLBACK    __stdcall

HWND:DECLARE_HANDLE            (HWND);   与HINSTANCE的定义类似

UINT:typedef unsigned int        UINT;

三、窗口诞生过程总结

定义窗口类结构(WNDCLASS)

#ifdef UNICODE
typedef WNDCLASSW WNDCLASS;
typedef PWNDCLASSW PWNDCLASS;
typedef NPWNDCLASSW NPWNDCLASS;
typedef LPWNDCLASSW LPWNDCLASS;
#else
typedef WNDCLASSA WNDCLASS;
typedef PWNDCLASSA PWNDCLASS;
typedef NPWNDCLASSA NPWNDCLASS;
typedef LPWNDCLASSA LPWNDCLASS;
#endif // UNICODE

结构成员:

typedef struct tagWNDCLASSW {
UINT style;                          //窗口类型
WNDPROC lpfnWndProc;      //窗口过程(必须是回调函数)
int cbClsExtra;                    //预留的额外空间,一般为0
int cbWndExtra;                  //预留的额外空间,一般为0
HINSTANCE hInstance;         //应用程序的实例句柄
HICON hIcon;                      //为所有基于该窗口类的窗口设定一个图标
HCURSOR hCursor;              //为所有基于该窗口类的窗口设定一个鼠标指针
HBRUSH hbrBackground;      //指定窗口背景色
LPCWSTR lpszMenuName;     //指定窗口菜单
LPCWSTR lpszClassName;     //指定窗口类名
} WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;

注册窗口类

RegisterClass:注册在随后调用CreateWindow函数和CreateWindowEx函数中使用的窗口类。

参数为lpWndClass,指向一个WNDCLASS结构的指针

返回值:ATOM的宏定义

typedef WORD ATOM;

typedef unsigned short WORD;

关于RegisterClassEx:参数lpwcx指向一个WNDCLASSEX结构的指针如果函数成功,返回这个窗口类型的标识号;如果函数失败,返回值为0。若想获得更多错误信息,请调用GetLastError函数。

创建窗口

HWND WINAPI CreateWindow(
_In_opt_   LPCTSTR  lpClassName, // 窗口类名称
_In_opt_   LPCTSTR  lpWindowName, // 窗口标题
_In_       DWORD     dwStyle, // 窗口风格,或称窗口格式
_In_       int       x, // 初始 x 坐标
_In_       int       y, // 初始 y 坐标
_In_       int       nWidth, // 初始 x 方向尺寸
_In_       int       nHeight, // 初始 y 方向尺寸
_In_opt_   HWND    hWndParent, // 父窗口句柄
_In_opt_   HMENU   hMenu, // 窗口菜单句柄
_In_opt_   HINSTANCE   hInstance, // 程序实例句柄
_In_opt_   LPVOID   lpParam // 创建参数
);

_In_说明该参数是输入的,_opt_说明该参数是可选参数

函数成功返回窗口句柄,否则返回NULL

显示窗口

BOOL WINAPI ShowWindow(
_In_ HWND hWnd,
_In_ int nCmdShow
);

第一次调用时应使用WinMain的参数nCmdShow作为参数

如果窗口之前可见,则返回非0否则返回0

更新窗口

BOOL UpdateWindow(
_In_ HWND hWnd
);

绕过消息队列直接向窗口过程发送WM_PAINT消息

函数调用成功返回非0

消息循环

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/66705.html