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

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

再再再次感谢Ttcofee提的问题
        本次更新内容:

                  鼠标图案(切换),版本号获取,输入框复制剪切板

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

版本号:1.9.25

460行

//版本号 :v1.9.25
//最终归属权为作者(饼干帅成渣)所有
//禁止转载
//仅供学习,不得用于违法
#include <windows.h>
#include <gdiplus.h>
#include <string>
#include <iostream>
// 控件和消息定义
#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
using namespace std;
// 定义光标切换的状态
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;
POINT g_startPos, g_endPos;
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;
bool g_isPasswordMode = true; // 初始为密码模式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_APPLICATION);
}// 切换托盘状态
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));
}
// 切换全屏函数
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) {static HWND hStaticTime; // 静态文本控件句柄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);  // 获取设备上下文// 设置背景模式为透明BitBlt(hdc, 0, 0, g_width, g_height, g_hMemDC, 0, 0, SRCCOPY);SetBkMode(hdc, TRANSPARENT);HPEN hDashPen = CreatePen(PS_DASH, 1, RGB(256, 256, 256));SelectObject(hdc, hDashPen);MoveToEx(hdc, g_startPos.x, g_startPos.y, NULL);LineTo(hdc, g_endPos.x, g_endPos.y);return 0;}case WM_CLOSE:// 清理托盘图标if (g_isInTray) Shell_NotifyIcon(NIM_DELETE, &g_nid);DestroyWindow(hwnd);break;case WM_DESTROY:KillTimer(hwnd, 1); // 销毁定时器PostQuitMessage(0);return 0;break;// 处理鼠标消息case WM_LBUTTONDOWN:g_startPos.x = LOWORD(lParam);g_startPos.y = HIWORD(lParam);return 0;case WM_MOUSEMOVE:if (wParam & MK_LBUTTON) {g_endPos.x = LOWORD(lParam);g_endPos.y = HIWORD(lParam);InvalidateRect(hwnd, NULL, TRUE);}return 0;case WM_ERASEBKGND:return 1; // 禁用背景擦除case WM_CREATE: {// 创建获取时间hhwwnndd = CreateWindowW(L"BUTTON", L"获取系统时间",WS_CHILD | WS_VISIBLE | SS_CENTER,20, 350, 150, 30,hwnd, (HMENU)12345,NULL, NULL);// 创建按钮CreateWindowW(L"BUTTON", L"最小化到托盘",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,400, 50, 150, 30, hwnd,(HMENU)IDC_BTN_TRAY, NULL, NULL);// 创建按钮CreateWindow("BUTTON", "切换光标", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,20, 450, 100, 30, hwnd, (HMENU)32, NULL, NULL);// 初始化托盘InitTrayIcon(hwnd);// 创建按钮hButton = CreateWindow("BUTTON",                     // 窗口类(按钮)"点击我关闭",                     // 按钮文本WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, // 样式50, 50,                       // 位置 (x, y)100, 30,                       // 大小 (宽度, 高度)hwnd,                         // 父窗口句柄(HMENU)1,                     // 控件ID((LPCREATESTRUCT)lParam)->hInstance, // 实例句柄NULL                          // 附加数据);CreateWindow("BUTTON",                     // 窗口类(按钮)"版本号",                     // 按钮文本WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, // 样式10, 10,                       // 位置 (x, y)100, 30,                       // 大小 (宽度, 高度)hwnd,                         // 父窗口句柄(HMENU)15423,                     // 控件ID((LPCREATESTRUCT)lParam)->hInstance, // 实例句柄NULL                          // 附加数据);hButton2 = CreateWindow("BUTTON",                     // 窗口类(按钮)"点击我切换全屏",                     // 按钮文本WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, // 样式850, 50,                       // 位置 (x, y)100, 30,                       // 大小 (宽度, 高度)hwnd,                         // 父窗口句柄(HMENU)2,                     // 控件ID((LPCREATESTRUCT)lParam)->hInstance, // 实例句柄NULL                          // 附加数据);// 创建切换按钮CreateWindowW(L"BUTTON", L"隐藏密码",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,100, 300, 80, 30,hwnd, (HMENU)IDC_BTN_TOGGLE,NULL, NULL);hEdit = CreateWindowW(L"EDIT", L"",WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL,20, 250, 200, 25, hwnd,  (HMENU)IDC_EDIT1, NULL, NULL);CreateWindowW(L"BUTTON", L"示例输入",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,20, 300, 80, 30, hwnd, (HMENU)IDC_BUTTON_SUBMIT, NULL, NULL);// 创建复制按钮CreateWindowW(L"BUTTON", L"复制",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,180, 300, 80, 30,hwnd, (HMENU)IDC_BTN_COPY,NULL, NULL);return 0;}case WM_TRAY_ICON:if (lParam == WM_LBUTTONDBLCLK) {ToggleTrayMode(hwnd);}return 0;// 禁用系统最小化操作case WM_SYSCOMMAND:if (wParam == SC_MINIMIZE) {ToggleTrayMode(hwnd);return 0;}break;case WM_COMMAND: {if (LOWORD(wParam) == IDC_BTN_COPY) {// 获取输入框内容wchar_t szText[256];GetWindowTextW(hEdit, szText, 256);// 打开剪贴板if (OpenClipboard(hwnd)) {// 清空剪贴板EmptyClipboard();// 分配全局内存HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, (wcslen(szText) + 1) * sizeof(wchar_t));if (hGlobal) {// 锁定内存并复制数据wchar_t* pGlobal = (wchar_t*)GlobalLock(hGlobal);wcscpy(pGlobal,  szText);GlobalUnlock(hGlobal);// 设置剪贴板数据SetClipboardData(CF_UNICODETEXT, hGlobal);}// 关闭剪贴板CloseClipboard();}// 提示用户MessageBoxW(hwnd, L"内容已复制到剪贴板!", L"成功", MB_OK);}// 假设按钮的ID是IDC_BUTTON1if (LOWORD(wParam) == 32) {if(currentCursor==CROSS){currentCursor=HAND;}else if(currentCursor==HAND){currentCursor=ARROW;}else{currentCursor=CROSS;}// 强制更新光标PostMessage(hwnd, WM_SETCURSOR, (WPARAM)hwnd, HTCLIENT);}if (wParam == 12345) { //ID为12345// 获取本地时间SYSTEMTIME st;GetLocalTime(&st);// 格式化时间字符串wchar_t timeStr[64];_snwprintf(timeStr, 64,L"%04d-%02d-%02d %02d:%02d:%02d",st.wYear, st.wMonth, st.wDay,st.wHour, st.wMinute, st.wSecond);//                // 更新静态文本
//                SetWindowTextW(hStaticTime, timeStr);//                 可选:弹出消息框显示MessageBoxW(hwnd, timeStr, L"系统时间", MB_OK);}if (LOWORD(wParam) == IDC_BTN_TRAY) {ToggleTrayMode(hwnd);}if (LOWORD(wParam) == IDC_BUTTON_SUBMIT) {wchar_t buffer[256];GetWindowTextW(hEdit, buffer, 256);if (wcslen(buffer) == 0) {MessageBoxW(hwnd, L"输入不能为空!", L"错误", MB_ICONERROR);} else {MessageBoxW(hwnd, buffer, L"输入内容", MB_OK);}}if (LOWORD(wParam) == IDC_BTN_TOGGLE) {TogglePasswordMode(hwnd);}			if (LOWORD(wParam) == 15423) {MessageBoxW(hwnd, L"v1.9.25", L"版本号", MB_OK);				}int ButtonID = LOWORD(wParam);switch (ButtonID) {case 1:DestroyWindow(hwnd);HWND hwnwd;hwnwd = FindWindow("ConsoleWindowClass", NULL);if (hwnwd) {ShowOwnedPopups(hwnwd, SW_SHOW);ShowWindow(hwnwd, SW_SHOW);}break;case 2:ToggleFullscreen(hwnd);break;}}default:return DefWindowProc(hwnd, msg, wParam, lParam);}return 0;
}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR pCmdLine, int nCmdShow) {HWND hwnwd;hwnwd = FindWindow("ConsoleWindowClass", NULL);if (hwnwd) {ShowOwnedPopups(hwnwd, SW_HIDE);ShowWindow(hwnwd, SW_HIDE);}const char* CLASS_NAME = "CustomWindowClass";WNDCLASS wc = {};wc.lpfnWndProc = WndProc;wc.hInstance = hInstance;wc.lpszClassName = TEXT(CLASS_NAME);wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);if (!RegisterClass(&wc)) return 0;// 创建窗口HWND hwnd = CreateWindowEx(0,                              // 扩展样式TEXT(CLASS_NAME),                     // 窗口类" 绘画",                   // 窗口标题WS_OVERLAPPEDWINDOW | WS_VISIBLE, // 窗口样式CW_USEDEFAULT, CW_USEDEFAULT,   // 位置1000, 1000,                       // 大小NULL,                           // 父窗口NULL,                           // 菜单hInstance,                      // 实例句柄NULL                            // 附加数据);if (!hwnd) return 0;// 消息循环MSG msg = {};while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}return 0;
}

 当然,还有彩蛋

#include <windows.h>// 控件ID定义
#define IDC_EDIT_INPUT  1001
#define IDC_BTN_COPY    1002// 窗口过程
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {static HWND hEditInput;switch (msg) {case WM_CREATE: {// 创建输入框hEditInput = CreateWindowW(L"EDIT", L"",WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL,20, 20, 200, 25,hwnd, (HMENU)IDC_EDIT_INPUT,((LPCREATESTRUCT)lParam)->hInstance,NULL);// 创建复制按钮CreateWindowW(L"BUTTON", L"复制",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,230, 20, 80, 25,hwnd, (HMENU)IDC_BTN_COPY,NULL, NULL);return 0;}case WM_COMMAND: {if (LOWORD(wParam) == IDC_BTN_COPY) {// 获取输入框内容wchar_t szText[256];GetWindowTextW(hEditInput, szText, 256);// 打开剪贴板if (OpenClipboard(hwnd)) {// 清空剪贴板EmptyClipboard();// 分配全局内存HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, (wcslen(szText) + 1) * sizeof(wchar_t));if (hGlobal) {// 锁定内存并复制数据wchar_t* pGlobal = (wchar_t*)GlobalLock(hGlobal);wcscpy(pGlobal,szText);GlobalUnlock(hGlobal);// 设置剪贴板数据SetClipboardData(CF_UNICODETEXT, hGlobal);}// 关闭剪贴板CloseClipboard();}// 提示用户MessageBoxW(hwnd, L"内容已复制到剪贴板!", L"成功", MB_OK);}return 0;}case WM_CLOSE:DestroyWindow(hwnd);return 0;case WM_DESTROY:PostQuitMessage(0);return 0;default:return DefWindowProcW(hwnd, msg, wParam, lParam);}
}// WinMain函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) {const wchar_t CLASS_NAME[] = L"CopyToClipboardApp";WNDCLASSW wc = {};wc.lpfnWndProc = WndProc;wc.hInstance = hInstance;wc.lpszClassName = CLASS_NAME;wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);RegisterClassW(&wc);HWND hwnd = CreateWindowExW(0, CLASS_NAME, L"复制到剪贴板示例",WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,400, 150, NULL, NULL, hInstance, NULL);ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);MSG msg;while (GetMessageW(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessageW(&msg);}return 0;
}

 

 

 

OK,今天就到这里

点赞再走

7\tfrac{9}{6}=2\pi \times 9\frac{\mathrm{3} }{\mathrm{7} 2}x\alpha \lambda 999\coprod \frac{\binom{9}{7} }{8\partial \times 376}

x=?

参考:https://blog.csdn.net/lijiale20150909/article/details/146120963

相关文章:

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

再再再次感谢Ttcofee提的问题 本次更新内容&#xff1a; 鼠标图案&#xff08;切换&#xff09;&#xff0c;版本号获取&#xff0c;输入框复制剪切板 提前申明&#xff1a;如果运行不了&#xff0c;请到主页查看RedpandaDevc下载&#xff0c;若还是不行就卸了重装。 版本号&…...

Python控制语句——循环语句-for

1.下面的语句哪个会无限循环下去()。 A、 for a in range(10): time.sleep(10) B、 while 1<10: time.sleep(10) C、 while True: break D、 a = [3,-1,2] for i in a: if i==-1: break 答案:B。1<10始终为True,循环体中又没有break的条件,故B会无限循环。 2.for s i…...

全面解析:将采购入库单数据集成到MySQL的技术实施

旺店通旗舰版-采购入库单集成到MySQL的技术案例分享 在数据驱动的业务环境中&#xff0c;如何高效、准确地实现系统间的数据对接是企业面临的重要挑战。本文将聚焦于一个具体的系统对接集成案例&#xff1a;将旺店通旗舰奇门平台上的采购入库单数据集成到MySQL数据库中&#x…...

12. Pandas :使用pandas读Excel文件的常用方法

一 read_excel 函数 其他参数根据实际需要进行查找。 1.接受一个工作表 在 11 案例用到的 Excel 工作簿中&#xff0c;数据是从第一张工作表的 A1 单元格开始的。但在实际场景中&#xff0c; Excel 文件可能并没有这么规整。所以 panda 提供了一些参数来优化读取过程。 比如 s…...

记录致远OA服务器硬盘升级过程

前言 日常使用中OA系统突然卡死&#xff0c;刷新访问进不去系统&#xff0c;ping服务器地址正常&#xff0c;立马登录服务器检查&#xff0c;一看磁盘爆了。 我大脑直接萎缩了&#xff0c;谁家OA系统配400G的空间啊&#xff0c;过我手的服务器没有50也是30台&#xff0c;还是…...

Java网络多线程

网络相关概念: 关于访问: IP端口 因为一个主机上可能有多个服务, 一个服务监听一个端口,当你访问的时候主机通过端口号就能知道要和哪个端口发生通讯.因此一个主机上不能有两个及以上的服务监听同一个端口. 协议简单来说就是数据的组织形式 好像是两个人交流一样,要保证自己说…...

【H2O2 | 软件开发】Axios发送Http请求

目录 前言 开篇语 准备工作 正文 概念 封装工具包 示例 结束语 前言 开篇语 本系列为短篇&#xff0c;每次讲述少量知识点&#xff0c;无需一次性灌输太多的新知识点。该主题文章主要是围绕前端、全栈开发相关面试常见问题撰写的&#xff0c;希望对诸位有所帮助。 如…...

VScode 运行LVGL

下载vscode解压 环境安装 安装mingw64&#xff0c;gcc 版本必须8.3以上 安装cmak 系统环境变量Path中添加&#xff08;以实际安装目录为准&#xff09; C:\Program Files\mingw64\bin C:\Program Files\CMake\bin 将GUI-Guider生成的代码目录拷贝一份放到vscode项目目录…...

AIP-165 按条件删除

编号165原文链接https://google.aip.dev/165状态批准创建日期2019-12-18更新日期2019-12-18 有时API需要提供一种机制&#xff0c;按照一些过滤参数删除大量资源&#xff0c;而非提供待删除的各资源名字。 这是一个稀有的场景&#xff0c;用于用户一次性删除数千或更多资源的…...

React Next项目中导入Echart世界航线图 并配置中文

公司业务要求做世界航线图&#xff0c;跑了三个ai未果&#xff0c;主要是引入world.json失败&#xff0c;echart包中并不携带该文件&#xff0c;源码的world.json文件页面404找不到。需要自己寻找。这是整个问题卡壳的关键点&#xff0c;特此贴出资源网址。 目录 一、安装 二…...

QT与网页显示数据公式的方法

一.网页中显示数学公式通常有三种主要方法 1.图片方式 原理&#xff1a;将公式转换为图片&#xff08;如 PNG、SVG&#xff09;&#xff0c;通过 <img> 标签嵌入网页。 实现步骤&#xff1a; 使用工具&#xff08;如 LaTeX dvipng、在线生成工具&#xff09;将公式渲…...

深入解析APP订阅页的运作机制(订阅页如何运作)

在当今数字经济的背景下&#xff0c;订阅模式已成为许多企业获取稳定收入的重要方式。无论是软件、视频流媒体还是电子商务&#xff0c;订阅服务都能为用户提供持续的价值体验。然而&#xff0c;如何有效地设计和运作一个订阅页&#xff0c;是决定用户是否愿意订阅的关键因素。…...

Golang倒腾一款简配的具有请求排队功能的并发受限服务器

golang官方指南[1]给了一些代码片段&#xff0c;层层递进演示了信道的能力: 1>. 信号量2>. 限流能力 var sem make(chan int, MaxOutstanding) func Serve(queue chan *Request) {for req : range queue {req: reqsem <- 1 go func() { // 只会开启MaxOutstandin…...

【运维】服务器系统从centos7重装为ubuntu22.04

目录 一、硬盘准备二、系统安装三、安装基本系统组件四、挂载机械硬盘五、问题解决 一、硬盘准备 【注意&#xff1a;这一步会把硬盘的数据清空&#xff0c;所以需要找一个空的U盘或者把U盘数据备份】 ubuntu22.04下载 需要先安装 bittorrent 下载完之后会打开一个网页 然后…...

创新技术引领软件供应链安全,助力数字中国建设

编者按 随着数字化转型的加速&#xff0c;针对软件供应链的攻击事件呈快速增长态势&#xff0c;目前已成为网络空间安全的焦点。如何将安全嵌入到软件开发到运营的全流程&#xff0c;实现防护技术的自动化、一体化、智能化&#xff0c;成为技术领域追逐的热点。 悬镜安全作为…...

【设计模式】建造者模式——工厂模式

三、建造者模式——工厂模式 3.1 工厂模式 创建一个类对象的传统方式是使用关键字new, 因为用new 创建的类对象是一个堆对象&#xff0c;可以实现多态。工厂模式通过把创建对象的代码包装起来&#xff0c;实现创建对象的代码与具体 的业务逻辑代码相隔离的目的(将对象的创建和…...

Java基础:枚举类enum入门案例

1.基础枚举定义与使用&#xff1a; package com.zxy;public class Main {public static void main(String[] args) { // 获取枚举值cars car cars.BMW;switch (car){case BMW :System.out.println("BMW");break;case BENZ :System.out.println("BENZ&…...

蓝桥备赛(18)- 红黑树和 set 与 map(上)

对于二叉搜索树 &#xff0c; 平衡二叉树 &#xff0c; 以及红黑树 &#xff0c; 目前只需要了解背后的原理 &#xff0c; 不做代码实现的要求 &#xff0c; 重要的就是了解各种操作的时间复杂度即可 &#xff0c; 为set 与 map 做铺垫 一、二叉搜索树 1.1 基本概念 相较与于堆…...

Spring Boot集成EasyExcel

1. 初始化Spring Boot项目 首先&#xff0c;使用Spring Initializr&#xff08;https://start.spring.io/&#xff09;生成一个基本的Spring Boot项目。选择以下依赖项&#xff1a; Spring WebLombok (用于减少样板代码)SLF4J (用于日志记录) 2. 添加依赖 在你的pom.xml文件…...

obeaver 连接oracle 库 模式乱码

下载orai18n-12.1.0.2.0.jar 库--添加文件--把提前下载好的jar 随便放在一个文件夹下--添加文件选中&#xff0c;然后点击找到类&#xff0c; 选择类&#xff0c;确定即可正常 下载地址&#xff1a;https://download.csdn.net/download/weixin_42845364/88368302...

ChatGPT 使用教程:深度探索AI常用功能技巧

文章目录 前言一、ChatGPT介绍1.1 人工智能与自然语言处理的发展1.2 ChatGPT 的诞生与意义 二、ChatGPT 基础入门2.1 注册与登录2.2 对话界面介绍2.3 基本提问方式 三、常用功能详解3.1 文本生成3.2 问题回答3.3 语言翻译3.4 代码生成与调试 四、高级使用技巧4.1 指令优化4.2 多…...

無人機的應用程序有那些可以部署在linux server 系統

Dronecode Project&#xff1a;由 Linux Foundation 主導的開源項目&#xff0c;提供無人機航空操作系統和導航工具的開發框架&#xff0c;適合開發者使用。 DeepSeek-R1&#xff1a;這是一個人工智能模型&#xff0c;適用於無人機的數據處理和分析&#xff0c;支持在 Linux 系…...

[HUBUCTF 2022 新生赛]messy_traffic

下载附件 看到文件类型直接用wireshark打开&#xff0c;对MySQL协议进行追踪流&#xff0c;并没有什么发现&#xff0c;后面对NO.437发现有用信息&#xff0c;http追踪流 发现**system(‘cat passwd.txt’);**这里是在打开查看passwd.txt&#xff0c;密码是"SignUpForHUBU…...

铁人三项(第五赛区)_2018_rop题解

先启动靶机连接看看。 直接ls&#xff0c;就给我输出句话&#xff0c;看来不能直接拿flag。 那走下流程。 查下位数和其他信息&#xff1a; 可以看到是32位的包&#xff0c;开了NX&#xff0c;但没开其他保护。 用ida32打开looklook。 主函数就是个这&#xff0c;看到了弹出的…...

package.json 依赖包约束及快速删除node_modules

文章目录 一、package.json版本约束1、初始项目安装2. 已有 yarn.lock 文件的项目安装3. 特殊情况手动修改 package.json 版本&#xff1a;使用 yarn upgrade 命令&#xff1a; 二、快速删除node_modules三、depcheck 检测npm未使用的依赖 一、package.json版本约束 1、初始项…...

Compose 实践与探索六 —— 动画的流程控制与 Transition

1、Block 参数&#xff1a;监听每一帧 animateTo() 与 animateDecay() 中都有一个函数类型的 block 参数&#xff1a; suspend fun animateDecay(initialVelocity: T,animationSpec: DecayAnimationSpec<T>,block: (Animatable<T, V>.() -> Unit)? null): An…...

虚拟机Contos7为啥不能被本机电脑访问?

1.查看防火墙是否开启 systemctl status firewalld.service 2.如果防火墙关闭就可以直接被访问 3.如果防火墙打开了我们需要开放端口(下面为防火墙一系列指令) # 关闭防火墙 systemctl stop firewalld.service# 打开防火墙 systemctl start firewalld.service# 关闭开启自启…...

【21】单片机编程核心技巧:if语句逻辑与真假判断

【21】单片机编程核心技巧&#xff1a;if语句逻辑与真假判断 七律 条件分野 if语句判真假&#xff0c;括号条件定乾坤。 非零为真零为假&#xff0c;大括号内藏玄门。 省略虽简风险在&#xff0c;代码规范护本根。 单片逻辑由心控&#xff0c;条件分支自成文。 注释&#xf…...

Java 实现 Android ViewPager2 顶部导航:动态配置与高效加载指南

Java 实现&#xff1a;明确使用的编程语言。Android ViewPager2&#xff1a;技术栈和核心组件。顶部导航&#xff1a;功能点。动态配置与高效加载指南&#xff1a;突出动态配置的灵活性和性能优化的重点。 在 Android 中使用 Java 实现 ViewPager2 和 TabLayout 的顶部导航也是…...

Python :数据模型

一. 什么是数据模型&#xff1f; Python数据模型是Python对象系统的抽象&#xff0c;通过一组特殊方法​&#xff08;如__init__、__len__等&#xff09;和协议​&#xff08;如迭代协议、上下文管理协议&#xff09;&#xff0c;定义了对象如何与语言的内置功能&#xff08;如…...