前言:
学习逆向工程经典书籍《加密与解密》需要先学习《windows程序设计》这本书籍,在来来回回折腾之后,遂决定好好品读这本书,以为看《加密与解密》打基础,
写博客是为了加强对知识的理解及巩固以及对知识的复习。好了不多说,下面上代码:
#include<windows.h> LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT("HelloWin"); HWND hwnd; MSG msg; WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; if (!RegisterClass(&wndclass)) { MessageBox(NULL, TEXT("This Program requires Windows NT!"), szAppName, MB_ICONERROR); return 0; } hwnd = CreateWindow( szAppName, //窗口类名称 TEXT("The Hello Program"), //窗口标题 WS_OVERLAPPEDWINDOW, //窗口风格 CW_USEDEFAULT, //初始x坐标 CW_USEDEFAULT, //初始y坐标 CW_USEDEFAULT, //初始x方向长度 CW_USEDEFAULT, //初始y方向长度 NULL, //父窗口句柄 NULL, //窗口菜单句柄 hInstance, //程序实例句柄 NULL //创建参数 ); ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; switch (message) { case WM_CREATE: return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rect); DrawText(hdc, TEXT("Hello World!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint(hwnd, &ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }
WinMain的四个参数分别代表的含义是:hInstance代表当前实例句柄,hPrevInstance代表上一个程序的实例句柄,szCmdLine代表命令行,iCmdShow代表程序窗口是以最大化、最小化展示。
代码中的ShowWindow在屏幕中显示窗口,而UpdateWindow则会向窗口过程函数发送WM_PAINT消息使窗口进行重绘,CreateWindow则会在内部创建窗口并保存数据,直到ShowWindow调用显示窗口。在调用CreateWindow时,会产生WM_CREATE对窗口进行一些初始化工作。
基于一个窗口类可以创建多个窗口,创建多个窗口使只需要在CreateWindow函数中初始化第一个参数为窗口类的名称(也就是wndclass.lpszClassName)。
GetClientRect函数第二个参数会获取客户区的尺寸,以便DrawText在客户区尺寸内显示文本,DrawText中的-1是指字符串以0结尾。
任何没有对应case的消息会由DefWindowProc进行处理,以及每条消息处理完后都要返回0。