我又又又又又又更新了~~纯手工编写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,今天就到这里
点赞再走
x=?
参考:https://blog.csdn.net/lijiale20150909/article/details/146120963
相关文章:
我又又又又又又更新了~~纯手工编写C++画图,有注释~~~
再再再次感谢Ttcofee提的问题 本次更新内容: 鼠标图案(切换),版本号获取,输入框复制剪切板 提前申明:如果运行不了,请到主页查看RedpandaDevc下载,若还是不行就卸了重装。 版本号&…...
Vue源码深度解析:从2.x到3.x的架构演进与核心原理剖析
Vue源码深度解析:从2.x到3.x的架构演进与核心原理剖析 一、框架演变:从Vue2到Vue3的跨越 1.1 革命性升级 Vue3的发布标志着前端框架进入新纪元,其核心改进体现在三个方面: 性能飞跃:包体积减少41%,初始…...
评委打分5个评委 去掉一个最高分和一个最低分 取平均分
一键替换max用min 按shiftF6 public static int getMin(int[]scores){int min scores[0];for (int i 0; i < scores.length; i) {if(scores[i]> min){min scores[i];}}return min;} 这里有和c/c不一样的知识点 c/c调用函数类似于java的方法,但是c/c的函数调用需要声明…...
javabean类(测试类之外的类)
altinsert快捷键生成构造方法和get、set方法 或者插件ptg(连接外网搜索插件并且下载)...
C++ 邻接矩阵(代码)
C邻接矩阵代码,见下: #include<iostream>using namespace std;#define inf -1 class Graph{ private:int vertices;int **edges;public:Graph(int vertices);~Graph();void addEdge(int u, int v, int w);void printGraph(); };Graph::Graph(int …...
Cookie与Session详解
Cookie简介 Cookie 是浏览器提供的持久化存储数据的一种机制。是指某些网站为了辨别用户身份、进行会话跟踪而储存在用户本地终端上的数据(通常经过加密)。以下是关于 Cookie 的详细介绍: Cookie工作原理 当你访问一个网站时,该网…...
OpenBMC:BmcWeb 处理http请求
OpenBMC:BmcWeb 读取http请求头-CSDN博客 介绍了,在读取完http头后,将调用Connection::handle处理http请求 1.Connection::handle void handle() {...req = std::make_shared<crow::Request>(parser->release(), reqEc);...req->session = userSession;accept …...
【算法题解答·六】栈队列堆
【算法题解答六】栈队列堆 接上文【算法方法总结六】栈队列堆的一些技巧和注意事项 栈队列堆相关题目如下: 232.用栈实现队列 简单 准备两个栈,一个负责入队的栈A,一个负责出队的栈B出队和返回队列开头元素,都要先进行以下操作…...
计算机视觉算法实战——手势识别(主页有源码)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 领域简介:手势识别的价值与挑战 手势识别是连接人类自然行为与数字世界的核心交互技术,在智能设备控制、…...
JobScheduler省电机制
1.前言 JobScheduler(任务调度器)是 Android 提供的一种任务调度机制,可以替代传统的 WakeLock 和 Alarm 来执行后台任务。那么,它们之间的区别是什么?JobScheduler 又有哪些特别之处呢? 1.1 WakeLock 和 …...
设计模式学习笔记——命令模式
2025年3月13日,周四下午 相同的保存逻辑在各个组件中重复出现。 且需要修改保存逻辑时,各个组件的保存逻辑都需要进行相应修改。 使用了命令模式把保存逻辑从三个组件中独立出来后,减少了代码冗余。 可以通过“保存命令”来使用保存逻辑&am…...
[TPCTF 2025] crypto 复现两题
周末很忙。比赛都没怎么看。晚上把密码复现两个。 randomized random 这题在小鸡块博客里见过,稍有区别。 # FROM python:3 import random with open("flag.txt","rb") as f:flagf.read() for i in range(2**64):print(random.getrandbits(3…...
电子元器件选型与实战应用—16 怎么选一个合适的MCU芯片?
文章目录 1. 选型要素1.1 价格1.2 技术支持1.3 厂家优势1.4 功耗1.5 特殊功能1.6 统计外设1.7 确定外设占用的内存和flash大小1.8 确定外设通信接口1.9 确定外设通信接口的电平1.10 确定外设的GPIO数量1.11 确定外设的供电和功耗1.12 确定外设GPIO的种类1.13 确定ADC的数量1.14…...
第6关:牛牛鱼缸-附加题
任务描述 本关任务:问题描述:牛牛有一个鱼缸,鱼缸里面已经有n条鱼,每条鱼的大小为fishSizei,牛牛现在想把新捕捉的鱼放入鱼缸。鱼缸里存在着大鱼吃小鱼的定律。经过观察,牛牛发现一条鱼A的大小为另外一条鱼…...
go中间件学习
本博文源于笔者正在学习go中间件,罗列了较为常用的中间件,例如日志记录、认证授权、跨域资源共享、请求体解析、静态文件处理、错误处理、性能分析、速率限制、session 1、日志记录中间件 可以追加打印用,例如,将请求进行打印 …...
若依RuoYi-Cloud-Plus微服务版(完整版)前后端部署
一.目标 在浏览器上成功登录进入 二.源码下载 后端源码:前往Gitee下载页面(https://gitee.com/dromara/RuoYi-Cloud-Plus)下载解压到工作目录。 前端源码: 前往Gitee下载页面(https://gitee.com/JavaLionLi/plus-ui)下载解压到工作目录。 文档地址&a…...
航空电动力系统适航标准要点手册
航空电动力系统适航标准要点手册 1.标准制定背景与必要性1.1 为什么需要制定和遵循标准?1.2 标准制定依据与发布机构 2.关键核心标准概述2.1 电动航空与电推进系统2.2 混合动力系统2.3 硬件与通用要求 3.标准详细解读与应用场景3.1 DO-160G:环境适应性测…...
深入理解JavaScript构造函数与原型链:从原理到最佳实践
一、开篇:为什么需要理解原型链? 在JavaScript开发中,90%以上的"诡异"bug都与原型链机制相关。理解构造函数与原型链的运行原理,不仅能帮助我们写出更优雅的代码,还能在框架源码阅读、性能优化等场景中游刃…...
java每日精进 3.12 【WebSocket进阶】
基于 SpringWebSocket 进行二次封装,实现了更加简单的使用方式。例如说,WebSocket 的认证、Session 的管理、WebSocket 集群的消息广播等等。 1. 用户认证与登录用户信息传递 1.1 Token 过滤器 (TokenAuthenticationFilter) ① 在 WebSocket 连接建立…...
国家网络安全事件应急预案
目 录 1 总则 1.1 编制目的 1.2 编制依据 1.3 适用范围 1.4 事件分级 1.5 工作原则 2 组织机构与职责 2.1 领导机构与职责 2.2 办事机构与职责 2.3 各部门职责 2.4 各省(区、市)职责 3 监测与预警 3.1 预警分级 3.2 预警监测 3.3 预警研判…...
Markdown:Mermaid 画图
目录 安装基本语法流程图时序图甘特图总结 Mermaid 是一款用于生成流程图、时序图、甘特图等图表的 JavaScript 库。它可以将简单的文本描述转化为美观的图表,方便开发者进行可视化展示。 安装 Mermaid 可以直接在浏览器中使用,也可以在 Node.js 环境中…...
【视频】ffmpeg、Nginx搭建RTMP、HLS服务器
1、源码安装Nginx 1)源码下载 因为要使用Nginx的模块nginx-rtmp-module,所以要下载 nginx 和 nginx-rtmp-module 的源码。 下载地址: http://nginx.org/en/download.html https://github.com/arut/nginx-rtmp-module/tags2)解压、配置 在同一个目录中解压 nginx 和 nginx…...
时间有限,如何精确设计测试用例?5种关键方法
精确设计测试用例能够迅速识别并修复主要缺陷,确保产品质量,降低后期维护成本,并通过专注于核心功能来提升用户体验,为项目的成功奠定坚实基础。若未能精确设计测试用例,可能会导致关键功能测试不充分,使得…...
【算法】图论
⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 持续更新中...1、DFS2、BFSN 叉树的层序遍历二叉树的锯齿形层序遍历二叉树最大宽度 3、多源BFS腐烂的苹果 4、拓扑排序 持续更新中…...
ADQ32 5G采集卡
ADQ32是一款高端12位双通道数据采集板,针对高通量科学应用进行了优化。ADQ32具有以下特性: 一个和两个模拟输入通道包括每通道5和2.5 GSPS7GB/s的持续数据传输速率至GPU7GB/秒的持续数据传输速率两个外部触发器通用输入/输出(GPIO)开放式FPG…...
机器人领域专业名词汇总
1. 电机与驱动 电机类型 DC Motor(直流电机):通过直流电源驱动的电机。Stepper Motor(步进电机):通过脉冲信号控制旋转角度的电机。Servo Motor(伺服电机):带有反馈控制的…...
拆解 “ES 已死“ 伪命题:Agentic RAG 时代搜索引擎的终极形态
作者:来自 Elastic 李捷 xxx:“ES已死,#%#……” 我:??? 最近,某厂商发了一堆公关文章,翻来覆去地炒作 “ES 已死”,“放弃 ES”。这哪是什么正经的技术文章&…...
eNSP中路由器的CON/AUX接口、GE Combo接口、Mini USB接口、USB接口、WAN侧uplink接口、FE接口、GE接口介绍
路由器常见接口的详细介绍及其应用示例: 1. CON/AUX 接口 全称:Console/Auxiliary(控制台/辅助接口)作用: CON(Console):通过命令行界面(CLI)直接配置路由器…...
平面的四种方程及一些应用
平面的四种方程及一些应用 点法式方程一般式方程三点式方程截距式方程一些应用已知平面方程,找出平面上不共线的三个点 点法式方程 平面经过点 ( x 0 , y 0 , z 0 ) (x_0,y_0,z_0) (x0,y0,z0)且法向量为 ( a , b , c ) (a,b,c) (a,b,c),则平面的点…...
记录一个SQL自动执行的html页面
在实际工作场景中,需要运用到大量SQL语句更新业务逻辑,对程序员本身,写好的sql语句执行没有多大问题(图1),但是对于普通用户来说还是有操作难度的。因此我们需要构建一个HTML页面(图2࿰…...
SpringBoot——Maven篇
Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的工具。它具有许多特性,其中一些重要的特性包括: 1. 自动配置:Spring Boot 提供了自动配置的机制,可以根据应用程序的依赖和环境自动配置应用程序的各种组件ÿ…...
数据批处理(队列方式)
数据批处理(队列方式) public class DataProcessor {private static final int THREAD_COUNT 4;private static final int QUEUE_SIZE 10;private LinkedBlockingQueue<Data> queue new LinkedBlockingQueue<>(QUEUE_SIZE);public DataP…...
从零开始搭建搜索推荐系统(五十四)多路召回之万剑归宗
聊的不止技术。跟着小帅写代码,还原和技术大牛一对一真实对话,剖析真实项目筑成的一砖一瓦,了解最新最及时的资讯信息,还可以学到日常撩妹小技巧哦,让我们开始探索主人公小帅的职场生涯吧! (PS…...
c++介绍函数指针 十
指针代表内存中地址标识符,变量,数组都是存储内存中的数据。所以可以获得它们的地址,用指针来表示这块内存。 如图输出内存中的地址。 对于一个函数来说,也是内存中存储这段数据,所以我们也可以获取函数的地址。 函数…...
redis数据库
一、redis数据库介绍 NoSQL Not Only SQL 非关系型数据库 1、关系型数据库与非关系型数据库的区别 非关系型数据库性能高、速度快、支持高并发连接 1、非关系型数据库基于内存存储数据 2、摒弃了关系型数据的约束限制 3、采用o1算法进行设计开发 2、作用 关系型数…...
关于 NoC 中数据安全传输的设计与实现的详细介绍
片上网络(Network-on-Chip,NoC)作为一种新兴的片上通信架构,解决了传统总线架构在大规模集成电路设计中面临的诸多问题。然而,随着芯片系统的复杂性和应用场景的多样化,NoC 中数据安全传输变得至关重要。以…...
OpenGL(4)着色器
文章目录 一、着色器1、什么是着色器?2、着色器类型2.1、顶点着色器(Vertex Shader)2.2、片段着色器(Fragment Shader) 3、着色器属性3.1、layout 属性3.2、in 属性3.3、out 属性3.4、总结 4、示例 前言: 在…...
PHP批量去除Bom头的方法
检查的代码: <?php$dir __DIR__; $files new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));foreach ($files as $file) {if ($file->isFile() && pathinfo($file, PATHINFO_EXTENSION) php) {$content file_get_contents(…...
51单片机的keil c51软件安装教程
Keil(C51)介绍、下载、安装与注册_keil c51-CSDN博客 参考 安装 不一定是这个大小,也可以下载别的版本KEID C51 注册 加入芯片型号 …...
JavaScript基本知识
文章目录 一、JavaScript基础1.变量(重点)1-1 定义变量及赋值1-2 变量的命名规则和命名规范判断数据类型: 2.数据类型转换2-1 其他数据类型转成数值2-2 其他数据类型转成字符串2-3 其他数据类型转成布尔 3.函数3-1函数定义阶段3-2函数调用阶段…...
导数,积分及常用公式
导数定义: 求导是数学计算中的一个计算方法,它的定义就是,当自变量的增量趋于零时,因变量的增量与自变量的增量之商的极限。在一个函数存在导数时,称这个函数可导或者可微分。可导的函数一定连续。不连续的函数一定…...
鸿蒙应用开发—ZDbUtil高效使用数据库
文章目录 介绍下载安装基本使用注解TableIdColumnOneToOne 使用方法定义实体类初始化数据库并根据被Table注解的类创建表创建表查数据插入数据删除数据清空数据 参考 介绍 ZDbUtil是一款基于SQLite的鸿蒙数据库框架,通过注解标注实体类与属性,让数据更能…...
强化学习(赵世钰版)-学习笔记(7.时序差分学习)
本章是课程算法与方法中的第四章,介绍的时序差分学习算法是基于随机近似方法设计的强化学习方法,也是model-free的方法。 时序差分算法是一种近似估计策略状态值的算法,具体的形式如下: 本质上是在当前t时刻,被访问到的…...
正则表达式入门及常用的正则表达式
正则表达式(Regular Expression,简称 Regex)是一种强大的文本处理工具,用于匹配、查找和替换字符串中的特定模式。以下是入门指南和常用正则表达式示例: 一、正则表达式入门 1. 基本语法 符号说明示例.匹配任意单个字…...
大白话如何在 Vue 项目中进行路由懒加载?
大白话如何在 Vue 项目中进行路由懒加载? 在 Vue 项目里,路由懒加载是种很实用的技术,它能让你在需要的时候再去加载对应的路由组件,而不是在项目启动时就把所有组件都加载进来,这样能加快项目的启动速度。下面就详细…...
手动实现一个RTTI系统
在 C 中,RTTI(Runtime Type Information,运行时类型信息)是一组允许程序在运行时获取对象类型信息的机制 。虽然C通过虚接口的方式提供了良好的抽象,但是对于一个复杂的系统,过于依赖抽象而忽略业务的复杂性…...
智能化水利监管:无人机视频在违章行为识别中的应用
随着我国经济社会的快速发展,水利工程建设规模不断扩大,但随之而来的违章建设行为也日益增多。传统的人工巡查方式效率低下,难以满足当前监管需求。无人机技术以其灵活性和高效性,为水利工程建设监管提供了新的解决方案。本文将探…...
力扣练习之确定两个字符串是否接近
目录 题目: 题解: 详细题解 题目: 如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 : 操作 1:交换任意两个 现有 字符。 例如,abcde -> aecdb 操作 2࿱…...
Word 小黑第21套
对应大猫22 设置表格为页面的80%:表布局 -属性 -表格 指定宽度80% 度量单位改成百分比 段落组 -中文版式 在表格上下方留一行空段(如果表格太大改一下样式)插入横线 边框线 (右击横线 -图片 修改样式) 段落 -取消对于…...
mingw32编译ffmpeg
ffmpeg https://gitee.com/mirrors/ffmpeg.git 使用msys2的mingw32 pacman -S mingw-w64-x86_64-toolchain compile ./confiure --enable-static --disable-shared --enable-gpl --target-oswin32 mingw32-make -j4 提示编译错误,msys2里面的路径是/d/tools/msys2…...