Visual studio code编写简单记事本exe笔记

安装扩展cmake tools
c/c++
c/c++ Extension pack

CMakeLists.txt

cmake_minimum_required(VERSION 3.20)
project(NotepadApp)set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# Windows specific settings
if(WIN32)set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
endif()# Include Windows SDK
if(WIN32)include_directories($ENV{WindowsSdkDir}Include/10.0.26100.0/um)include_directories($ENV{WindowsSdkDir}Include/10.0.26100.0/shared)link_directories($ENV{WindowsSdkDir}Lib/10.0.26100.0/um/x64)
endif()# Add executable
add_executable(NotepadApp WIN32 src/main.cpp)# Windows specific libraries
if(WIN32)target_link_libraries(NotepadAppComctl32.libComdlg32.libGdi32.libUser32.libShell32.lib)
endif()

src/main.cpp

#include <windows.h>
#include <commdlg.h> // 用于打开文件对话框const char g_szClassName[] = "notepadWindowClass";// 保存文件函数
void SaveFile(HWND hwnd) {HWND hEdit = GetWindow(hwnd, GW_CHILD);int len = GetWindowTextLength(hEdit) + 1;char* text = new char[len];GetWindowText(hEdit, text, len);OPENFILENAME ofn;char szFileName[MAX_PATH] = "";ZeroMemory(&ofn, sizeof(ofn));ofn.lStructSize = sizeof(ofn);ofn.hwndOwner = hwnd;ofn.lpstrFilter = "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0";ofn.lpstrFile = szFileName;ofn.nMaxFile = MAX_PATH;ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;ofn.lpstrDefExt = "txt";if (GetSaveFileName(&ofn)) {HANDLE hFile = CreateFile(ofn.lpstrFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile != INVALID_HANDLE_VALUE) {DWORD dwBytesWritten;WriteFile(hFile, text, len - 1, &dwBytesWritten, NULL);CloseHandle(hFile);}}delete[] text;
}// 打开文件函数
void OpenFile(HWND hwnd) {HWND hEdit = GetWindow(hwnd, GW_CHILD);OPENFILENAMEW ofn;wchar_t szFileName[MAX_PATH] = L"";ZeroMemory(&ofn, sizeof(ofn));ofn.lStructSize = sizeof(ofn);ofn.hwndOwner = hwnd;ofn.lpstrFilter = L"Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0";ofn.lpstrFile = szFileName;ofn.nMaxFile = MAX_PATH;ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;ofn.lpstrDefExt = L"txt";if (GetOpenFileNameW(&ofn)) {HANDLE hFile = CreateFileW(ofn.lpstrFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile != INVALID_HANDLE_VALUE) {DWORD dwFileSize = GetFileSize(hFile, NULL);char* text = new char[dwFileSize + 1];DWORD dwBytesRead;ReadFile(hFile, text, dwFileSize, &dwBytesRead, NULL);text[dwFileSize] = '\0'; // 添加字符串结束符// 将UTF-8转换为宽字符int wideLen = MultiByteToWideChar(CP_UTF8, 0, text, -1, NULL, 0);wchar_t* wideText = new wchar_t[wideLen];MultiByteToWideChar(CP_UTF8, 0, text, -1, wideText, wideLen);SetWindowTextW(hEdit, wideText);CloseHandle(hFile);delete[] text;delete[] wideText;}}
}LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{switch(msg){case WM_CREATE: {// 创建字体HFONT hFont = CreateFont(16, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE,"微软雅黑");// 创建编辑框HWND hEdit = CreateWindow("EDIT", "", WS_VISIBLE | WS_CHILD | WS_BORDER | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL,0, 0, 100, 100, hwnd, NULL, NULL, NULL);// 设置字体SendMessage(hEdit, WM_SETFONT, (WPARAM)hFont, TRUE);// 创建菜单栏HMENU hMenu = CreateMenu();HMENU hFileMenu = CreatePopupMenu();AppendMenu(hFileMenu, MF_STRING, 1, "Open");AppendMenu(hFileMenu, MF_STRING, 2, "Save");AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hFileMenu, "File");SetMenu(hwnd, hMenu); // 将菜单栏附加到窗口break;}case WM_COMMAND: {switch (LOWORD(wParam)) {case 1: // OpenOpenFile(hwnd);break;case 2: // SaveSaveFile(hwnd);break;}break;}case WM_SIZE: {HWND hEdit = GetWindow(hwnd, GW_CHILD);SetWindowPos(hEdit, NULL, 0, 0, LOWORD(lParam), HIWORD(lParam), SWP_NOZORDER);break;}case WM_CLOSE:DestroyWindow(hwnd);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd, msg, wParam, lParam);}return 0;
}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{WNDCLASSEX wc;HWND hwnd;MSG Msg;wc.cbSize        = sizeof(WNDCLASSEX);wc.style         = 0;wc.lpfnWndProc   = WndProc;wc.cbClsExtra    = 0;wc.cbWndExtra    = 0;wc.hInstance     = hInstance;wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);wc.hCursor       = LoadCursor(NULL, IDC_ARROW);wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);wc.lpszMenuName  = NULL;wc.lpszClassName = g_szClassName;wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);if(!RegisterClassEx(&wc)){MessageBox(NULL, "Window Registration Failed!", "Error!",MB_ICONEXCLAMATION | MB_OK);return 0;}hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,g_szClassName,"Notepad",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,NULL, NULL, hInstance, NULL);if(hwnd == NULL){MessageBox(NULL, "Window Creation Failed!", "Error!",MB_ICONEXCLAMATION | MB_OK);return 0;}ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);while(GetMessage(&Msg, NULL, 0, 0) > 0){TranslateMessage(&Msg);DispatchMessage(&Msg);}return Msg.wParam;
}

终端命令
1

cd build; cmake .. -G "Visual Studio 17 2022" -A x64 

2

cmake --build . --clean-first --config Release  

3

 bin/Release/NotepadApp.exe

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/503093.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

容器技术思想 Docker K8S

容器技术介绍 以Docker为代表的容器技术解决了程序部署运行方面的问题。在容器技术出现前&#xff0c;程序直接部署在物理服务器上&#xff0c;依赖管理复杂&#xff0c;包括各类运行依赖&#xff0c;且易变&#xff0c;多程序混合部署时还可能产生依赖冲突&#xff0c;给程序…

导出中心设计

业务背景 应用业务经常需要导出数据&#xff0c;但是并发的导出以及不合理的导出参数常常导致应用服务的内存溢出、其他依赖应用的崩溃、导出失败&#xff1b;因此才有导出中心的设计 设计思想 将导出应用所需的内存转移至导出中心&#xff0c;将导出的条数加以限制&#xf…

Unity 中计算射线和平面相交距离的原理

有此方法 能够计算射线和平面是否相交以及射线起点到平面交点的距离 代码分析 var dot Vector3.Dot(ray.direction, plane.normal);计算射线和平面法线的点积&#xff0c;如果大于等于0&#xff0c;则说明射线和平面没有相交&#xff0c;否则&#xff0c;说明射线和平面相交…

网络安全抓包

#知识点&#xff1a; 1、抓包技术应用意义 //有些应用或者目标是看不到的&#xff0c;这时候就要进行抓包 2、抓包技术应用对象 //app,小程序 3、抓包技术应用协议 //http&#xff0c;socket 4、抓包技术应用支持 5、封包技术应用意义 总结点&#xff1a;学会不同对象采用…

数学建模入门——描述性统计分析

摘要&#xff1a;本篇博客主要讲解了数学建模入门的描述性统计分析&#xff0c;包括基本统计量的计算、数据的分布形态、数据可视化和相关性分析。 往期回顾&#xff1a; 数学建模入门——建模流程-CSDN博客 数学建模入门——数据预处理&#xff08;全&#xff09;-CSDN博客 …

遗传学的“正反”之道:探寻生命密码的两把钥匙

正向遗传学 & 反向遗传学 在生活中&#xff0c;我们常常会惊叹于孩子与父母外貌、性格上的相似之处&#xff0c;或是疑惑于某些家族遗传病为何代代相传。其实&#xff0c;这些现象背后都隐藏着遗传学的奥秘。遗传学&#xff0c;作为一门探索生物遗传与变异规律的学科&#…

点击主图,触发的是查看产品详情的逻辑

文章目录 1、点击主图&#xff0c;触发的是查看产品详情的逻辑2、点击主图&#xff0c;发送的请求是 productDetail 这个方法3、与主图相关的代码片段 1、点击主图&#xff0c;触发的是查看产品详情的逻辑 点击主图的确不会触发那些物流参数输入框的自动查询。 那些输入框需要…

图数据库 | 17、高可用分布式设计(上)

我们在前面的文章中&#xff0c;探索了多种可能的系统扩展方式&#xff0c;以及每种扩展方式的优劣。 本篇文章将通过具体的架构设计方案来对每一种方案的设计、投入产出比、各项指标与功能&#xff0c;以及孰优孰劣等进行评价。 在设计高性能、高可用图数据库的时候&#xf…

【FlutterDart】 listView.builder例子二(14 /100)

上效果图 上代码&#xff1a; import package:flutter/material.dart;class ListRoles extends StatelessWidget {ListRoles({super.key});final List<String> entries <String>[, -, *, /];final List<int> colorCodes <int>[600, 500, 100, 50];o…

深入了解 ES6 Map:用法与实践

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

DeepSeek重新定义“Open“AI

“面对颠覆性技术&#xff0c;闭源所创造的护城河是暂时的。即使是OpenAI的闭源方法也无法阻止他人赶超。” ——梁文锋&#xff0c;DeepSeek CEO DeepSeek V3 是一个拥有6710亿参数的开源AI模型&#xff0c;正在提升AI效率的新标准。它在相对有限的预算下进行训练&#xff0c…

5. CSS引入方式

5.1 CSS的三种样式 按照 CSS 样式书写的位置(或者引入的方式)&#xff0c;CSS样式表可以分为三大类&#xff1a; 1.行内样式表&#xff08;行内式&#xff09; 2.内部样式表&#xff08;嵌入式&#xff09; 3. 外部样式表&#xff08;链接式&#xff09; 5.2 内部样式表 …

开源平台Kubernetes的优势是什么?

Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;方便进行声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统&#xff0c;其服务、支持和工具的使用范围广泛。 Kubernetes 这个名字源于希腊语&#xff0c;意…

web系统漏洞攻击靶场

摘 要 互联网极速发展的同时&#xff0c;也会带来一些安全性的风险&#xff0c;一些不为人知的安全问题也逐渐暴露出来。近年来&#xff0c;媒体不断披露了许多网络安全事故&#xff0c;许多网络应用程序被黑客攻击&#xff0c;导致内部数据外泄&#xff0c;人们开始认识到网络…

QPainter,QPen,QBrush详解

QPainter:画家 QPen:画笔&#xff0c;控制图形的边框轮廓 QBrush:画刷&#xff0c;控制图形的填充颜色样式 下面是用用QGraphicsItem来重写paint事件举例 #include <QGraphicsItem> #include <QPainter> #include <QGraphicsScene> #include <QGraphicsV…

C语言 扫雷程序设计

目录 1.main函数 2.菜单打印menu函数 3.游戏game函数 4.宏定义 5.界面初始化 6.打印界面 7.设置雷 8.统计排查坐标周围雷的个数 9.排查雷 10.总代码 test.c代码 game.h代码 game.c代码 结语&#xff1a; 一个简单的扫雷游戏&#xff0c;通过宏定义可以修改行列的…

第30天:Web开发-PHP应用组件框架前端模版渲染三方插件富文本编辑器CVE审计

#知识点 1、安全开发-原生PHP-开发组件集合 2、安全开发-原生PHP-模版引擎渲染 3、安全开发-原生PHP-第三方编辑器 组件/框架 说明 [Web框架] Laravel 现代化、功能全面的框架&#xff0c;适合大多数Web应用。 Symfony 高度模块化、功能强大的框架&#xff0c;适合复杂…

解决ESP32 wifi scan:1. 获取WIFI扫描列表个数为0 的问题 2.扫描WIFI列表时导致程序崩溃问题。

1. 获取WIFI扫描列表个数为0 的问题 参考ESP32的wifi scan例子&#xff0c;出问题的程序源码&#xff1a; 分析原因&#xff1a; 查看esp_wifi.c的源码&#xff0c;我们会发现&#xff1a; 上面意思就是但调用esp_wifi_scan_get_ap_records获取AP列表后&#xff0c;将会…

【动态重建】时间高斯分层的长体积视频

标题&#xff1a;Representing Long Volumetric Video with Temporal Gaussian Hierarchy 来源&#xff1a;浙江大学 链接&#xff1a;https://zju3dv.github.io/longvolcap/ 文章目录 摘要一、前言二、主要方法2.1 时间高斯分层2.2 高效渲染2.3 层次结构更新2.4 紧凑的外观模型…

mongodb==安装prisma连接

官网下载mongodb,解压安装 Download MongoDB Community Server | MongoDB 修改bin/mongod.cfg # mongod.conf# for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/# Where and how to store data. storage:dbPat…