当windows操作系统启动一个程序时 , 它调用的就是该程序的WinMain函数( 实际是由插入到可执行文件中的启动代码调用的) 。WinMain是Windows程序的入口点函数 , 与DOS程序的入口点函数main的作用相同 , 当WinMain 函数结束或返回时 , Windows应用程序结束 。什么是Windows API编程
- 应用编程接口
- Application Programming Interface
int WINAPI WinMain(HINSTANCE hInstance,//应用程序实例HINSTANCE hPrevInstance,//上一个应用程序实例LPSTR lpCmdLine,//命令行参数int nShowCmd//窗口显示的样式);
- WINAPI:是一个宏 , 它代表的是__stdcall(注意是两个下划线) , 表示的是参数传递的顺序:从右往左入栈 , 同时在函数返回前自动清空堆栈 。
- hInstance:表示该程序当前运行的实例的句柄 , 这是一个数值 。当程序在Windows下运行时 , 它唯一标识运行中的实例(注意 , 只有运行中的程序实例 , 才有实例句柄) 。一个应用程序可以运行多个实例 , 每运行一个实例 , 系统都会给该实例分配一个句柄值 , 并通过hInstance参数传递给 WinMain 函数 。
- hPrevInstance:表示当前实例的前一个实例的句柄 。在Win32环境下 , 这个参数总是NULL , 即在Win32环境下 , 这个参数不再起作用 。
- lpCmdLine:是一个以空终止的字符串 , 指定传递给应用程序的命令行参数 , 相当于C或C++中的main函数中的参数char *argv[] 。
- nShowCmd:表示一个窗口的显示 , 表示它是要最大化显示、最小化显示、正常大小显示还是隐藏显示 。
#include <Windows.h>#include <cstdio>#pragma comment(linker, "/subsystem:"console" /entry:"WinMainCRTStartup"")int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow) {printf("%p %p %pn", hInstance, hPrevInstance, GetModuleHandleA(NULL));printf("%d %dn", nCmdShow, SW_SHOWNORMAL);printf("%sn", lpCmdLine);MessageBoxA(NULL, TEXT("第一个 Windows API 程序"), TEXT("黑猫编程"), MB_OK);return 0;}
字符集 #include <Windows.h>#include <cstdio>#include <cstring>#include <clocale>int main() {const char* str1 = "Abc中国";printf("%s%dn", str1, strlen(str1));_wsetlocale(LC_ALL, L"chs");const wchar_t* str2 = L"ABC中国文字";wprintf(L"%s%dn", str2, wcslen(str2));MessageBoxW(NULL, TEXT("hello cat."), L"coding", MB_OK);return 0;}
Windows 编程模型【C++如何创建窗口程序?Windows API永不过时】一个完整的Win32程序(#include <windows.h>) , 该程序实现的功能是创建一个窗口 , 并在该窗口中响应键盘及鼠标消息 , 程序的实现步骤为:- WinMain函数的定义
- 创建一个窗口
- 进行消息循环
- 编写窗口过程函数
文章插图
项目创建
文章插图
文章插图
窗口程序模板代码
#include <Windows.h>// 自定义窗口过程回调函数LRESULT CALLBACK MyWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) {switch (Msg) {case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProcA(hwnd, Msg, wParam, lParam);}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {// 注册窗口类WNDCLASS wnd;wnd.cbClsExtra = 0;wnd.cbWndExtra = 0;wnd.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH));wnd.hCursor = LoadIcon(NULL, IDC_ARROW);wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION);wnd.lpfnWndProc = MyWindowProc;wnd.lpszClassName = TEXT("blackcat");wnd.lpszMenuName = NULL;wnd.style = CS_HREDRAW;wnd.hInstance = hInstance;RegisterClassA(&wnd);// 创建窗口 返回之前发送 VW_CREATEHWND hwnd = CreateWindowA(TEXT("blackcat"),TEXT("黑猫编程"),WS_OVERLAPPEDWINDOW,100, 100, 300, 300, NULL, NULL, hInstance, NULL);// 显示窗口ShowWindow(hwnd, nShowCmd);// 更新窗口UpdateWindow(hwnd);// 消息循环 收到 VM_QUIT 退出MSG msg;while (GetMessageA(&msg, hwnd, 0, 0)) {TranslateMessage(&msg);DispatchMessageA(&msg);}return 0;}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 无需打开应用,如何用 api 实现在 Notion 的表格中写入数据
- 如何查看你的QQ注册时间和全球排名?附详细操作教程
- 如何成为优秀的工业设计师?
- C++新特性 nullptr 和 constexpr
- 机器学习如何检测使用沙盒逃避和静态防护的恶意软件
- 39万家定点药店迎门诊统筹利好:药价、报销方式将如何变化
- 买房风水三不买 买房如何看风水
- 如何泡黑豆醋 醋泡生黑豆
- 新鲜白果如何去壳.白果怎么去壳去皮
- 成灌高铁公交化后票价如何 成灌快铁时刻表