事件驱动编程模型 一切都是窗口:窗口和句柄 消息与消息队列 设计->注册->创建->显标更新->消息。
#include <windows.h>//窗口过程回调函数 H是Handler的简写,句柄LRESULT CALLBACK WndPRoc(HWND,UINT,WPARAM,LPARAM);//相当于 int main()// 实例句柄int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow){ HWND hwnd;//窗口句柄 MSG msg;//消息 WNDCLASS wc;//窗口类 //1.设计一个窗口类 wc.style = 0; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = NULL; wc.lpszClassName = TEXT("MyWndClass"); //2.注册窗口类 RegisterClass(&wc); //3.创建窗口 hwnd = CreateWindow( TEXT("MyWndClass"), TEXT("Hello SDK application"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL,//父窗口句柄 NULL,//窗口菜单句柄 hInstance, NULL); //4.显示和更新窗口 ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd); //5.消息循环 while(GetMessage(&msg,NULL,0,0)){ TranslateMessage(&msg); DispatchMessage(&msg);//转发到窗口过程 } return msg.wParam;}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ PAINTSTRUCT ps; HDC hdc;//DC句柄 RECT rect; //对各种消息进行处理 switch(message) { case WM_SIZE: //重画 Paint return 0; case WM_LBUTTONDOWN: //MessageBox(hwnd,TEXT("Mouse Clicked!"),TEXT("消息"),MB_OK); //PostQuitMessage(0); return 0; case WM_PAINT: //绘制消息 hdc = BeginPaint(hwnd,&ps); GetClientRect(hwnd,&rect); //Ellipse(hdc,0,0,200,100); DrawText(hdc,TEXT("Hello, Windows!"),-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);}handle HINSTANCE//模块句柄 HWND //窗口句柄 HDC //画布句柄 HICON //图标句柄 HCURSOR //光标句柄 HBRUSH //画刷句柄
WNDCLASS 窗口类
typedef struct _WNDCLASS {UINT style; // 窗口类型WNDPROC lpfnWndProc; //窗口处理函数int cbClsExtra; //窗口扩展int cbWndExtra; //窗口实例扩展HINSTANCE hInstance; //实例句柄HICON hIcon; //窗口的最小化图标HCURSOR hCursor; //窗口鼠标光标HBRUSH hbrBackground; //窗口背景色LPCTSTR lpszMenuName; //窗口菜单LPCTSTR lpszClassName; // 窗口类名} WNDCLASS, *LPWNDCLASS;MSG 消息结构
typedef struct tagMSG{ HWND hwnd; 窗口句柄(索引内存当中的资源) UINT(无符号整型) message; WPARAM(整型) wParam; //关于消息的附加参数,例如:按下一个键,具体是哪个按键 LPARAM(整型) LParam; //关于消息的附加参数 DWord(32位整数) time;//消息被传递时候的时间 POINT(坐标结构体) pt; //消息被传递时候,光标在屏幕上的位置} MSG;PAINTSTRUCT画布结构
typedef struct tagPAINTSTRUCT { HDC hdc;//用于绘制的句柄 BOOL fErase;//如果为非零值则擦除背景,否则不擦除背景 RECT rcPaint;//通过制定左上角和右下角的坐标确定一个要绘制的矩形范围,该矩形单位相对于客户区左上角 BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[32];} PAINTSTRUCT, *PPAINTSTRUCT;RECT 矩型结构
typedef struct tagRECT{LONG left; //指定矩形左上角的X坐标LONG top; //指定矩形左上角的Y坐标LONG right; //指定矩形右下角的X坐标LONG bottom;//指定矩形右下角的Y坐标} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;新闻热点
疑难解答