windows api学习笔记-简单的记事本
#include <windows.h> #include "resource.h" #include <string> LRESULT CALLBACK MainWndProc( HWND , UINT , WPARAM , LPARAM ); //窗口函数的函数原型 int APIENTRY WinMain( //APIENTRY是__stdcall的宏定义 HINSTANCE hInstance, //本模块的实例句柄 HINSTANCE hPrevInstance, //Win16留下的废物 LPSTR lpCmdLine, //命令行参数 int nCmdShow //主窗口初始化时的现实形式 ) { char szClassName[] = "MainClass" ; WNDCLASSEX wndclass; //用来描述主窗口的结构 wndclass.cbSize = sizeof (wndclass); //结构的大小 wndclass.style = CS_HREDRAW|CS_VREDRAW; //如果窗口大小,横向改变和竖向改变都会重画窗口 wndclass.lpfnWndProc = MainWndProc; //窗口函数指针 wndclass.cbClsExtra = 0; //没有额外的类内存 wndclass.cbWndExtra = 0; //没有额外的窗口内存 wndclass.hInstance = hInstance; //实例句柄 wndclass.hIcon = ::LoadIcon(NULL,IDI_APPLICATION); //使用预定义图标 wndclass.hCursor = ::LoadCursor(NULL,IDC_ARROW); //使用预定义光标 wndclass.hbrBackground = ( HBRUSH )::GetStockObject(WHITE_BRUSH); //使用白色背景画刷 wndclass.lpszMenuName = ( LPSTR )IDR_MENU1; //指定菜单,菜单在头文件中已经定义了 wndclass.lpszClassName = szClassName; //窗口类的名称 wndclass.hIconSm = NULL; //没有类的小图标 ::RegisterClassEx(&wndclass); //注册这个窗口类 HWND hwnd = ::CreateWindowEx( 0, //扩展样式 szClassName, //类名 "My First Window" , //窗口名。标题 WS_OVERLAPPEDWINDOW, //窗口风格 CW_USEDEFAULT, //初始X坐标 CW_USEDEFAULT, //初始Y坐标 CW_USEDEFAULT, //宽度 CW_USEDEFAULT, //高度 NULL, //父窗口句柄 NULL, //菜单句柄 hInstance, //实例句柄 NULL //用户数据 ); if (hwnd == NULL) { ::MessageBox(NULL, "创建窗口出错" , "系统提示" ,MB_OK); } ::ShowWindow(hwnd,nCmdShow); //显示窗口 ::UpdateWindow(hwnd); //刷新窗口 MSG msg; while (::GetMessage(&msg,NULL,0,0)) { ::TranslateMessage(&msg); //转换为键盘消息 ::DispatchMessage(&msg); //将消息发送到相应的窗口函数 } return msg.wParam; //当GetMessage返回FALSE时程序结束 } LRESULT CALLBACK MainWndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static std::string str; switch (message) { case WM_CREATE: { ::SetWindowText(hwnd, "打字程序" ); return 0; } case WM_CHAR: { str = str+ char (wParam); ::InvalidateRect(hwnd,NULL,0); //使整个客户区无效,迫使系统再次发送WM_PAINT消息 return 0; } case WM_PAINT: { HDC hdc; PAINTSTRUCT ps; hdc = ::BeginPaint(hwnd,&ps); //使无效的客户区变的有效,并取得设备环境句柄 ::TextOut(hdc,0,0,str.c_str(),str.length()); //输出文本 ::EndPaint(hwnd,&ps); return 0; } case WM_DESTROY: { ::PostQuitMessage(0); //向消息队列投递一个WM_QUIT消息,促使GET MESSAGE函数返回0,结束消息循环 return 0; } case WM_COMMAND: { switch (LOWORD(wParam)) { case ID_FILE_EXIT: ::SendMessage(hwnd,WM_CLOSE,0,0); break ; } return 0; } } return ::DefWindowProc(hwnd,message,wParam,lParam); } |
resource.h的代码为
//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by a.rc // #define IDR_MENU1 101 #define ID_FILE_EXIT 40001 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 102 #define _APS_NEXT_COMMAND_VALUE 40002 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif |
分类:
WIN API学习笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统