SDk :软件开发工具包
Api :Windows操作系统提供给应用程序编程的接口,windows.h
窗口:窗口是屏幕上的一块矩形区域,是Windows应用程序与用户进行交互的接口,分为客户区与非客户区,窗口通过窗口句柄(HWND)来标识。
句柄:在windows程序中,有各种各样的资源(窗口、图标、光标、画刷等),系统在创建这些资源时会为它们分配内存,并返回标识这些资源的标识号,即句柄。比如 图标句柄(HICON)、光标句柄(HCURSOR)、画刷句柄(HBRUSH) HANCLE
消息:
消息队列:每一个Windows应用程序开始执行后,系统都会为该程序创建一个消息队列,这个消息队列用来存放该程序创建的窗口的消息
窗口触发事件,操作系统会将该事件封装成一个消息,放入消息队列,应用程序会从消息队列中读取消息,然后通过DispatclMessage() 分发给操作系统,操作系统会做一个窗口过程(类似于回调函数)
winMain函数:winmain是windows程序的入口点函数,与Dos程序的入口点函数main的作用相同,当winmain函数结束或返回时,windows应用程序结束。
Windows编程模型:一个完成的win32程序,程序的实现步骤为:①winmain函数的定义②创建一个窗口③进行消息循环④编写窗口过程函数
在win32程序中,学习windows.h 的原理
#include <Windows.h> //底层实现窗口的文件 //6.处理消息(窗口过程) LRESULT CALLBACK WindowProc( HWND hwnd, //消息所属的窗口句柄 UINT uMsg, //具体的消息名称 WM_XXX 消息名 WPARAM wParam, //键盘附加消息 LPARAM lParam //鼠标附加消息 ) { switch (uMsg) { case WM_CLOSE:
//所有XXWindow为结尾的方法,都不会进入到消息队列中,而是直接执行 DestroyWindow(hwnd); //DestroyWindow 发送另一个消息 WM_DESROY break; case WM_DESTROY: PostQuitMessage(0); //退出程序的函数 退出进程 break; case WM_LBUTTONDOWN: //鼠标左键按下的消息 { int xPos = LOWORD(lParam); int yPos = HIWORD(lParam); char buf[1024]; wsprintf(buf,TEXT("x = %d,y = %d"), xPos, yPos); MessageBox(hwnd,buf,TEXT("鼠标左键按下"),MB_OK); break; } case WM_KEYDOWN: //键盘 MessageBox(hwnd, TEXT("key"), TEXT("键盘按下"), MB_OK); break; case WM_PAINT: //绘图 { PAINTSTRUCT ps; //绘图结构体 HDC hdc = BeginPaint(hwnd, &ps); //开始画图 TextOut(hdc, 100, 100, TEXT("Hello"), strlen("Hello")); //画文字 EndPaint(hwnd, &ps); break; } default: break; } //返回值用默认处理方式 return DefWindowProc(hwnd, uMsg, wParam, lParam); } //程序入口函数 //WINAPI 代表_stdcall 参数的传递顺序:从右到左 依次入栈,并且在函数返回前 清空堆栈 int WINAPI WinMain( HINSTANCE hInstance, //应用程序实例句柄 HINSTANCE hPrevInstance, //上一个应用程序句柄,在win32环境下,参数一般为Null,不起作用了 LPSTR lpCmdLine, // char * argv[] int nShowCmd) // 显示命令 最大化、最小化、正常 { //1.设计窗口 /* 设计窗口,首先要有一个窗口对象,WNDCLASS */ WNDCLASS wc; wc.cbClsExtra = 0; //类的额外的内存 wc.cbWndExtra = 0; //窗口额外的内存 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //设置背景 wc.hCursor = LoadCursor(NULL, IDC_HAND); //设置光标,如果第一个参数是NULL,代表使用系统提供的光标 wc.hIcon = LoadIcon(NULL, IDI_ERROR); //图标, 如果第一个参数是NULL,代表使用系统提供的ICON wc.hInstance = hInstance; //应用程序实例句柄,传入WinMain中的形参即可 wc.lpszClassName = TEXT("WIN"); //指定窗口类名称 wc.lpszMenuName = NULL; //菜单名称 wc.style = 0; //显示风格 0代表默认风格 wc.lpfnWndProc = WindowProc; //回调函数 即窗口过程 //2.注册窗口类 RegisterClass(&wc); //3.创建窗口 /* lpClassName 类名 lpWindowName 标题名 dwStyle WS_OVERLAPPEDWINDOW 风格 x 显示坐标 CW_USEDEFAULT 默认值 y nWidth, 宽高 nHeight, hWndParent, 父窗口 hMenu, 菜单 NULL hInstance, 实例句柄 hInstance lpParam 附加值 NULL */ HWND hwnd = CreateWindow(wc.lpszClassName,TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,NULL,NULL,hInstance,NULL); //4.显示和更新 ShowWindow(hwnd,SW_SHOWNORMAL); UpdateWindow(hwnd); //5.通过循环取消息 /* HWND hwnd; 主窗口句柄 UINT message; 具体消息名称 WPARAM wParam; 附加消息 键盘消息 LPARAM lParam; 附加消息 鼠标消息 DWORD time; 消息产生时间 POINT pt; 附加消息 鼠标消息 坐标点信息 x y */ MSG msg; while (1) { /* _Out_ LPMSG lpMsg, 消息 lpxxx代表指针 _In_opt_ HWND hWnd, 捕获窗口 NULL代表捕获所有的窗口 _In_ UINT wMsgFilterMin, 最小和最大的过滤的消息 一般填0 _In_ UINT wMsgFilterMax 0 代表捕获所有的消息 */ if (GetMessage(&msg,NULL,0,0) == FALSE) { break; } //分发前 翻译消息 判断是否为组合键的消息 TranslateMessage(&msg); //不为FALSE //分发消息 DispatchMessage(&msg); } }