Windows编程模型与API调用示例
Windows编程模型示意图:
打开VS2010,选择语言VC++,创建一个WIN32项目,例如叫DEMO。
打开DEMO.CPP文件,会看到VS已经帮我们写了几个函数(这几个函数其实是VS帮我们包了一层,原生函数后面会介绍):
////注册窗体函数
ATOM MyRegisterClass(HINSTANCEhInstance);
////初始化
BOOL InitInstance(HINSTANCE,int);
////处理windows消息的函数
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
注册窗口
WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;////窗口的风格 wcex.lpfnWndProc = WndProc;////窗口消息处理函数的指针 wcex.cbClsExtra = 0;////分配给窗口类结构之后的额外字节数 wcex.cbWndExtra = 0;////分配给窗口实例之后的额外字节数 wcex.hInstance = hInstance;////窗口所对应的应用程序句柄 wcex.hIcon =LoadIcon(hInstance, MAKEINTRESOURCE(IDI_CGAMEDEMO));////窗口的坐标 wcex.hCursor = LoadCursor(NULL, IDC_ARROW);////窗口的鼠标 wcex.hbrBackground = CreateSolidBrush(RGB(100,0,0)); ////窗口的背景(这里调用了CreateSolidBrush API函数) wcex.lpszMenuName = NULL,//MAKEINTRESOURCE(IDC_CGAMEDEMO);////窗口的菜单资源名称 wcex.lpszClassName = szWindowClass;////窗口类的名称 wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex);////注册窗口
创建窗口
hWnd =CreateWindow( szWindowClass,////创建窗口所用的窗口类的名称 NULL,// szTitle, ////窗口标题 WS_OVERLAPPEDWINDOW,////窗口风格,定义为普通型 0,////窗口位置的X坐标 0,////窗口位置的Y坐标 1000,////窗口的宽度 1000, ////窗口的高度 NULL,////父窗口句柄 NULL, ////菜单句柄 hInstance,////应用程序句柄 NULL);////一般为NULL
显示窗口
if (!hWnd) { return FALSE; } ////告诉系统显示窗口 ShowWindow(hWnd, nCmdShow); ////立即显示窗口 UpdateWindow(hWnd);
消息循环
// 主消息循环: while (GetMessage(&msg, NULL, 0,0)) { if(!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } }
消息处理函数以及API调用
/*
为了演示鼠标事件,在这里放了几个变量,存鼠标的坐标
*/
int a ,b; char ac[25]; char bc[25]; char ret[50]; ////HWND hWnd,窗口句柄 ////UINT message,主消息 ////WPARAM wParam,副消息1(例如,如果主消息是键盘消息,这里存键值) ////LPARAM lParam副消息2 LRESULT CALLBACK WndProc(HWND hWnd, UINT message,WPARAM wParam, LPARAM lParam) { intwmId, wmEvent; PAINTSTRUCTps; HDC hdc; switch(message) { case WM_KEYDOWN:////键盘消息 switch(wParam){////从副消息中拿出键盘值 caseVK_SPACE: MessageBox(hWnd,_T("按下了空格键"),_T("test"),MB_OK); break; } break; ////右键按下 caseWM_RBUTTONDOWN: a= LOWORD(lParam);////从副消息里面拿鼠标点击的X坐标 b= HIWORD(lParam);////拿Y坐标 itoa(a,ac,10); itoa(b,bc,10); strcat(ret,ac); strcat(ret,","); strcat(ret,bc); MessageBoxA(hWnd,ret,"test",MB_OK); strcpy(ret,""); break; ////左键按下 caseWM_LBUTTONDOWN: MessageBoxA(hwnd, “按下了左键","test",MB_YESNO|MB_HELP|MB_ICONERROR); break; caseWM_COMMAND:////菜单消息(因为用的VS,所以创建项目时候IDE给带了这个) wmId = LOWORD(wParam); wmEvent= HIWORD(wParam); //分析菜单选择: switch(wmId) { caseIDM_ABOUT: DialogBox(hInst,MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; caseIDM_EXIT: DestroyWindow(hWnd); break; default: returnDefWindowProc(hWnd, message, wParam, lParam); } break; caseWM_PAINT: hdc= BeginPaint(hWnd, &ps); //TODO: 在此添加任意绘图代码... EndPaint(hWnd,&ps); break; caseWM_DESTROY:////窗体销毁 PostQuitMessage(0); break; default: returnDefWindowProc(hWnd, message, wParam, lParam); } return0; }