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

【第五节】windows sdk编程:windows 控件基础

目录

一、控件概述

二、标准控件

三、通用控件

四、控件的创建

五、控件风格

六、控件相关的消息

6.1 控件控制消息

6.2 控件通知消息


一、控件概述

        控件是 Windows 系统内置的窗口类,它们只能是某个窗口的子窗口。因此,创建控件时必须使用 `WS_CHILD` 风格。控件的窗口类由系统预先注册,因此我们不需要手动注册窗口类。控件的消息响应函数由 Windows 提供,而不是我们自己编写的。

        控件的行为由其内置的窗口回调函数处理。当控件发生某些行为时(如被点击或需要重绘),它会向其父窗口发送通知消息。

二、标准控件

        标准控件是 Windows 提供的基本控件,使用方式简单。以下是常用的标准控件:

三、通用控件

        通用控件是 Windows 提供的较为复杂的控件,例如树形控件、列表框控件、选项步控件等。以下是常见的通用控件:

四、控件的创建

        控件的创建使用 `CreateWindow` 函数,但不需要手动注册窗口类。通常需要为控件指定 `WS_CHILD` 和 `WS_VISIBLE` 风格。由于子窗口没有菜单,`CreateWindow` 的菜单参数用于指定子窗口的 ID,以区分同一父窗口上的不同控件。
示例代码(标准与通用控件)

#include <windows.h>
#include <string>
#include <commctrl.h> // 公共控件头文件,包含列表视图、树形视图等控件的定义// 链接Common Controls库
#pragma comment(lib, "comctl32.lib")// 窗口过程函数,用于处理窗口消息
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{switch (msg){case WM_CREATE: // 窗口创建时触发{// 创建列表视图控件HWND hListView = CreateWindow(WC_LISTVIEW, // 列表视图的窗口类名L"ListView", // 控件初始文本WS_VISIBLE | WS_CHILD | LVS_REPORT, // 控件风格:可见、子窗口、报表视图10, 10, 300, 150, // 控件位置和大小hwnd, (HMENU)1, // 父窗口句柄和控件ID((LPCREATESTRUCT)lParam)->hInstance, // 应用程序实例句柄NULL);// 添加列到列表视图LVCOLUMN lvColumn;lvColumn.mask = LVCF_TEXT | LVCF_WIDTH; // 设置列属性:文本和宽度lvColumn.cx = 100; // 列宽度lvColumn.pszText = (LPWSTR)L"Column 1"; // 列标题,使用类型转换ListView_InsertColumn(hListView, 0, &lvColumn); // 插入第一列lvColumn.pszText = (LPWSTR)L"Column 2"; // 列标题,使用类型转换ListView_InsertColumn(hListView, 1, &lvColumn); // 插入第二列// 添加项到列表视图LVITEM lvItem;lvItem.mask = LVIF_TEXT; // 设置项属性:文本lvItem.iItem = 0; // 第一行lvItem.iSubItem = 0; // 第一列lvItem.pszText = (LPWSTR)L"Item 1"; // 项文本,使用类型转换ListView_InsertItem(hListView, &lvItem); // 插入项lvItem.iSubItem = 1; // 第二列lvItem.pszText = (LPWSTR)L"SubItem 1"; // 子项文本,使用类型转换ListView_SetItem(hListView, &lvItem); // 设置子项文本// 创建树形视图控件HWND hTreeView = CreateWindow(WC_TREEVIEW, // 树形视图的窗口类名L"TreeView", // 控件初始文本WS_VISIBLE | WS_CHILD | TVS_HASLINES | TVS_HASBUTTONS, // 控件风格:可见、子窗口、带线条和按钮10, 170, 200, 150, // 控件位置和大小hwnd, (HMENU)2, // 父窗口句柄和控件ID((LPCREATESTRUCT)lParam)->hInstance, // 应用程序实例句柄NULL);// 添加根节点TVINSERTSTRUCT tvInsert;tvInsert.hParent = NULL; // 根节点没有父节点tvInsert.hInsertAfter = TVI_LAST; // 插入到末尾tvInsert.item.mask = TVIF_TEXT; // 设置节点属性:文本tvInsert.item.pszText = (LPWSTR)L"Root"; // 根节点文本,使用类型转换HTREEITEM hRoot = TreeView_InsertItem(hTreeView, &tvInsert); // 插入根节点// 添加子节点tvInsert.hParent = hRoot; // 子节点的父节点是根节点tvInsert.item.pszText = (LPWSTR)L"Child"; // 子节点文本,使用类型转换TreeView_InsertItem(hTreeView, &tvInsert); // 插入子节点// 创建选项卡控件HWND hTabControl = CreateWindow(WC_TABCONTROL, // 选项卡控件的窗口类名L"TabControl", // 控件初始文本WS_VISIBLE | WS_CHILD, // 控件风格:可见、子窗口220, 170, 250, 150, // 控件位置和大小hwnd, (HMENU)3, // 父窗口句柄和控件ID((LPCREATESTRUCT)lParam)->hInstance, // 应用程序实例句柄NULL);// 添加选项卡TCITEM tcItem;tcItem.mask = TCIF_TEXT; // 设置选项卡属性:文本tcItem.pszText = (LPWSTR)L"Tab 1"; // 选项卡标题,使用类型转换TabCtrl_InsertItem(hTabControl, 0, &tcItem); // 插入第一个选项卡tcItem.pszText = (LPWSTR)L"Tab 2"; // 选项卡标题,使用类型转换TabCtrl_InsertItem(hTabControl, 1, &tcItem); // 插入第二个选项卡// 创建热键控件HWND hHotKey = CreateWindow(HOTKEY_CLASS, // 热键控件的窗口类名NULL, // 控件初始文本WS_VISIBLE | WS_CHILD, // 控件风格:可见、子窗口10, 330, 200, 30, // 控件位置和大小hwnd, (HMENU)4, // 父窗口句柄和控件ID((LPCREATESTRUCT)lParam)->hInstance, // 应用程序实例句柄NULL);// 创建按钮控件HWND hButton = CreateWindow(L"BUTTON", // 按钮控件的窗口类名L"Click Me", // 按钮文本WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, // 控件风格:可见、子窗口、标准按钮220, 330, 100, 30, // 控件位置和大小hwnd, (HMENU)5, // 父窗口句柄和控件ID((LPCREATESTRUCT)lParam)->hInstance, // 应用程序实例句柄NULL);// 创建编辑框控件HWND hEdit = CreateWindow(L"EDIT", // 编辑框控件的窗口类名L"Type here", // 初始文本WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL | WS_BORDER, // 控件风格:可见、子窗口、自动水平滚动、带边框330, 330, 150, 30, // 控件位置和大小hwnd, (HMENU)6, // 父窗口句柄和控件ID((LPCREATESTRUCT)lParam)->hInstance, // 应用程序实例句柄NULL);break;}case WM_COMMAND: // 处理控件通知消息{int ctrlID = LOWORD(wParam); // 获取控件IDint notifyCode = HIWORD(wParam); // 获取通知代码// 处理按钮点击事件if (ctrlID == 5 && notifyCode == BN_CLICKED){MessageBox(hwnd, L"Button Clicked!", L"Notification", MB_OK); // 弹出消息框}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)
{// 初始化公共控件库INITCOMMONCONTROLSEX icc;icc.dwSize = sizeof(INITCOMMONCONTROLSEX); // 结构体大小icc.dwICC = ICC_LISTVIEW_CLASSES | ICC_TREEVIEW_CLASSES | ICC_TAB_CLASSES | ICC_HOTKEY_CLASS; // 需要初始化的控件类型InitCommonControlsEx(&icc); // 初始化公共控件// 注册窗口类WNDCLASS wc = { 0 };wc.lpfnWndProc = WndProc; // 窗口过程函数wc.hInstance = hInstance; // 应用程序实例句柄wc.lpszClassName = (LPCWSTR)L"MyWindowClass"; // 窗口类名,使用正确的类型转换if (!RegisterClass(&wc)) // 注册窗口类{MessageBox(NULL, L"Window Registration Failed!", L"Error", MB_ICONEXCLAMATION | MB_OK); // 注册失败时弹出错误消息return 0;}// 创建窗口HWND hwnd = CreateWindow(L"MyWindowClass", // 窗口类名L"Common Controls Example", // 窗口标题WS_OVERLAPPEDWINDOW, // 窗口风格CW_USEDEFAULT, CW_USEDEFAULT, 500, 450, // 窗口位置和大小NULL, NULL, hInstance, NULL); // 父窗口句柄、菜单句柄、应用程序实例句柄、附加数据if (hwnd == NULL) // 窗口创建失败{MessageBox(NULL, L"Window Creation Failed!", L"Error", MB_ICONEXCLAMATION | MB_OK); // 弹出错误消息return 0;}// 显示窗口ShowWindow(hwnd, nCmdShow); // 显示窗口UpdateWindow(hwnd); // 更新窗口// 消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)) // 获取消息{TranslateMessage(&msg); // 翻译消息DispatchMessage(&msg); // 分发消息}return msg.wParam; // 返回程序退出码
}

五、控件风格

        每种控件除了通用的窗口风格(以 `WS_` 开头)外,还有自己的特定风格。以下是常见控件风格的前缀:

示例代码:

#include <windows.h>
#include <string>
#include <commctrl.h> // 公共控件头文件,包含列表视图、树形视图等控件的定义// 窗口过程函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {switch (msg) {case WM_CREATE: {// 创建按钮控件CreateWindow(L"BUTTON",                     // 按钮类名L"Click Me",                   // 按钮文本WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, // 按钮风格20, 20, 100, 30,             // 位置和大小hwnd,                         // 父窗口句柄(HMENU)1,                     // 控件ID((LPCREATESTRUCT)lParam)->hInstance, // 实例句柄NULL);// 创建编辑框控件CreateWindow(L"EDIT",                       // 编辑框类名L"",                           // 初始文本WS_VISIBLE | WS_CHILD | WS_BORDER | ES_AUTOHSCROLL, // 编辑框风格20, 60, 200, 30,              // 位置和大小hwnd,                         // 父窗口句柄(HMENU)2,                     // 控件ID((LPCREATESTRUCT)lParam)->hInstance, // 实例句柄NULL);// 创建静态文本控件CreateWindow(L"STATIC",                     // 静态文本类名L"Hello, World!",              // 文本内容WS_VISIBLE | WS_CHILD | SS_CENTER, // 静态文本风格20, 100, 200, 30,             // 位置和大小hwnd,                         // 父窗口句柄(HMENU)3,                     // 控件ID((LPCREATESTRUCT)lParam)->hInstance, // 实例句柄NULL);// 创建组合框控件CreateWindow(L"COMBOBOX",                   // 组合框类名L"",                           // 初始文本WS_VISIBLE | WS_CHILD | CBS_DROPDOWN, // 组合框风格20, 140, 200, 100,            // 位置和大小hwnd,                         // 父窗口句柄(HMENU)4,                     // 控件ID((LPCREATESTRUCT)lParam)->hInstance, // 实例句柄NULL);// 创建列表框控件CreateWindow(L"LISTBOX",                    // 列表框类名L"",                           // 初始文本WS_VISIBLE | WS_CHILD | LBS_NOTIFY | WS_BORDER, // 列表框风格20, 180, 200, 100,            // 位置和大小hwnd,                         // 父窗口句柄(HMENU)5,                     // 控件ID((LPCREATESTRUCT)lParam)->hInstance, // 实例句柄NULL);break;}case WM_COMMAND: {// 处理控件事件if (LOWORD(wParam) == 1) { // 按钮点击事件MessageBox(hwnd, L"Button Clicked!", L"Info", MB_OK);}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) {// 注册窗口类WNDCLASS wc = { 0 };wc.lpfnWndProc = WndProc;wc.hInstance = hInstance;wc.lpszClassName = L"MyWindowClass";RegisterClass(&wc);// 创建窗口HWND hwnd = CreateWindow(L"MyWindowClass",                      // 窗口类名L"Control Styles Example",             // 窗口标题WS_OVERLAPPEDWINDOW,                  // 窗口风格CW_USEDEFAULT, CW_USEDEFAULT, 300, 400, // 窗口位置和大小NULL, NULL, hInstance, NULL);if (hwnd == NULL) {return 0;}// 显示窗口ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);// 消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}

六、控件相关的消息

控件与父窗口的交互通过两种消息实现:
        1. 控件控制消息:用于控制控件行为。
        2. 控件通知消息:用于通知父窗口用户行为。

6.1 控件控制消息

        每种控件除了接收通用窗口消息(以 `WM_` 开头)外,还有自己的专属消息。通过发送这些消息,可以控制控件的行为,而无需关心其内部处理逻辑。

6.2 控件通知消息

        控件通知消息用于子控件向父窗口通知事件,例如子控件被点击或需要重绘。常见的控件通知消息分为两类:
- `WM_COMMAND`:标准控件的通知消息。
- `WM_NOTIFY`:通用控件的通知消息。

示例代码:

#include <windows.h>
#include <string>
#include <commctrl.h> // 公共控件头文件,包含列表视图、树形视图等控件的定义#include <windows.h>// 窗口过程函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{switch (msg){case WM_COMMAND:{// 获取控件ID和通知代码int ctrlID = LOWORD(wParam);int notifyCode = HIWORD(wParam);// 处理按钮点击事件if (ctrlID == 1 && notifyCode == BN_CLICKED){MessageBox(hwnd, L"Button Clicked!", L"Notification", MB_OK);}break;}case WM_NOTIFY:{// 获取NMHDR结构体指针NMHDR* pNmHdr = (NMHDR*)lParam;// 处理来自通用控件的通知if (pNmHdr->code == NM_CLICK){MessageBox(hwnd, L"Control Clicked!", L"Notification", MB_OK);}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)
{// 注册窗口类WNDCLASS wc = { 0 };wc.lpfnWndProc = WndProc;wc.hInstance = hInstance;wc.lpszClassName = L"MyWindowClass";if (!RegisterClass(&wc)){MessageBox(NULL, L"Window Registration Failed!", L"Error", MB_ICONEXCLAMATION | MB_OK);return 0;}// 创建窗口HWND hwnd = CreateWindow(L"MyWindowClass", L"My Window", WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, 300, 200,NULL, NULL, hInstance, NULL);if (hwnd == NULL){MessageBox(NULL, L"Window Creation Failed!", L"Error", MB_ICONEXCLAMATION | MB_OK);return 0;}// 创建按钮控件CreateWindow(L"BUTTON", L"Click Me", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,50, 50, 100, 30, hwnd, (HMENU)1, hInstance, NULL);// 显示窗口ShowWindow(hwnd, nCmdShow);UpdateWindow(hwnd);// 消息循环MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}

        本节介绍了 Windows 控件的基础知识,包括标准控件、通用控件、控件的创建、风格以及消息处理机制。通过示例代码,展示了如何创建按钮和编辑框,并处理控件通知消息。

相关文章:

【第五节】windows sdk编程:windows 控件基础

目录 一、控件概述 二、标准控件 三、通用控件 四、控件的创建 五、控件风格 六、控件相关的消息 6.1 控件控制消息 6.2 控件通知消息 一、控件概述 控件是 Windows 系统内置的窗口类&#xff0c;它们只能是某个窗口的子窗口。因此&#xff0c;创建控件时必须使用 WS_C…...

架构师论文《论云原生架构及其应用》

【摘要】 2022年3月&#xff0c;我作为系统架构师参与了某大型零售企业“智能化供应链管理平台”项目的设计与实施工作。该平台旨在整合企业分散在不同区域的仓储、物流、库存及订单系统&#xff0c;构建统一管理的云原生架构&#xff0c;以应对业务季节性峰值带来的弹性伸缩需…...

Centos 7 安装达梦数据库

一、环境准备 1. 确认操作系统的版本和数据库的版本是否一致 cat /etc/redhat-release 2. 关闭防火墙 查看防火墙状态 firewall-cmd --state 停止firewall systemctl stop firewalld.service 禁止firewall开机启动 systemctl disable firewalld.service 3. 修改文件l…...

46.全排列

46.全排列 力扣题目链接 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a…...

RabbitMQ (Java)学习笔记

目录 一、概述 ①核心组件 ②工作原理 ③优势 ④应用场景 二、入门 1、docker 安装 MQ 2、Spring AMQP 3、代码实现 pom 依赖 配置RabbitMQ服务端信息 发送消息 接收消息 三、基础 work Queue 案例 消费者消息推送限制&#xff08;解决消息堆积方案之一&#…...

2-002:MySQL 索引的最左前缀匹配原则是什么?

MySQL 索引的最左前缀匹配原则 最左前缀匹配原则&#xff08;Leftmost Prefix Matching&#xff09; 是指&#xff1a; 当 查询使用了复合索引&#xff08;联合索引&#xff09; 时&#xff0c;MySQL 会优先匹配索引的 最左列&#xff0c;然后逐步向右匹配&#xff0c;直到遇到…...

【Python 数据结构 15.哈希表】

目录 一、哈希表的基本概念 1.哈希表的概念 2.键值对的概念 3.哈希函数的概念 4.哈希冲突的概念 5.常用的哈希函数 Ⅰ、直接定址法 Ⅱ、平方取中法 Ⅲ、折叠法 Ⅳ、除留余数法 Ⅴ、位与法 6.哈希冲突的解决方案 Ⅰ、开放定址法 Ⅱ、链地址法 7.哈希表的初始化 8.哈希表的元素插…...

校园安全用电怎么保障?防触电装置来帮您

引言 随着教育设施的不断升级和校园用电需求的日益增长&#xff0c;校园电力系统的安全性和可靠性成为了学校管理的重要课题。三相智能安全配电装置作为一种电力管理设备&#xff0c;其在校园中的应用不仅能够提高电力系统的安全性&#xff0c;还能有效保障师生的用电安全&am…...

疗养院管理系统设计与实现(代码+数据库+LW)

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装疗养院管理系统软件来发挥其高效地信息处理的作用&#xf…...

基于 Redis Stream 实现消息队列功能

好长时间没更新了。。。。。。 背景&#xff1a;举个例子在某个接口执行完成后只需要前半段返回结果&#xff0c;后半段可能是日志记录、下游系统调用等功能的情况下&#xff0c;将耗时的消息进行异步发送就显得很有必要&#xff0c;这时就有很多种选择&#xff0c;单体项目甚至…...

单元测试、系统测试、集成测试、回归测试的步骤、优点、缺点、注意点梳理说明

单元测试、系统测试、集成测试、回归测试的梳理说明 单元测试 步骤&#xff1a; 编写测试用例&#xff0c;覆盖代码的各个分支和边界条件。使用测试框架&#xff08;如JUnit、NUnit&#xff09;执行测试。检查测试结果&#xff0c;确保代码按预期运行。修复发现的缺陷并重新测…...

深入理解 HTML 中的<div>和元素:构建网页结构与样式的基石

一、引言 在 HTML 的世界里&#xff0c;<div>和元素虽看似普通&#xff0c;却扮演着极为关键的角色。它们就像网页搭建过程中的万能积木&#xff0c;能够将各种 HTML 元素巧妙地组合起来&#xff0c;无论是构建页面布局&#xff0c;还是对局部内容进行样式调整&#xff…...

网络安全信息收集[web子目录]:dirsearch子目录爆破全攻略以及爆破字典结合

目录 一、dirsearch 工具详细使用攻略 1. 安装 前提条件 安装步骤 可选&#xff1a;直接下载预编译版本 2. 基本用法 命令格式 参数说明 示例 3. 核心功能与高级用法 3.1 多线程加速 3.2 自定义字典 3.3 递归扫描 3.4 过滤响应 3.5 添加请求头 3.6 代理支持 3…...

Mybaties批量操作

1、批量插入 <!--批量操作-插入--><!-- 相当于INSERT INTO t_goods (c1,c2,c3) VALUES (a1,a2,a3),(b1,b2,b3),(d1,d2,d3),...--><insert id"batchInsert" parameterType"java.util.List">INSERT INTO t_goods (title,sub_title,origina…...

27.卷2的答案

CSP-J离我们不远了&#xff0c;加加油啦&#xff01; 1.堆排序最坏时间复杂度是&#xff1f; 解析&#xff1a;平时多多练习可知&#xff0c;最坏时间复杂度是O(n log n)。 2.哪条能将s中的数值保留一位&#xff0c;并将第二位四舍五入&#xff1f; 解析&#xff1a;经过试…...

【 Manus平替开源项目】

文章目录 Manus平替开源项目1 OpenManus1.1 简介1.2 安装教程1.3 运行 2 OWL2.1 简介2.2 安装教程2.3 运行 3 OpenHands&#xff08;原OpenDevin&#xff09;3.1 简介3.2 安装教程和运行 Manus平替开源项目 1 OpenManus 1.1 简介 开发团队: MetaGPT 核心贡献者&#xff08;5…...

【WEB APIs】DOM-事件基础

目录 1. 事件监听&#xff08;绑定&#xff09; 案例—关闭广告 案例-随机点名 2. 事件类型 2.1 鼠标事件 2.2 焦点事件 2.3 文本事件 3. 事件对象 案例—评论回车发布 4. 环境对象 5. 回调函数 6. 综合案例—tab栏切换 1. 事件监听&#xff08;绑定&#xff09; …...

66.Harmonyos NEXT 图片预览组件使用指南

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; Harmonyos NEXT 图片预览组件使用指南 文章目录 Harmonyos NEXT 图片预览组件使用指南效果预览一、组件使用概述1. 组件功能特点2. 组件依赖关系 二…...

linux系统安装和激活conda

安装 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.shbash ./Miniconda3-latest-Linux-x86_64.sh回车到最后按照输入yes&#xff0c;之后按提示操作。 激活 conda activate如果没有反应或者返回&#xff1a; bash: conda: command not found则…...

Java 集合框架大师课:集合框架的暗黑料理(六)

&#x1f52e;Java 集合框架大师课&#xff1a;集合框架的暗黑料理&#xff08;六&#xff09;——弱引用与幽灵队列 第一章 弱引用&#xff1a;Java世界的塑料兄弟情 &#x1f494; 四大引用类型生死簿 // 四类引用生死实验 Object strongObj new Object(); …...

LVI-SAM、VINS-Mono、LIO-SAM算法的阅读参考和m2dgr数据集上的复现(留作学习使用)

ROS一键安装参考&#xff1a; ROS的最简单安装——鱼香一键安装_鱼香ros一键安装-CSDN博客 opencv官网下载4.2.0参考&#xff1a;https://opencv.org/releases/page/3/ nvidia驱动安装:ubuntu18.04 安装显卡驱动 - 开始战斗 - 博客园 cuda搭配使用12 cuda安装1&#xff1a;Ub…...

京鲁医疗健康专家委员会聊城专家团成立

3月13日由京鲁医疗健康专家委员会指导&#xff0c;聊城市委人才工作领导小组办公室、聊城市卫生健康委员会、聊城市人才引进服务中心主办的"智链医脉&#xff0e;新启未来"聊城卫生健康产才共融发展交流会在北京人卫酒店召开。会上&#xff0c;京鲁医疗健康专家委员会…...

MySQL的事务机制

事务 事务概念&#xff1a;事务是一个完整的操作单元&#xff0c;不可分割&#xff0c;事务中的操作要么全部成功&#xff0c;要么全部失败。 1. 事务特性 ACID 1.1 原子性&#xff08;A&#xff09; 一个事务中所有操作是不能被分割的&#xff0c;要么所有的操作都成功&am…...

30、Vuex 为啥可以进行缓存处理

Vuex 状态管理基础与缓存的关联 Vuex 的核心概念&#xff1a; Vuex 主要由五个部分组成&#xff1a;state、mutations、actions、getters和modules。其中&#xff0c;state是存储数据的地方&#xff0c;类似于一个全局的数据仓库。在这个菜谱 APP 的例子中&#xff0c;缓存的数…...

OpenAI Agents SDK 中文文档 中文教程 (5)

英文文档原文详见 OpenAI Agents SDKhttps://openai.github.io/openai-agents-python/ 本文是OpenAI-agents-sdk-python使用翻译软件翻译后的中文文档/教程。分多个帖子发布&#xff0c;帖子的目录如下&#xff1a; (1) OpenAI 代理 SDK&#xff0c; 介绍及快速入门 (2)Open…...

如何处理PHP中的文件上传错误

如何处理PHP中的文件上传错误 在Web开发中&#xff0c;文件上传是一个常见的功能需求。然而&#xff0c;文件上传过程中可能会遇到各种错误&#xff0c;如文件大小超出限制、文件类型不被允许、上传过程中断等。为了确保用户能够顺利上传文件&#xff0c;并且开发者能够有效地…...

mac安装python没有环境变量怎么办?zsh: command not found: python

在mac电脑上,下载Python安装包进行安装之后,在终端中,输入python提示: zsh: command not found: python 一、原因分析 首先,这个问题不是因为python没有安装成功的原因,是因为python安装的时候,没有为我们添加环境变量导致的,所以我们只需要,在.zshrc配置文件中加上环…...

湿大气校正效应

目的 修正由于大气中的水汽对雷达波传播速度的影响&#xff0c;以提高海面高度测量的准确性&#xff0c;有时候也叫做对流层校正。水汽的时空变化复杂&#xff0c;难以直接通过气象模型准确预测。水汽的折射作用使雷达信号的传播速度减慢&#xff0c;从而导致测量的海面高度虚增…...

算法系列之回溯算法求解数独及所有可能解

有没有对数独感兴趣的朋友呢&#xff1f;数独作为一款经典的逻辑游戏&#xff0c;其目标是在一个9x9的方格中填入数字1至9&#xff0c;确保每一行、每一列以及每一个3x3的子网格中都包含这些数字且不重复。尽管数独的规则看似简单&#xff0c;但编写一个能够自动求解数独的程序…...

动态路径规划——01背包问题讲解和通过滚动数组优化

如果没有动态路径规划基础的兄弟可以出去了&#xff0c;这个题目有两个问题 第一问讲解&#xff1a; 1.定义状态表示 刚开始我做的时候根据我的经验定义了一个状态表示dp[i]表示从1到i个物品中选择的最大价值&#xff0c;但是这个状态表示有一个明显的问题&#xff0c;我怎么知…...

蓝队基本技能 web入侵指南 日志分析 后门查杀 流量分析

前言 为了赶工我是没学过红队的&#xff0c;首先我们要做的是 1、拿到用户给的web的时候 要先知道 web的源码 服务器 中间件 数据库这些信息 2、知道web日志放在哪里 会一些基本的分析 3、webshell查杀的基本技能 4、会分析基本的工具链 会写报告 .NET IIS 配置…...

docker基本应用和相关指令

文章目录 概要镜像管理容器操作网络管理数据卷管理其他常用指令典型场景示例小结 概要 Docker的命令通常分为几个大类&#xff0c;比如镜像管理&#xff08;images&#xff09;、容器管理&#xff08;containers&#xff09;、网络&#xff08;network&#xff09;、数据卷&…...

Django REST Framework中的序列化器类和视图类

序列化器类 一、Serializer序列化类 Serializer是DRF的序列化器基类&#xff0c;提供基本功能&#xff0c;使用Serializer类需要自己定义字段名称和类型。 BookSerializer(Serializer):name serializers.CharField()price serlializers.IntegerField()date serlializers.…...

模拟人生4大型MOD整合包3000+

存档介绍 &#xff08;懒人萌新必备&#xff09; 游戏内全面的人物美化、房屋改造、地图美化 美化人物250个&#xff08;颜值在线&#xff0c;均搭配八套服饰&#xff09; 全地图房屋改造&#xff08;住宅、公寓、公用/商业地段等&#xff09; 游戏内22张地图均已美化替换 存档…...

算法基础 -- Brian Kernighan 算法初识

Brian Kernighan 算法&#xff1a;利用 x & (x - 1) 逐步清除最低位的 1 1. 算法原理 x & (x - 1) 这个操作的作用是每次清除 x 的最低位的 1。由于 二进制的减法 会影响最低的 1&#xff0c;我们可以利用这一特性不断去除 1&#xff0c;直到 x 变为 0&#xff0c;从…...

基于Uniapp开发tab选项卡/标签栏前端组件

在开发一些业务场景时候&#xff0c;可能需要切换标签栏来展示不同的信息列表。 为此开发了一个Uniapp组件&#xff08;myTab&#xff09;&#xff0c;下面为组件的展示效果&#xff1a; 案例代码&#xff1a; <template><view class"content"><myt…...

双向广搜

从两侧同时展开,那测数据少就从哪侧展,两者展开结果出现一样的,返回答案 127. 单词接龙 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int ladderLength(string beginWord, string endWord, vector<string>& wordList) {unordered_set<stri…...

2024下半年真题 系统架构设计师 论文写作 答案解析

系统架构设计师第二版VIP课程https://edu.csdn.net/course/detail/40283 试题一 论软件维护及其应用 请围绕“论软件维护及其应用”论题&#xff0c;依次从以下三个方面进行论述。 1.概要叙述你参与分析设计的软件项目以及你在其中所承担的主要工作。 2.请介绍软件维护的内…...

【VSCODE 插件 可视化】:SVG 编辑插件 SVG Editor

插件下载 svgeditor 创建文件 Windows/Linux 快捷键 Ctrl Shift P 打开VSCODE 命令面板查找 New File With Svg Editor 编辑文件 保存文件 打开文件以继续编辑 CG 选中多个&#xff1a;shift单击没找到横向分布功能无法用键盘微调位置...

go中实现子模块调用main包中函数的方法

你提到的“import cycle not allowed”错误是 Go 语言中一个常见的问题&#xff0c;表示在包的导入中存在循环依赖。在 Go 中&#xff0c;一个包不能直接或间接导入自己&#xff0c;否则就会报这个错误。 在你提到的第二个例子中&#xff0c;main 包和 submodule 包相互导入&a…...

VUE的脚手架搭建引入类库

VUE的小白脚手架搭建 真的好久好久自己没有发布自己博客了,对于一直在做后端开发的我 ,由于社会卷啊卷只好学习下怎么搭建前端,一起学习成长吧~哈哈哈(最终目的,能够懂并简易开发) 文章目录 VUE的小白脚手架搭建1.下载node.js2.安装vue脚手架3.创建一个项目4.代码规范约束配置(…...

java maven依赖传递以及版本冲突

文章目录 基本背景基本排查冲突工具依赖传递&#xff1a;很多依赖到底使用哪个版本的依赖dependencyManagement 作用exclusions其他问题 基本背景 你使用 java&#xff0c;使用 maven pom.xml 管理你的依赖包 可能常常遇到依赖版本冲突&#xff0c;或者很多依赖包&#xff0c;…...

【3-14 STC-pair超级详细的解说】

1. pair的定义和结构 • 基础概念&#xff1a;考察对std::pair模板类的理解&#xff0c;包括其头文件&#xff08;<utility>&#xff09;和基本语法&#xff08;pair<T1, T2>&#xff09;。 • 成员访问&#xff1a;测试对first和second成员变量的使用能力。 • 构…...

Python开发合并多个PDF文件

前言 在我们的工作中&#xff0c;可能有以下场景需要用到合并多个PDF&#xff1a; 文档归档&#xff1a;在企业或组织中&#xff0c;常常需要将相关的文档&#xff08;如合同、报告、发票等&#xff09;合并为一个PDF文件&#xff0c;以便于归档和管理。 报告生成&#xff1a;在…...

基于SpringBoot + Vue 的房屋租赁系统

基于springboot的房屋租赁管理系统-带万字文档 SpringBootVue房屋租赁管理系统 送文档 本项目有前台和后台两部分、多角色模块、不同角色权限不一样 共分三种角色&#xff1a;用户、管理员、房东 管理员&#xff1a;个人中心、房屋类型管理、房屋信息管理、预约看房管理、合…...

Qt QML实现弹球消砖块小游戏

前言 弹球消砖块游戏想必大家都玩过&#xff0c;很简单的小游戏&#xff0c;通过移动挡板反弹下落的小球&#xff0c;然后撞击砖块将其消除。本文使用QML来简单实现这个小游戏。 效果图&#xff1a; 正文 代码目录结构如下&#xff1a; 首先是小球部分&#xff0c;逻辑比较麻…...

ROS实践(四)机器人SLAM建图(gmapping)

目录 一、SLAM技术 二、常用工具和传感器 三、相关功能包 1. gmapping建图功能包 2. map_server 四、SLAM 建图实验 1. 配置gmapping(launch文件) 2. 启动机器人仿真(含机器人以及传感器) 3. 运行gmapping节点 4. 启动rviz可视化工具 5. 保存地图文件 一、SLAM技…...

使用Arduino、ESP8266和GPS在Google地图上追踪车辆

使用 ESP8266、GPS 和 Google 地图的 Arduino Vehicle Tracker 如今,车辆跟踪系统变得非常重要,尤其是在车辆被盗的情况下。如果您的车辆安装了 GPS 系统,您可以跟踪您的车辆位置,它可以帮助警方追踪被盗车辆。 在这里,我们正在构建更高级版本的车辆跟踪系统,您可以在其…...

python数据分析文件夹篇--pandas,openpyxl,xlwings三种方法批量创建、 复制、删除工作表

前言 之前我们学习了使用pandas灵活地读取数据&#xff0c;包括读取工作簿中一个或几个工作表&#xff0c;读取工作表中一行或多行&#xff0c;一列或多列数据&#xff0c;还学习了如何将数据灵活保存到本地。 今天我们学习一下文件夹中文件的批量处理操作&#xff0c;包括批量…...

MyBatis 的一级、二级缓存

文章目录 1️⃣ 一级缓存&#xff08;Local Cache&#xff09;&#x1f4cc; 定义&#x1f680; 示例代码 2️⃣ 二级缓存&#xff08;Global Cache&#xff09;&#x1f4cc; 定义&#x1f680; 使用方式 3️⃣ 一级缓存 vs. 二级缓存 &#x1f4ca;4️⃣ 数据共享问题&#x…...