修改主程序,以C++为程序计算核心

This commit is contained in:
zsyg
2025-06-17 20:30:24 +08:00
committed by GitHub
parent 30f1c14b67
commit 35b514e155
6 changed files with 566 additions and 102 deletions

View File

@@ -1,6 +1,11 @@
using System;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Concurrent;
namespace AppStore
{
@@ -9,6 +14,8 @@ namespace AppStore
private PictureBox iconBox;
private Label nameLabel;
private Button downloadBtn;
private static readonly ConcurrentDictionary<string, System.Drawing.Drawing2D.GraphicsPath> PathCache =
new ConcurrentDictionary<string, System.Drawing.Drawing2D.GraphicsPath>();
public string AppName { get; set; } = string.Empty;
public Image AppIcon { get; set; } = SystemIcons.Application.ToBitmap();
@@ -22,42 +29,239 @@ namespace AppStore
InitializeComponent();
}
private static readonly ConcurrentDictionary<string, System.Drawing.Drawing2D.GraphicsPath> BorderCache =
new ConcurrentDictionary<string, System.Drawing.Drawing2D.GraphicsPath>();
private void InitializeComponent()
{
this.Size = new Size(220, 180);
this.Size = new Size(240, 200);
this.BackColor = Color.White;
this.BorderStyle = BorderStyle.FixedSingle;
this.Padding = new Padding(5);
this.Padding = new Padding(10);
// 异步初始化卡片路径和边框
Task.Run(() => {
InitializeCardPath();
InitializeBorder();
});
// 应用图标
iconBox = new PictureBox();
iconBox.Size = new Size(64, 64);
iconBox.Location = new Point(10, 10);
iconBox.Size = new Size(80, 80);
iconBox.Location = new Point((Width - 80) / 2, 15);
iconBox.SizeMode = PictureBoxSizeMode.StretchImage;
this.Controls.Add(iconBox);
// 应用名称
nameLabel = new Label();
nameLabel.AutoSize = false;
nameLabel.Size = new Size(140, 60);
nameLabel.Location = new Point(80, 15);
nameLabel.Size = new Size(Width - 20, 40);
nameLabel.Location = new Point(10, 100);
nameLabel.Font = new Font("Microsoft YaHei", 10, FontStyle.Bold);
nameLabel.TextAlign = ContentAlignment.TopLeft;
nameLabel.TextAlign = ContentAlignment.MiddleCenter;
this.Controls.Add(nameLabel);
// 下载按钮
downloadBtn = new Button();
downloadBtn.Text = "下载";
downloadBtn.Size = new Size(80, 30);
downloadBtn.Location = new Point(70, 120);
downloadBtn.Size = new Size(100, 32);
downloadBtn.Location = new Point((Width - 100) / 2, 150);
downloadBtn.BackColor = Color.FromArgb(0, 120, 215);
downloadBtn.ForeColor = Color.White;
downloadBtn.FlatStyle = FlatStyle.Flat;
downloadBtn.FlatAppearance.BorderSize = 0;
downloadBtn.Cursor = Cursors.Hand;
downloadBtn.Font = new Font("Microsoft YaHei", 9);
// 按钮悬停效果
downloadBtn.MouseEnter += (s, e) => {
downloadBtn.BackColor = Color.FromArgb(0, 150, 255);
};
downloadBtn.MouseLeave += (s, e) => {
downloadBtn.BackColor = Color.FromArgb(0, 120, 215);
};
downloadBtn.Click += DownloadBtn_Click;
this.Controls.Add(downloadBtn);
}
/// <summary>
/// 初始化卡片边框路径
/// 使用C++程序计算高性能边框路径并缓存结果
/// </summary>
private void InitializeBorder()
{
// 使用卡片尺寸作为缓存键
string cacheKey = $"{Width}_{Height}_10";
// 检查缓存中是否已有路径
if (!BorderCache.TryGetValue(cacheKey, out var borderPath))
{
// 创建临时文件存储路径数据
string tempFile = Path.GetTempFileName();
try
{
// 配置C++程序启动参数
ProcessStartInfo startInfo = new ProcessStartInfo
{
FileName = Path.Combine(Application.StartupPath, "resource", "border_renderer.exe"),
Arguments = $"{Width} {Height} 10 \"{tempFile}\"", // 传递宽高和圆角半径
UseShellExecute = false, // 不显示命令行窗口
CreateNoWindow = true // 静默运行
};
// 启动C++程序计算路径
using (var process = Process.Start(startInfo))
{
process.WaitForExit();
// 检查计算结果
if (process.ExitCode == 0 && File.Exists(tempFile))
{
// 读取C++程序生成的路径点
var lines = File.ReadAllLines(tempFile);
PointF[] points = lines.Select(line => {
var parts = line.Split(','); // 解析坐标点
return new PointF(float.Parse(parts[0]), float.Parse(parts[1]));
}).ToArray();
// 创建GraphicsPath对象
borderPath = new System.Drawing.Drawing2D.GraphicsPath();
borderPath.AddLines(points); // 添加路径点
// 缓存路径对象
BorderCache.TryAdd(cacheKey, borderPath);
}
}
}
finally
{
// 确保临时文件被删除
if (File.Exists(tempFile))
{
File.Delete(tempFile);
}
}
}
}
// 边框和阴影效果
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// 绘制背景
using (var brush = new SolidBrush(this.BackColor)) {
e.Graphics.FillRectangle(brush, this.ClientRectangle);
}
string cacheKey = $"{Width}_{Height}_10";
if (BorderCache.TryGetValue(cacheKey, out var borderPath))
{
try
{
// 绘制阴影
using (var shadowBrush = new SolidBrush(Color.FromArgb(20, 0, 0, 0))) {
e.Graphics.FillPath(shadowBrush, borderPath);
}
// 绘制边框(调整为蓝色系)
using (var pen = new Pen(Color.FromArgb(70, 130, 200), 4)) {
e.Graphics.DrawPath(pen, borderPath);
}
}
catch (Exception ex)
{
Debug.WriteLine($"边框绘制错误: {ex.Message}");
// 回退到简单矩形边框
using (var pen = new Pen(Color.FromArgb(100, 150, 220), 2)) {
e.Graphics.DrawRectangle(pen, new Rectangle(0, 0, Width-1, Height-1));
}
}
}
else
{
// 缓存未命中时绘制默认边框
using (var pen = new Pen(Color.FromArgb(100, 150, 220), 2)) {
e.Graphics.DrawRectangle(pen, new Rectangle(0, 0, Width-1, Height-1));
}
}
}
/// <summary>
/// 初始化卡片形状路径
/// 使用C++程序计算圆角矩形路径并缓存结果
/// </summary>
private void InitializeCardPath()
{
int radius = 10; // 圆角半径
string cacheKey = $"{Width}_{Height}_{radius}"; // 缓存键
// 检查缓存
if (!PathCache.TryGetValue(cacheKey, out var path))
{
string tempFile = Path.GetTempFileName(); // 临时文件路径
try {
// 配置C++程序启动参数
ProcessStartInfo startInfo = new ProcessStartInfo {
FileName = Path.Combine(Application.StartupPath, "resource", "card_calculator.exe"),
Arguments = $"{Width} {Height} {radius} {tempFile}", // 传递宽高半径和输出文件
UseShellExecute = false, // 不显示命令行窗口
CreateNoWindow = true // 静默运行
};
// 启动C++程序计算路径
using (var process = Process.Start(startInfo)) {
process.WaitForExit();
// 检查计算结果
if (process.ExitCode == 0 && File.Exists(tempFile)) {
// 读取生成的路径点
var lines = File.ReadAllLines(tempFile);
PointF[] points = lines.Select(line => {
var parts = line.Split(','); // 解析坐标
return new PointF(float.Parse(parts[0]), float.Parse(parts[1]));
}).ToArray();
// 创建并缓存路径对象
path = new System.Drawing.Drawing2D.GraphicsPath();
path.AddLines(points);
PathCache.TryAdd(cacheKey, path);
}
}
} catch {
// C++程序失败时使用C#回退方案
path = CalculatePathFallback(Width, Height, radius);
} finally {
// 确保删除临时文件
if (File.Exists(tempFile)) {
File.Delete(tempFile);
}
}
}
// 应用计算好的路径
if (path != null)
{
this.Invoke((MethodInvoker)delegate {
this.Region = new Region(path); // 设置控件区域
this.Refresh(); // 重绘控件
});
}
}
private System.Drawing.Drawing2D.GraphicsPath CalculatePathFallback(int width, int height, int radius)
{
var path = new System.Drawing.Drawing2D.GraphicsPath();
path.AddArc(0, 0, radius * 2, radius * 2, 180, 90);
path.AddArc(width - radius * 2, 0, radius * 2, radius * 2, 270, 90);
path.AddArc(width - radius * 2, height - radius * 2, radius * 2, radius * 2, 0, 90);
path.AddArc(0, height - radius * 2, radius * 2, radius * 2, 90, 90);
path.CloseFigure();
return path;
}
public void UpdateDisplay()
{
nameLabel.Text = AppName;

View File

@@ -33,72 +33,84 @@ namespace AppStore
this.StartPosition = FormStartPosition.CenterScreen;
this.Icon = new Icon("img/ico/icon.ico"); // 设置窗体图标
// 顶部按钮面板
// 创建顶部按钮面板
// 现代化顶部导航栏
Panel buttonPanel = new Panel();
buttonPanel.Dock = DockStyle.Top; // 停靠在顶部
buttonPanel.Height = 60; // 设置高度
buttonPanel.BackColor = Color.LightGray; // 设置背景色
buttonPanel.Dock = DockStyle.Top;
buttonPanel.Height = 70;
buttonPanel.BackColor = Color.FromArgb(240, 240, 240);
buttonPanel.Padding = new Padding(10, 15, 10, 0);
// 导航按钮样式
Action<Button> styleButton = (Button btn) => {
btn.FlatStyle = FlatStyle.Flat;
btn.FlatAppearance.BorderSize = 0;
btn.BackColor = Color.Transparent;
btn.ForeColor = Color.FromArgb(64, 64, 64);
btn.Font = new Font("Microsoft YaHei", 10, FontStyle.Regular);
btn.Size = new Size(120, 40);
btn.Cursor = Cursors.Hand;
// 悬停效果
btn.MouseEnter += (s, e) => {
btn.ForeColor = Color.FromArgb(0, 120, 215);
btn.Font = new Font(btn.Font, FontStyle.Bold);
};
btn.MouseLeave += (s, e) => {
btn.ForeColor = Color.FromArgb(64, 64, 64);
btn.Font = new Font(btn.Font, FontStyle.Regular);
};
};
// 软件下载按钮
// 初始化软件下载按钮
// 初始化软件下载按钮
btnApps = new Button();
btnApps.Text = "软件下载"; // 设置按钮文本
btnApps.Size = new Size(100, 30); // 设置按钮大小(宽度,高度)
btnApps.Location = new Point(20, 10); // 设置按钮位置(X坐标,Y坐标)
btnApps.Font = new Font("Microsoft YaHei", 9); // 设置字体(字体名称,字号)
btnApps.Click += (s, e) => // 按钮点击事件处理器
{
// 点击后显示软件下载视图
btnApps.Text = "软件下载";
btnApps.Location = new Point(30, 0);
styleButton(btnApps);
btnApps.Click += (s, e) => {
Logger.Log("用户点击了'软件下载'按钮");
ShowAppsView();
};
buttonPanel.Controls.Add(btnApps);
// 下载进度按钮
// 初始化下载进度按钮
// 初始化下载进度按钮
btnDownloads = new Button();
btnDownloads.Text = "下载进度"; // 设置按钮文本
btnDownloads.Size = new Size(100, 30); // 设置按钮大小(宽度,高度)
btnDownloads.Location = new Point(140, 10); // 设置按钮位置(X坐标,Y坐标)
btnDownloads.Font = new Font("Microsoft YaHei", 9); // 设置字体(字体名称,字号)
btnDownloads.Click += (s, e) => // 按钮点击事件处理器
{
// 点击后显示下载进度视图
btnDownloads.Text = "下载进度";
btnDownloads.Location = new Point(170, 0);
styleButton(btnDownloads);
btnDownloads.Click += (s, e) => {
Logger.Log("用户点击了'下载进度'按钮");
ShowDownloadsView();
};
buttonPanel.Controls.Add(btnDownloads);
// 设置按钮
// 初始化设置按钮
btnSettings = new Button
{
// 设置按钮属性
Text = "设置",
Size = new Size(100, 30),
Location = new Point(260, 10),
Font = new Font("Microsoft YaHei", 9)
};
btnSettings.Click += (s, e) =>
{
// 点击后显示设置窗口
btnSettings = new Button();
btnSettings.Text = "设置";
btnSettings.Location = new Point(310, 0);
styleButton(btnSettings);
btnSettings.Click += (s, e) => {
Logger.Log("用户点击了'设置'按钮");
ShowSettingsView();
};
buttonPanel.Controls.Add(btnSettings);
// 内容区域
// 初始化内容面板
// 初始化内容显示面板
// 现代化内容区域
contentPanel = new Panel();
contentPanel.Dock = DockStyle.Fill; // 设置停靠方式为填充剩余空间
contentPanel.Padding = new Padding(10); // 设置内边距为10像素
this.Controls.Add(contentPanel); // 将面板添加到主窗体
contentPanel.Dock = DockStyle.Fill;
contentPanel.BackColor = Color.White;
contentPanel.Padding = new Padding(20);
this.Controls.Add(contentPanel);
// 添加分隔线
Panel separator = new Panel();
separator.Dock = DockStyle.Top;
separator.Height = 1;
separator.BackColor = Color.FromArgb(230, 230, 230);
contentPanel.Controls.Add(separator);
this.Controls.Add(buttonPanel);
this.BackColor = Color.White;
// 默认显示软件下载视图
ShowAppsView();
@@ -169,15 +181,17 @@ namespace AppStore
flowPanel.Margin = new Padding(0);
flowPanel.AutoSize = true;
flowPanel.AutoSizeMode = AutoSizeMode.GrowAndShrink;
flowPanel.AutoScrollMinSize = new Size(0, 2000); // 增加滑动距离
flowPanel.AutoScrollMinSize = new Size(0, 999999); // 增加滑动距离
contentPanel.Controls.Add(flowPanel);
// 添加所有应用卡片
flowPanel.Controls.Add(CreateAppCard(
"WindowsCleaner",
"https://ghproxy.net/https://github.com/darkmatter2048/WindowsCleaner/releases/download/v5.0.8/windowscleaner_v5.0.8_amd64_x64_setup.exe",
"img/png/WindowsCleaner.png"));
flowPanel.Controls.Add(CreateAppCard(
"python3.8",
"https://www.python.org/ftp/python/3.8.0/python-3.8.0-amd64.exe",
"img/png/python.png"));
flowPanel.Controls.Add(CreateAppCard(
"openlist",
"https://ghproxy.net/https://github.com/OpenListTeam/OpenList/releases/download/beta/openlist-windows-amd64.zip",
@@ -198,11 +212,6 @@ namespace AppStore
"https://vscode.download.prss.microsoft.com/dbazure/download/stable/dfaf44141ea9deb3b4096f7cd6d24e00c147a4b1/VSCodeSetup-x64-1.101.0.exe",
"img/png/vscode.png"));
flowPanel.Controls.Add(CreateAppCard(
"Notepad++",
"https://ghproxy.net/https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v8.8.1/npp.8.8.1.Installer.exe",
"img/png/notepad++.png"));
flowPanel.Controls.Add(CreateAppCard(
"7-Zip",
"https://objects.githubusercontent.com/github-production-release-asset-2e65be/466446150/1645817e-3677-4207-93ff-e62de7e147be?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20250613%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250613T035936Z&X-Amz-Expires=300&X-Amz-Signature=5e02d5fc34f45bd8308029c9fc78052007e9475ce0e32775619921cb8f3b83ea&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3D7z2409-x64.exe&response-content-type=application%2Foctet-stream",
@@ -253,6 +262,11 @@ namespace AppStore
"https://ghproxy.net/https://github.com/mifi/lossless-cut/releases/download/v3.64.0/LosslessCut-win-x64.7z",
"img/png/LosslessCut.png"));
flowPanel.Controls.Add(CreateAppCard(
"mingw-64",
"https://ghproxy.net/https://github.com/niXman/mingw-builds-binaries/releases/download/15.1.0-rt_v12-rev0/x86_64-15.1.0-release-posix-seh-ucrt-rt_v12-rev0.7z",
"img/png/mingw-64.png"));
flowPanel.Controls.Add(CreateAppCard(
"Edge",
"https://msedge.sf.dl.delivery.mp.microsoft.com/filestreamingservice/files/cb21e6b5-3f63-4df2-bec3-a2015b80dc56/MicrosoftEdgeEnterpriseX64.msi",
@@ -502,6 +516,86 @@ namespace AppStore
"FileBrowser",
"https://ghproxy.net/https://github.com/filebrowser/filebrowser/releases/download/v2.32.0/windows-amd64-filebrowser.zip",
"img/png/FileBrowser.png"));
flowPanel.Controls.Add(CreateAppCard(
"Cloudreve",
"https://ghproxy.net/https://github.com/cloudreve/cloudreve/releases/download/3.8.3/cloudreve_3.8.3_windows_amd64.zip",
"img/png/cloudreve.png"));
flowPanel.Controls.Add(CreateAppCard(
"SeelenUI",
"https://ghproxy.net/https://github.com/eythaann/Seelen-UI/releases/download/v2.3.8/Seelen.UI_2.3.8_x64-setup.exe",
"img/png/SeelenUI.png"));
flowPanel.Controls.Add(CreateAppCard(
"git汉化包",
"https://ghproxy.net/https://github.com/zs-yg/package/releases/download/v0.6/zh_cn.msg",
""));
flowPanel.Controls.Add(CreateAppCard(
"everything便携版",
"https://www.voidtools.com/Everything-1.4.1.1027.x64.zip",
"img/jpg/everything.jpg"));
flowPanel.Controls.Add(CreateAppCard(
"BongoCat",
"https://ghproxy.net/https://github.com/ayangweb/BongoCat/releases/download/v0.5.0/BongoCat_0.5.0_x64-setup.exe",
"img/png/BongoCat.png"));
flowPanel.Controls.Add(CreateAppCard(
"GalaceanEngine(code)",
"https://ghproxy.net/https://github.com/galacean/engine/archive/refs/tags/v1.5.7.zip",
"img/png/GalaceanEngine.png"));
flowPanel.Controls.Add(CreateAppCard(
"trivy",
"https://ghproxy.net/https://github.com/aquasecurity/trivy/releases/download/v0.63.0/trivy_0.63.0_windows-64bit.zip",
"img/png/trivy.png"));
flowPanel.Controls.Add(CreateAppCard(
"daytona(code)",
"https://ghproxy.net/https://github.com/aquasecurity/trivy/releases/download/v0.63.0/trivy_0.63.0_windows-64bit.zip",
"img/png/daytona.png"));
flowPanel.Controls.Add(CreateAppCard(
"HowToCook",
"https://ghproxy.net/https://github.com/Anduin2017/HowToCook/archive/refs/tags/1.5.0.zip",
""));
flowPanel.Controls.Add(CreateAppCard(
"code-server",
"https://ghproxy.net/https://github.com/coder/code-server/archive/refs/tags/v4.100.3.zip",
"img/png/code-server.png"));
flowPanel.Controls.Add(CreateAppCard(
"yt-dlp",
"https://ghproxy.net/https://github.com/yt-dlp/yt-dlp/releases/download/2025.06.09/yt-dlp_win.zip",
"img/png/yt-dlp.png"));
flowPanel.Controls.Add(CreateAppCard(
"omi(code)",
"https://ghproxy.net/https://github.com/Tencent/omi/archive/refs/tags/v7.7.0.zip",
"img/png/omi.png"));
flowPanel.Controls.Add(CreateAppCard(
"Maxun(code)",
"https://ghproxy.net/https://github.com/getmaxun/maxun/archive/refs/tags/v0.0.16.zip",
"img/png/Maxun.png"));
flowPanel.Controls.Add(CreateAppCard(
"n8n(code)",
"https://ghproxy.net/https://github.com/n8n-io/n8n/archive/refs/tags/n8n@1.97.1.zip",
"img/png/n8n.png"));
flowPanel.Controls.Add(CreateAppCard(
"WechatRealFriends",
"https://ghproxy.net/https://github.com/StrayMeteor3337/WechatRealFriends/releases/download/v1.0.4/WechatRealFriends_1.0.4.zip",
"img/jpg/wx.jpg"));
flowPanel.Controls.Add(CreateAppCard(
"glance",
"https://ghproxy.net/https://github.com/glanceapp/glance/releases/download/v0.8.4/glance-windows-amd64.zip",
"img/png/glance.png"));
}
private FlowLayoutPanel downloadsFlowPanel = new FlowLayoutPanel();

64
border_renderer.cpp Normal file
View File

@@ -0,0 +1,64 @@
#include <windows.h>
#include <vector>
#include <fstream>
#include <cmath>
#include <d2d1.h>
// 高性能边框路径生成
void GenerateBorderPath(int width, int height, int radius, const char* outputPath) {
std::ofstream out(outputPath);
const float pi = 3.1415926f;
const int segments = 24; // 高分段数确保平滑
std::vector<POINTFLOAT> points;
// 优化后的圆角路径生成
auto addArc = [&](float startAngle, float endAngle, float cx, float cy) {
for (int i = 0; i <= segments; ++i) {
float angle = startAngle + (endAngle - startAngle) * i / segments;
points.push_back({
cx + radius * cosf(angle),
cy + radius * sinf(angle)
});
}
};
// 左上角
addArc(pi, 3*pi/2, radius, radius);
// 右上角
addArc(3*pi/2, 2*pi, width - radius, radius);
// 右下角
addArc(0, pi/2, width - radius, height - radius);
// 左下角
addArc(pi/2, pi, radius, height - radius);
// 闭合路径
points.push_back(points[0]);
// 写入优化格式
if (out.is_open()) {
for (const auto& p : points) {
out << p.x << "," << p.y << "\n";
}
}
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
int argc;
LPWSTR* argv = CommandLineToArgvW(GetCommandLineW(), &argc);
if (argc != 5) return 1;
int width = _wtoi(argv[1]);
int height = _wtoi(argv[2]);
int radius = _wtoi(argv[3]);
char outputPath[MAX_PATH];
wcstombs(outputPath, argv[4], MAX_PATH);
GenerateBorderPath(width, height, radius, outputPath);
return 0;
}

90
card_calculator.cpp Normal file
View File

@@ -0,0 +1,90 @@
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include <windows.h>
using namespace std;
struct Point {
float x;
float y;
};
void WritePathToFile(const vector<Point>& path, const string& filename) {
ofstream outFile(filename);
if (!outFile) {
cerr << "无法打开输出文件: " << filename << endl;
return;
}
for (const auto& point : path) {
outFile << point.x << "," << point.y << "\n";
}
outFile.close();
}
vector<Point> CalculateRoundedRectPath(int width, int height, int radius) {
vector<Point> pathPoints;
const int segments = 10;
const float angleStep = 3.1415926f / (2 * segments);
// 左上角
for (int i = 0; i <= segments; i++) {
float angle = 3.1415926f + i * angleStep;
pathPoints.push_back({
radius + radius * cosf(angle),
radius + radius * sinf(angle)
});
}
// 右上角
for (int i = 0; i <= segments; i++) {
float angle = 3 * 3.1415926f / 2 + i * angleStep;
pathPoints.push_back({
width - radius + radius * cosf(angle),
radius + radius * sinf(angle)
});
}
// 右下角
for (int i = 0; i <= segments; i++) {
float angle = 0 + i * angleStep;
pathPoints.push_back({
width - radius + radius * cosf(angle),
height - radius + radius * sinf(angle)
});
}
// 左下角
for (int i = 0; i <= segments; i++) {
float angle = 3.1415926f / 2 + i * angleStep;
pathPoints.push_back({
radius + radius * cosf(angle),
height - radius + radius * sinf(angle)
});
}
// 闭合路径
pathPoints.push_back(pathPoints[0]);
return pathPoints;
}
int main(int argc, char* argv[]) {
if (argc != 5) {
cout << "用法: card_calculator [宽度] [高度] [圆角半径] [输出文件]" << endl;
return 1;
}
int width = stoi(argv[1]);
int height = stoi(argv[2]);
int radius = stoi(argv[3]);
string outputFile = argv[4];
auto path = CalculateRoundedRectPath(width, height, radius);
WritePathToFile(path, outputFile);
return 0;
}

4
del.bat Normal file
View File

@@ -0,0 +1,4 @@
rmdir bin /s /q
rmdir obj /s /q
rmdir logs /s /q
mkdir logs

View File

@@ -1,41 +1,49 @@
#include <iostream>
#include <filesystem>
#include <chrono>
namespace fs = std::filesystem;
int main() {
try {
auto start = std::chrono::high_resolution_clock::now();
// 定义日志目录路径
fs::path logDir = "logs";
size_t deletedCount = 0;
size_t errorCount = 0;
// 检查目录是否存在
if (fs::exists(logDir) && fs::is_directory(logDir)) {
// 遍历并删除所有日志文件
for (const auto& entry : fs::directory_iterator(logDir)) {
try {
if (fs::is_regular_file(entry)) {
fs::remove(entry);
deletedCount++;
}
} catch (const std::exception& e) {
std::cerr << "删除文件失败: " << entry.path() << " - " << e.what() << std::endl;
errorCount++;
}
}
} else {
std::cout << "日志目录不存在,无需清理" << std::endl;
return 0;
}
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
std::cout << "日志清理完成: " << std::endl;
std::cout << "删除文件数: " << deletedCount << std::endl;
std::cout << "错误数: " << errorCount << std::endl;
std::cout << "耗时: " << duration.count() << " 毫秒" << std::endl;
} catch (const std::exception& e) {
std::cerr << "发生错误: " << e.what() << std::endl;
return 1;
}
return 0;
}
#include <iostream>
#include <filesystem>
#include <chrono>
namespace fs = std::filesystem;
int main() {
try {
auto start = std::chrono::high_resolution_clock::now();
// 定义日志目录路径
fs::path logDir = "logs";
size_t deletedCount = 0;
size_t errorCount = 0;
// 检查目录是否存在
if (fs::exists(logDir) && fs::is_directory(logDir)) {
// 遍历并删除所有日志文件
for (const auto& entry : fs::directory_iterator(logDir)) {
try {
if (fs::is_regular_file(entry)) {
fs::remove(entry);
deletedCount++;
}
} catch (const std::exception& e) {
std::cerr << "删除文件失败: " << entry.path() << " - " << e.what() << std::endl;
errorCount++;
}
}
} else {
std::cout << "日志目录不存在,无需清理" << std::endl;
return 0;
}
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
std::cout << "日志清理完成: " << std::endl;
std::cout << "删除文件数: " << deletedCount << std::endl;
std::cout << "错误数: " << errorCount << std::endl;
std::cout << "耗时: " << duration.count() << " 毫秒" << std::endl;
} catch (const std::exception& e) {
std::cerr << "发生错误: " << e.what() << std::endl;
return 1;
}
return 0;
}