(一)Win消息机制,SDK编程基础
一,基本概念
SDK:软件开发工具包(缩写:SDK、外语全称:Software Development Kit)
API:应用程序接口
WINAPI:Windows平台下的系统调用,包含 windows.h
窗口:父窗口和子窗口,客户区和非客户区
句柄:结构体变量,窗口句柄 :HWND,图标句柄:HICO,类似于文件操作符,进程控制块等
消息队列
消息
窗口过程函数
main()
WinMain() // WINAPI 入口地址
二,winAPI窗口程序
1.定义入口函数Win Main()
2.创建一个窗口
a),设计窗口类 WNDCLASS (给成员变量赋值)
b),注册窗口类
c),显示和更新窗口
3,消息循坏
4,窗口过程函数
MSDN:winAPI,MFC
#include <Windows.h> LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { return DefWindowProc(hwnd,uMsg,wParam,lParam); } // WINAPI:修饰函数,规定函数参数入栈从右往左,函数调用完毕,自动清理堆栈 // CALLBACK int WINAPI WinMain(HINSTANCE hInstance, // 应用程序实例 HINSTANCE hPreInstabce,// 上一个应用程序实例,不用 LPSTR lpCmdLine, // LPSTR :typedef CHAR * LPSTR,long pointer string. 命令行参数 int nCmdShow // 窗口显示的样式,最大化,最小化 ) { /* 1,定义入口函数WinMain() 2,创建一个窗口 a),设计窗口类 WNDCLASS (给成员变量赋值) b),注册窗口类 c),显示和更新窗口 3,消息循环 4,窗口过程函数 */ // 设计窗口类 WNDCLASS WNDCLASS wc; wc.cbClsExtra = 0;// 类的附加信息 wc.cbWndExtra = 0;// 窗口的附加信息 // 获取系统默认的白色画刷 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 背景色,必须写 //wc.hCursor = NULL; // 使用默认 wc.hCursor = LoadCursor(NULL, IDC_HELP); // 加载系统默认光标 //wc.hIcon = NULL; wc.hIcon = LoadIcon(NULL,IDI_WARNING); // 加载系统默认图标 wc.hInstance = hInstance; // 应用程序实例 wc.lpfnWndProc = WindowProc; // 窗口过程函数名字,消息处理函数 wc.lpszClassName = TEXT("abc"); // 类的名字 wc.lpszMenuName = NULL; // 菜单的名字 wc.style = nCmdShow; // 显示风格 // 注册窗口类,告诉系统窗口过程函数的入口地址 RegisterClass(&wc); // 创建窗口类 HWND hWnd = CreateWindow(TEXT("abc"), TEXT("hello,windows"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); // 显示和更新窗口 ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); // 消息循环 MSG msg; // 如果接收到 WM_QUIT,返回 0,退出 // 如果出错,返回 -1,不退出 while (GetMessage(&msg, hWnd, 0, 0)) { // 翻译工作 // 虚拟按键转为标准字符 WM_CHAR TranslateMessage(&msg); // 给操作系统分发消息 DispatchMessage(&msg); } return msg.wParam; }
LRESULT CALLBACK WindowProc(HWND hwnd, // 窗口句柄,消息所属的窗口 UINT uMsg,// 消息标志 WPARAM wParam,// 附件信息 LPARAM lParam ) { switch (uMsg) { case WM_LBUTTONDOWN: MessageBox(hwnd,TEXT("ABC"), TEXT("鼠标左键安下"),MB_OK); break; case WM_DESTROY: PostQuitMessage(2); // WM_QUIT,给主函数 return msg.wParam break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } }
绘图
LRESULT CALLBACK WindowProc(HWND hwnd, // 窗口句柄,消息所属的窗口 UINT uMsg,// 消息标志 WPARAM wParam,// 附件信息 LPARAM lParam ) { switch (uMsg) { case WM_LBUTTONDOWN: MessageBox(hwnd,TEXT("ABC"), TEXT("鼠标左键安下"),MB_OK); break; case WM_PAINT: { PAINTSTRUCT ps;// 绘图结构体 HDC dc = BeginPaint(hwnd, &ps); // 开始 WCHAR *p = L"aaaaaaa";// 转为宽字节 TextOut(dc, 30, 30, p, wcslen(p)); EndPaint(hwnd, &ps); break; } case WM_DESTROY: PostQuitMessage(2); // WM_QUIT,给主函数 return msg.wParam break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } }