创建一个完整的窗口需要经过下面四个操作步骤:
1. 设计一个窗口类;
2. 注册窗口类;
3. 创建窗口;
4. 显示及更新窗口;
注册类:
typedef struct _WNDCLASS {
UINT style; // 窗口的风格
WNDPROC lpfnWndProc; // 窗口过程指针
int cbClsExtra; // 类额外附加参数
int cbWndExtra; // 窗口额外附加参数
HANDLE hInstance; // 当前应用程序实例句柄
HICON hIcon; // 程序图标句柄
HCURSOR hCursor; // 程序光标句柄
HBRUSH hbrBackground; // 程序背景刷子
LPCTSTR lpszMenuName; // 程序菜单名字
LPCTSTR lpszClassName; // 类名
} WNDCLASS;
加载图标函数:
HICON WINAPI LoadIcon(
_In_opt_ HINSTANCE hInstance,// 应用程序实例句柄, 用标准图标(系统图标的时候此参数为NULL),下面的参数可以用系统的宏定义.
_In_ LPCTSTR lpIconName
);
加载光标函数:
HCURSOR WINAPI LoadCursor(
_In_opt_ HINSTANCE hInstance, // 应用程序实例句柄, 用标准光标(系统光标的时候此参数为NULL),下面的参数可以用系统的宏定义.
_In_ LPCTSTR lpCursorName
);
获取一个预定义的对象(画笔, 刷子, 字体)函数:
HGDIOBJ GetStockObject(
int fnObject // 预定的一些对象(参照MSDN)
);
注册窗口类函数:
ATOM RegisterClass(
const WNDCLASS* lpWndClass // 已填写的窗口类指针
);
创建窗口的函数:(该函数会返回一个窗口句柄)
HWND CreateWindow(
LPCTSTR lpClassName, // 窗口类名(必须是已经注册的窗口类)
LPCTSTR lpWindowName, // 应用程序标题字符串
DWORD dwStyle, // 窗口类型(详情参照MSDN)
int x, // 窗口的垂直坐标(CW_USEDEFAULT 为系统默认)
int y, // 窗口的水平坐标
int nWidth, // 窗口的宽度
int nHeight, // 窗口的高度
HWND hWndParent, // 创建窗口的父类句柄
HMENU hMenu, // 菜单
HANDLE hInstance, // 应用程序实例句柄
PVOID lpParam // 附加参数
);
显示窗口函数:
BOOL WINAPI ShowWindow(
_In_ HWND hWnd, // 窗口的句柄
_In_ int nCmdShow // 显示的方式(参见MSDN)
);
更新窗口函数:
BOOL UpdateWindow(
HWND hWnd // 要更新的窗口句柄
);
消息结构体:
typedef struct tagMSG {
HWND hwnd; //窗口句柄
UINT message; //消息码
WPARAM wParam; //高字节附加信息
LPARAM lParam; //低字节附加信息
DWORD time; //消息的时间
POINT pt; //鼠标的位置
} MSG;
BOOL GetMessage(
LPMSG lpMsg, // 消息结构体的指针
HWND hWnd, // 想获取哪个窗口的句柄, NULL为想获取所有的消息
UINT wMsgFilterMin, // 设定消息范围的最小值.(都设为0为没有限制)
UINT wMsgFilterMax // 设定消息范围的最大值
);
消息派发函数:DispatchMessage(&msg); // 将消息发送出去,;
窗口过程函数:
LRESULT CALLBACK WindowProc(
HWND hwnd, // 窗口句柄
UINT uMsg, // 消息码
WPARAM wParam, // 高字节附加信息
LPARAM lParam // 低字节附加信息
);
int MessageBox(
HWND hWnd, // 窗口句柄
LPCTSTR lpText, // 要显示的文本
LPCTSTR lpCaption, // 消息框的标题
UINT uType // 显示的方式(详见MSDN)
);
在WM_PINT消息之外处理绘图事件时需要调用GetDC 和ReleaseDC 这两个函数, 在这两个函数之间处理绘图消息
HDC GetDC(
HWND hWnd // 窗口句柄
);
int ReleaseDC(
HWND hWnd, // 窗口句柄
HDC hDC // 绘图设备句柄
);
在WM_PAINT消息内处理绘图事件时需要在BeginPaint 和 EndPaint() 这两个函数之间处理绘图消息
HDC BeginPaint(
HWND hwnd, // 窗口句柄
LPPAINTSTRUCT lpPaint // (内部维护的一个PAINTSTRUST) 传入一个PAINTSTRINT 结构体的指针
);
BOOL EndPaint(
HWND hWnd, // 窗口句柄
CONST PAINTSTRUCT* lpPaint PAINTSTRUST 结构体指针
);
销毁窗口函数:
BOOL DestroyWindow(
HWND hWnd // 窗口句柄
);
退出消息循环函数:
void PostQuitMessage(
int nExitCode //退出码
);
缺省窗口过程函数::
LRESULT WINAPI DefWindowProc(
_In_ HWND hWnd, // 窗口句柄
_In_ UINT Msg, // 消息码
_In_ WPARAM wParam, // 高字节附加参数
_In_ LPARAM lParam // 低字节附加参数
);