当前位置: 首页 > news >正文

我又叕叕叕更新了~纯手工编写C++画图,有注释~

本次更新内容:

                优化性能,朗读

提前申明:如果运行不了,请到主页查看RedpandaDevc++下载,若还是不行就卸了重装。

版本号:1.26.36

779行 24690字

最终结果预览

代码预览

 

 

//版本号 :v1.26.36
//最终归属权为作者(饼干帅成渣)所有
//禁止转载
//仅供学习,不得用于违法
#include <windows.h>
#include <gdiplus.h>
#include <bits/stdc++.h>
#include <pshpack2.h>
// 控件和消息定义
#define IDC_EDIT_INPUT  109
#define IDC_BTN_COPY    108
#define IDC_STATIC_TIME 1007
#define IDC_EDIT_PWD   1001
#define IDC_BTN_TOGGLE 1002
#define IDC_EDIT1        1003
#define IDC_BUTTON_SUBMIT 1004
#define IDC_BTN_TRAY    1005
#define WM_TRAY_ICON    1006
#define IDC_BTN_SPEAK 1008

using namespace std;
using namespace chrono;
// 扩展图形类型枚举(移除平行四边形,新增梯形)
enum ShapeType { SQUARE, CIRCLE, TRIANGLE, TRAPEZOID };
ShapeType g_currentShape = SQUARE;
POINT g_startPos, g_endPos;
bool g_isDrawing = false;
// 定义光标切换的状态
enum CursorState {
	ARROW,
	HAND,
	CROSS
};
CursorState currentCursor = CROSS;
HWND g_hwnd;
HWND hhwwnndd;
NOTIFYICONDATA g_nid = {0};
bool g_isInTray = false;
HWND hEdit;
HWND hButton, hButton2;
RECT g_originalRect;
LONG_PTR g_originalStyle;
bool g_isFullscreen = false;
HBITMAP g_hMemBitmap = NULL;
HDC g_hMemDC = NULL;
int g_width = 0, g_height = 0;
#define IDC_BTN_COLOR 1099
COLORREF g_colors[] = { RGB(255, 0, 0), RGB(0, 0, 0), RGB(0, 0, 255) }; // 红黑蓝
int g_currentColor = 1; // 默认黑色
bool g_isPasswordMode = true; // 初始为密码模式
//位图文件头文件定义
//其中不包括文件类型信息(由于结构体的内存结构决定,要是加了的话将不能正确的读取文件信息)
typedef struct {
	WORD    bfType;//文件类型,必须是0x424D,即字符“BM”
	DWORD   bfSize;//文件大小
	WORD    bfReserved1;//保留字
	WORD    bfReserved2;//保留字
	DWORD   bfOffBits;//从文件头到实际位图数据的偏移字节数
} BMPFILEHEADER_T;

struct BMPFILEHEADER_S {
	WORD    bfType;
	DWORD   bfSize;
	WORD    bfReserved1;
	WORD    bfReserved2;
	DWORD   bfOffBits;
};
typedef struct {
	DWORD      biSize;//信息头大小
	LONG       biWidth;//图像宽度
	LONG       biHeight;//图像高度
	WORD       biPlanes;//位平面数,必须为1
	WORD       biBitCount;//每像素位数
	DWORD      biCompression;//压缩类型
	DWORD      biSizeImage;//压缩图像大小字节数
	LONG       biXPelsPerMeter;//水平分辨率
	LONG       biYPelsPerMeter;//垂直分辨率
	DWORD      biClrUsed;//位图实际用到的色彩数
	DWORD      biClrImportant;//本位图中重要的色彩数
} BMPINFOHEADER_T;//位图信息头定义

typedef void(__stdcall* NTPROC)(DWORD*, DWORD*, DWORD*);

int getNtVersion() {
	HINSTANCE hinst = LoadLibrary("ntdll.dll");
	DWORD major, minor, build;
	NTPROC proc = (NTPROC)GetProcAddress(hinst, "RtlGetNtVersionNumbers");
	proc(&major, &minor, &build);
	return major;
}

void ScreenShot() {
	if (GetAsyncKeyState('0')) {
		// 生成时间戳 (格式: 年月日_时分秒)
		auto now = system_clock::now();
		auto in_time_t = system_clock::to_time_t(now);
		stringstream timestamp;
		timestamp << put_time(localtime(&in_time_t), "%Y%m%d_%H%M%S");

		// 构建PowerShell命令
		string command =
		    "powershell -Command \""
		    "$timestamp = '" + timestamp.str() + "'; "
		    "Add-Type -AssemblyName System.Windows.Forms; "
		    "Add-Type -AssemblyName System.Drawing; "
		    "$screen = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds; "
		    "$bitmap = New-Object System.Drawing.Bitmap($screen.Width, $screen.Height); "
		    "$graphic = [System.Drawing.Graphics]::FromImage($bitmap); "
		    "$graphic.CopyFromScreen([System.Drawing.Point]::Empty, [System.Drawing.Point]::Empty, $screen.Size); "
		    "$bitmap.Save(\\\"C:\\screenshot_$timestamp.png\\\", [System.Drawing.Imaging.ImageFormat]::Png)\"";

		// 执行命令
		system(command.c_str());
		MessageBox(NULL, "截图成功", "提示", NULL);
	}
}

void generateBmp( BYTE * pData, int width, int height, const  char * filename ) { //生成Bmp图片,传递RGB值,传递图片像素大小,传递图片存储路径
	int size = width * height * 3; // 每个像素点3个字节
	// 位图第一部分,文件信息
	BMPFILEHEADER_T bfh;
	bfh.bfType = 0X4d42;  //bm
	bfh.bfSize = size  // data size
	             + sizeof( BMPFILEHEADER_T ) // first section size
	             + sizeof( BMPINFOHEADER_T ) // second section size
	             ;
	bfh.bfReserved1 = 0; // reserved
	bfh.bfReserved2 = 0; // reserved
	bfh.bfOffBits = bfh.bfSize - size;

	// 位图第二部分,数据信息
	BMPINFOHEADER_T bih;
	bih.biSize = sizeof(BMPINFOHEADER_T);
	bih.biWidth = width;
	bih.biHeight = height;
	bih.biPlanes = 1;
	bih.biBitCount = 24;
	bih.biCompression = 0;
	bih.biSizeImage = size;
	bih.biXPelsPerMeter = 0;
	bih.biYPelsPerMeter = 0;
	bih.biClrUsed = 0;
	bih.biClrImportant = 0;
	FILE * fp = fopen( filename, "wb" );
	if ( !fp ) return;
	fwrite( &bfh, 1, sizeof(BMPFILEHEADER_T), fp );
	fwrite( &bih, 1, sizeof(BMPINFOHEADER_T), fp );
	fwrite( pData, 1, size, fp );
	fclose( fp );
}

void drawBMP() {
	int i = 0, j = 0;
	struct {
		BYTE b;
		BYTE g;
		BYTE r;
	} pRGB[240][320];  // 定义位图数据
	memset( pRGB, 0, sizeof(pRGB) ); // 设置背景为黑色
	// 在中间画一个100*100的矩形
	for (  i = 70; i < 170; i++ ) {
		for ( j = 110; j < 210; j++ ) {
			pRGB[i][j].r = 0x3f;
			pRGB[i][j].g = 0x3f;
			pRGB[i][j].b = 0x3f;
		}
	}
	// 生成BMP图片
	generateBmp( ( BYTE*)pRGB, 320, 240, "C:\\rgb.bmp" );
}

// 梯形顶点计算
void CalculateTrapezoidPoints(POINT start, POINT end, POINT points[4]) {
	int height = abs(end.y - start.y);         // 垂直高度
	int topWidth = abs(end.x - start.x);       // 上底宽度
	int bottomWidth = topWidth + height * 2;  // 下底宽度

	points[0] = start;                        // 左上顶点
	points[1] = { start.x + topWidth, start.y }; // 右上顶点
	points[2] = { end.x + bottomWidth, end.y }; // 右下顶点
	points[3] = { end.x - bottomWidth, end.y }; // 左下顶点
}

// 三角形顶点计算函数
void CalculateTrianglePoints(POINT start, POINT end, POINT points[3]) {
	// 计算底边中点
	POINT baseMid = {
		(start.x + end.x) / 2,
		(start.y + end.y) / 2
	};

	// 计算高度方向
	int height = static_cast<int>(sqrt(
	                                  pow(end.x - start.x, 2) +
	                                  pow(end.y - start.y, 2)
	                              )) / 2;

	// 设置三个顶点(等腰三角形)
	points[0] = start;                     // 左顶点
	points[1] = end;                       // 右顶点
	points[2] = { baseMid.x, baseMid.y - height }; // 顶点
}

void InitTrayIcon(HWND hwnd) {
	g_nid.cbSize = sizeof(NOTIFYICONDATA);
	g_nid.hWnd = hwnd;
	g_nid.uID = 1;
	g_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
	g_nid.uCallbackMessage = WM_TRAY_ICON;
	g_nid.hIcon = LoadIcon(NULL, IDI_INFORMATION);
}

// 切换托盘状态
void ToggleTrayMode(HWND hwnd) {
	if (!g_isInTray) {
		// 最小化到托盘
		ShowWindow(hwnd, SW_HIDE);
		Shell_NotifyIcon(NIM_ADD, &g_nid);
	} else {
		// 恢复窗口
		ShowWindow(hwnd, SW_SHOW);
		Shell_NotifyIcon(NIM_DELETE, &g_nid);
	}
	g_isInTray = !g_isInTray;
}

// 初始化双缓冲
void InitDoubleBuffer(HWND hwnd) {
	RECT rc;
	GetClientRect(hwnd, &rc);
	g_width = rc.right - rc.left;
	g_height = rc.bottom - rc.top;
	HDC hdc = GetDC(hwnd);
	g_hMemDC = CreateCompatibleDC(hdc);
	g_hMemBitmap = CreateCompatibleBitmap(hdc, g_width, g_height);
	SelectObject(g_hMemDC, g_hMemBitmap);
	ReleaseDC(hwnd, hdc);
	// 初始清屏(可选)
	FillRect(g_hMemDC, &rc, (HBRUSH)GetStockObject(WHITE_BRUSH));
	HBRUSH hWhiteBrush = CreateSolidBrush(RGB(255, 255, 255));
	FillRect(g_hMemDC, &rc, hWhiteBrush);
	DeleteObject(hWhiteBrush);
}

// 切换全屏函数
void ToggleFullscreen(HWND hwnd) {
	if (!g_isFullscreen) {
		// 进入全屏
		GetWindowRect(hwnd, &g_originalRect);
		g_originalStyle = GetWindowLongPtr(hwnd, GWL_STYLE);
		int screenWidth = GetSystemMetrics(SM_CXSCREEN);
		int screenHeight = GetSystemMetrics(SM_CYSCREEN);

		SetWindowLongPtr(hwnd, GWL_STYLE, WS_POPUP);
		SetWindowPos(hwnd, HWND_TOP,
		             0, 0, screenWidth, screenHeight,
		             SWP_FRAMECHANGED | SWP_SHOWWINDOW
		            );
	} else {
		// 退出全屏
		SetWindowLongPtr(hwnd, GWL_STYLE, g_originalStyle);
		SetWindowPos(hwnd, NULL,
		             g_originalRect.left,
		             g_originalRect.top,
		             g_originalRect.right - g_originalRect.left,
		             g_originalRect.bottom - g_originalRect.top,
		             SWP_FRAMECHANGED | SWP_NOZORDER
		            );
	}
	g_isFullscreen = !g_isFullscreen;
}

// 切换密码显示模式
void TogglePasswordMode(HWND hwnd) {
	// 保存当前文本
	wchar_t szText[256] = {0};
	GetWindowTextW(hEdit, szText, 256);

	// 获取当前窗口位置
	RECT rc;
	GetWindowRect(hEdit, &rc);
	MapWindowPoints(HWND_DESKTOP, GetParent(hEdit), (LPPOINT)&rc, 2);

	// 销毁旧编辑框
	DestroyWindow(hEdit);

	// 创建新编辑框(切换样式)
	DWORD style = WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL;
	if (g_isPasswordMode) {
		style |= ES_PASSWORD;
	}

	hEdit = CreateWindowW(
	            L"EDIT", szText,
	            style,
	            rc.left, rc.top,
	            rc.right - rc.left,
	            rc.bottom - rc.top,
	            hwnd, (HMENU)IDC_EDIT_PWD,
	            NULL,
	            NULL
	        );

	// 更新模式状态
	g_isPasswordMode = !g_isPasswordMode;

	// 更新按钮文本
	SetWindowTextW(GetDlgItem(hwnd, IDC_BTN_TOGGLE),
	               g_isPasswordMode ? L"隐藏密码" : L"显示明文");
}

// 窗口过程函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
	switch (msg) {
		case WM_SETCURSOR:
			if (LOWORD(lParam) == HTCLIENT) {
				HCURSOR hCursor = NULL;
				switch (currentCursor) {
					case ARROW:
						hCursor = LoadCursor(NULL, IDC_CROSS);
						break;
					case HAND:
						hCursor = LoadCursor(NULL, IDC_ARROW);
						break;
					case CROSS:
						hCursor = LoadCursor(NULL, IDC_HAND );
						break;
				}
				SetCursor(hCursor);
				return TRUE;
			}
			return TRUE;
			break;
		case WM_SIZE:
			// 窗口大小变化时重置缓冲
			if (g_hMemDC) {
				DeleteDC(g_hMemDC);
				DeleteObject(g_hMemBitmap);
			}
			InitDoubleBuffer(hwnd);
			break;
		case WM_KEYDOWN:
			if (wParam == VK_BACK) { // 按Backspace切换全屏
				ToggleFullscreen(hwnd);
			} else if (wParam == VK_CONTROL) {
				DestroyWindow(hwnd);
				HWND hwnwd;
				hwnwd = FindWindow("ConsoleWindowClass", NULL);
				if (hwnwd) {
					ShowOwnedPopups(hwnwd, SW_SHOW);
					ShowWindow(hwnwd, SW_SHOW);
				}
			}
			return 0;
		case WM_PAINT: {
			PAINTSTRUCT ps;
			HDC hdc = BeginPaint(hwnd, &ps);
			HDC hMemDC = CreateCompatibleDC(hdc);
			HBITMAP hBmp = CreateCompatibleBitmap(hdc, ps.rcPaint.right, ps.rcPaint.bottom);
			SelectObject(hMemDC, hBmp);
			FillRect(hMemDC, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
			if (g_isDrawing) {
				HBRUSH hBrush = CreateSolidBrush(g_colors[g_currentColor]);
				SelectObject(hMemDC, hBrush);
				switch (g_currentShape) {
					case CIRCLE: {
						int radius = static_cast<int>(sqrt(
						                                  pow(g_endPos.x - g_startPos.x, 2) +
						                                  pow(g_endPos.y - g_startPos.y, 2)));
						Ellipse(hMemDC,
						        g_startPos.x - radius, g_startPos.y - radius,
						        g_startPos.x + radius, g_startPos.y + radius);
						break;
					}
					case SQUARE:
						Rectangle(hMemDC,
						          min(g_startPos.x, g_endPos.x),
						          min(g_startPos.y, g_endPos.y),
						          max(g_startPos.x, g_endPos.x),
						          max(g_startPos.y, g_endPos.y));
						break;
					case TRIANGLE: {
						POINT points[3];
						CalculateTrianglePoints(g_startPos, g_endPos, points);
						Polygon(hMemDC, points, 3);
						break;
					}
					case TRAPEZOID: {
						POINT points[4];
						CalculateTrapezoidPoints(g_startPos, g_endPos, points);
						Polygon(hMemDC, points, 4);
						break;
					}
				}
				DeleteObject(hBrush);
			}

			BitBlt(hdc, 0, 0, ps.rcPaint.right, ps.rcPaint.bottom, hMemDC, 0, 0, SRCCOPY);
			DeleteDC(hMemDC);
			DeleteObject(hBmp);
			EndPaint(hwnd, &ps);
			break;
		}
		case WM_CLOSE:
			// 清理托盘图标
			if (g_isInTray) Shell_Notif

相关文章:

  • 【实证分析】数智化转型对制造企业全要素生产率的影响及机制探究(1999-2023年)
  • spring security oauth2.0 使用GitHub
  • KiActivateWaiterQueue函数和Queue->Header.WaitListHead队列等待列表的关系
  • 【第三章】13-常用模块1-ngx_http_upstream_module
  • Introduction To Raymarching
  • AI结合VBA提升EXCEL办公效率尝试
  • SQL:Relationship(关系)
  • 类似东郊到家的上门按摩预约服务系统小程序APP源码全开源
  • 3.5 字典补充
  • Google 官方提示工程 (Prompt Engineering)白皮书 总结
  • ESP32与STM32哪种更适合初学者?
  • Qt触摸屏隐藏鼠标指针
  • Python数组(array)学习之旅:数据结构的奇妙冒险
  • DRM(Digital Rights Management)生态以及架构介绍
  • 自动驾驶技术-相机_IMU时空标定
  • NI的LABVIEW工具安装及卸载步骤说明
  • 博途 TIA Portal之1200做主站与有意思的板子做MODBUS_RTU通讯
  • 【多模态大模型实战】使用LoRA微调Qwen2.5-VL
  • ESP32+Arduino入门(三):连接WIFI获取当前时间
  • 埃隆·马斯克与开源:通过协作重塑创新
  • 惠州建设工程交易网站/今天济南刚刚发生的新闻
  • 怎么做自己的博客网站/广告平台网站有哪些
  • 做域名交易网站/google国际版
  • 成都必去的十大景点/西安优化排名推广
  • 建站公司怎么接单/网站收录入口申请查询
  • 钦州网站建/网络营销公司排名