MFC 自定义网格控件
一、什么是 Custom Control?
Custom Control(自定义控件) 是 MFC(Microsoft Foundation Classes)框架中提供的一种控件类型,用于实现自定义的外观和功能。当标准控件(例如 CEdit
、CButton
、CListCtrl
等)无法满足特定需求时,可以使用 Custom Control 来实现个性化的控件。
Custom Control 的核心特点:
- 基于
CWnd
类:通过继承CWnd
类,实现完全自定义的绘制和行为。 - 灵活性高:开发者可以自定义控件的绘制外观、消息响应、用户交互等。
- 适用于特殊需求:如自定义按钮、进度条、图表、绘图区域等。
二、Custom Control 的使用方法
1. 在资源编辑器中添加 Custom Control
- 打开 资源视图,编辑对应的对话框模板。
- 从工具箱中选择 Custom Control,并放置到对话框上。
- 在控件的 属性窗口 中:
- Class:指定自定义控件的类名(如
MyCustomControl
)。 - ID:设置控件的唯一标识符(如
IDC_MY_CUSTOM
)。
- Class:指定自定义控件的类名(如
2. 创建自定义控件类
要实现自定义控件,需要创建一个继承自 CWnd
的类,并重写消息处理函数。
示例代码:
头文件:MyCustomControl.h
#pragma once
#include "afxwin.h"class CMyCustomControl : public CWnd
{
public:CMyCustomControl();virtual ~CMyCustomControl();protected:DECLARE_MESSAGE_MAP()afx_msg void OnPaint(); // 自定义绘制afx_msg void OnLButtonDown(UINT nFlags, CPoint point); // 鼠标点击事件
};
实现文件:MyCustomControl.cpp
#include "pch.h"
#include "MyCustomControl.h"BEGIN_MESSAGE_MAP(CMyCustomControl, CWnd)ON_WM_PAINT()ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()CMyCustomControl::CMyCustomControl() {}CMyCustomControl::~CMyCustomControl() {}void CMyCustomControl::OnPaint()
{CPaintDC dc(this); // 设备上下文CRect rect;GetClientRect(&rect);dc.FillSolidRect(rect, RGB(240, 240, 240)); // 背景颜色dc.SetTextColor(RGB(0, 0, 255)); // 文本颜色dc.DrawText(_T("自定义控件示例"), &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}void CMyCustomControl::OnLButtonDown(UINT nFlags, CPoint point)
{AfxMessageBox(_T("自定义控件被点击!"));CWnd::OnLButtonDown(nFlags, point);
}
3. 在对话框类中绑定 Custom Control
在对话框类中,将自定义控件绑定到资源中的 Custom Control。
示例代码:
头文件:MyDialog.h
#include "MyCustomControl.h"class CMyDialog : public CDialogEx
{...
private:CMyCustomControl m_myCustomControl; // 自定义控件对象
};
DoDataExchange 绑定控件:
void CMyDialog::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_MY_CUSTOM, m_myCustomControl); // 控件绑定
}
4. 在代码中动态创建 Custom Control
除了在资源编辑器中定义,Custom Control 也可以在代码中动态创建:
BOOL CMyDialog::OnInitDialog()
{CDialogEx::OnInitDialog();CRect rect(10, 10, 200, 50); // 控件位置和大小m_myCustomControl.Create(NULL, WS_CHILD | WS_VISIBLE, rect, this, 1234);return TRUE;
}
三、CGridCtrl 简介
CGridCtrl 是基于 Custom Control 的 MFC 自定义网格控件,通常用于显示表格数据。它是 CodeProject 社区提供的开源组件,可以实现类似 Excel 风格的表格功能。
CGridCtrl 官网:https://www.codeproject.com/Articles/8/MFC-Grid-control#History
CGridCtrl 的核心功能包括:
- 行列管理:动态添加、删除行列。
- 单元格管理:设置单元格文本、背景色、字体、边框等。
- 选择模式:支持单行选择、多行选择、单元格选择等。
- 数据编辑:单元格支持编辑功能,启用列表模式。
- 只读单元格:特定单元格可设置为只读,防止用户修改。
- 自适应列宽:支持自动扩展列宽适配内容。
- 高亮与排序:自动高亮选中行,并支持表格数据排序。
四、CGridCtrl 使用注意事项
1. SetItemText
与 SetRowCount
的关系
调用 SetItemText
函数设置单元格内容时,必须确保指定的行索引不超过当前的 SetRowCount
设置的行数。如果超出设置的行数范围,单元格内容将不会显示,也不会自动扩展行数。
2. 调用 ExpandColumnsToFit
和 ExpandLastColumn
在填充表格数据时,如果表格出现滚动条,默认情况下最后一列的宽度可能无法正确填充,导致内容显示不全或者异常。为确保显示正常,必须调用:
ExpandColumnsToFit
:调整所有列的宽度,使其适应当前表格的可视区域。ExpandLastColumn
:将最后一列扩展到表格的剩余宽度,确保视觉上的完整性。
五、CGridCtrl 特殊单元格类型使用
1. 设置下拉框单元格(CGridCellCombo)
通过设置单元格类型为 CGridCellCombo
,可以实现在单元格中显示下拉框,用户可选择选项。
示例代码:
if (m_gridUserManager.SetCellType(i, 3, RUNTIME_CLASS(CGridCellCombo))) {CGridCellCombo* pCell = static_cast<CGridCellCombo*>(m_gridUserManager.GetCell(i, 3));pCell->SetOptions(permissions); // 设置下拉框选项列表pCell->SetStyle(CBS_DROPDOWNLIST); // 设置为只可选择的下拉框
}
SetOptions
:设置下拉框的选项内容。SetStyle(CBS_DROPDOWNLIST)
:设置为下拉选择模式,用户不能输入自由文本。
2. 设置复选框单元格(CGridCellCheck)
通过设置单元格类型为 CGridCellCheck
,可以在单元格中显示复选框,用户可勾选。
示例代码:
if (m_grid.SetCellType(nRowIndex, 1, RUNTIME_CLASS(CGridCellCheck))) {auto* pCell = static_cast<CGridCellCheck*>(m_grid.GetCell(nRowIndex, 1));pCell->SetCheck(TRUE); // 设置复选框为选中状态
}
SetCheck(TRUE)
:设置复选框的初始状态为选中。- 通过
SetCheck(FALSE)
可以将复选框状态设置为未选中。
注意事项:
- 在调用
SetCellType
之前,需要确保表格已设置足够的行列数。 - 通过
RUNTIME_CLASS
设置单元格类型时,需要确保所用的单元格类(如CGridCellCombo
和CGridCellCheck
)已经包含在项目中。
六、CGridCtrl 使用示例
1. 初始化表格控件
Custom Control 指定自定义控件的类名(MFCGridCtrl)。
以下代码展示如何初始化一个 CGridCtrl 控件,创建 4 列表格,并设置标题和基础样式:
void CRecipeListDlg::InitRecipeLise()
{if (m_grid.GetSafeHwnd() == NULL) {return;}int nRows = 1;int nCols = 4;int nFixRows = 1;int nFixCols = 0;int nRowIdx = 0;int nColIdx = 0;m_grid.DeleteAllItems();m_grid.SetVirtualMode(FALSE);m_grid.GetDefaultCell(TRUE, FALSE)->SetBackClr(g_nGridFixCellColor); // 设置固定行背景色m_grid.GetDefaultCell(FALSE, TRUE)->SetBackClr(g_nGridFixCellColor); // 设置固定列背景色m_grid.GetDefaultCell(FALSE, FALSE)->SetBackClr(g_nGridCellColor); // 设置单元格背景色m_grid.SetFixedTextColor(g_nGridFixFontColor); // 设置固定行列字体颜色m_grid.SetRowCount(nRows);m_grid.SetColumnCount(nCols);m_grid.SetFixedRowCount(nFixRows);m_grid.SetFixedColumnCount(nFixCols);// Colm_grid.SetColumnWidth(nColIdx, 10);m_grid.SetItemText(nRowIdx, nColIdx++, _T("No."));m_grid.SetColumnWidth(nColIdx, 10);m_grid.SetItemText(nRowIdx, nColIdx++, _T("名称"));m_grid.SetColumnWidth(nColIdx, 50);m_grid.SetItemText(nRowIdx, nColIdx++, _T("描述"));m_grid.SetColumnWidth(nColIdx, 30);m_grid.SetItemText(nRowIdx, nColIdx++, _T("创建时间"));m_grid.SetFixedRowSelection(FALSE); // 设置固定行不可选中m_grid.SetFixedColumnSelection(FALSE); // 设置固定列不可选中m_grid.SetEditable(TRUE); // 设置单元格可编辑m_grid.SetRowResize(FALSE); // 设置行不可调整大小m_grid.SetColumnResize(TRUE); // 设置列可调整大小m_grid.ExpandColumnsToFit(TRUE); // 自动调整列宽,适合固定表格大小并希望所有列均匀分布的情况m_grid.SetListMode(TRUE); // 启用列表模式m_grid.EnableSelection(TRUE); // 启用选择m_grid.SetSingleRowSelection(TRUE); // 自动整行高亮(限制为单行选择)m_grid.ExpandLastColumn(); // 最后一列填充网格FillRecipeLise();
}
2. 填充数据到表格
FillRecipeLise
函数实现从文件夹和文本文件读取数据,并填充到表格:
void CRecipeListDlg::FillRecipeLise()
{// 在设置行数和数据填充时,批量处理操作,避免逐行刷新表格。// 开头调用 SetRedraw(FALSE),结束后调用 SetRedraw(TRUE)。m_grid.SetRedraw(FALSE);// 动态行数检查:在清空旧数据时,确保不会越界。// 清除数据行,保留表头for (int i = m_grid.GetRowCount() - 1; i > 0; --i) {m_grid.DeleteRow(i);}// 1. 遍历文件夹下所有XML文件std::string strRecipePath = CToolUnits::getRecipePath();std::vector<CString> vecFile = CToolUnits::GetFileNamesInDirectory(strRecipePath.c_str(), _T(".xml"));// 2. 读取 RecipeList.txt 文件std::map<CString, std::pair<CString, CString>> recipeData; // {配方名, {描述, 创建时间}}std::ifstream inFile(strRecipePath + "\\RecipeList.txt");if (inFile.is_open()) {std::string line;while (std::getline(inFile, line)) {if (line.empty()) continue; // 跳过空行std::istringstream ss(line);std::string name, description, createTime;// CSV格式解析(逗号分隔)if (std::getline(ss, name, ',') &&std::getline(ss, description, ',') &&std::getline(ss, createTime)) {recipeData[CString(name.c_str())] = std::make_pair(CString(description.c_str()), CString(createTime.c_str()));}}inFile.close();}// 3. 更新表格数据int rowIdx = 1;m_grid.SetRowCount(static_cast<int>(vecFile.size()) + 1);for (const auto& fileName : vecFile) {// 从 RecipeList.txt 数据中查找对应的描述和创建时间CString description = _T("");CString createTime = _T("");auto it = recipeData.find(fileName);if (it != recipeData.end()) {description = it->second.first; // 配方描述createTime = it->second.second; // 创建时间}// 填充表格数据m_grid.SetItemText(rowIdx, 0, CString(std::to_string(rowIdx).c_str())); // No.m_grid.SetItemText(rowIdx, 1, fileName); // 配方名称m_grid.SetItemText(rowIdx, 2, description); // 配方描述m_grid.SetItemText(rowIdx, 3, createTime); // 创建时间// 禁止编辑m_grid.SetItemState(rowIdx, 0, GVIS_READONLY);m_grid.SetItemState(rowIdx, 1, GVIS_READONLY);m_grid.SetItemState(rowIdx, 3, GVIS_READONLY);++rowIdx;}// 适合内容不固定的情况,列宽自适应内容长度更自然。m_grid.ExpandColumnsToFit(FALSE); // 自动调整列宽m_grid.ExpandLastColumn(); // 最后一列填充网格// 刷新网格控件m_grid.SetRedraw(TRUE);m_grid.Invalidate();m_grid.UpdateWindow();
}
七、总结
- Custom Control 提供了实现自定义控件的基础能力,适合高度个性化需求。
- CGridCtrl 是一个基于 Custom Control 的表格控件,提供了灵活的表格展示与管理功能。
- CGridCtrl 支持设置特殊单元格类型,如下拉框(
CGridCellCombo
)和复选框(CGridCellCheck
)。
相关文章:
MFC 自定义网格控件
一、什么是 Custom Control? Custom Control(自定义控件) 是 MFC(Microsoft Foundation Classes)框架中提供的一种控件类型,用于实现自定义的外观和功能。当标准控件(例如 CEdit、CButton、CLi…...
什么是卷积?卷积的意义
卷积是一种在数学和信号处理中广泛应用的运算方法,它通常被用于描述两个函数之间的关系。在信号处理中,卷积可以将两个信号进行组合,以得到一个新的信号,该信号反映了这两个原始信号之间的关系。 具体来说,假设有两个…...
μC/OS-Ⅱ源码学习(7)---软件定时器
快速回顾 μC/OS-Ⅱ中的多任务 μC/OS-Ⅱ源码学习(1)---多任务系统的实现 μC/OS-Ⅱ源码学习(2)---多任务系统的实现(下) μC/OS-Ⅱ源码学习(3)---事件模型 μC/OS-Ⅱ源码学习(4)---信号量 μC/OS-Ⅱ源码学习(5)---消息队列 μC/OS-Ⅱ源码学习(6)---事件标志组 本文进一…...
3D和AR技术在电商行业的应用有哪些?
3D展示和AR技术在电商行业的应用为消费者带来了更为直观、沉浸式的购物体验,显著提升了商品展示效果和销售转化率。以下是3D和AR技术在电商行业的具体应用: 1、商品3D展示: 通过3D技术,商品可以在电商平台上以三维形式呈现&…...
数据增强的几大方式
1. 随机擦除(Random Erasing) 说明 随机在图像中选取一个矩形区域,将其像素值随机化或设为零,以增加模型对部分缺失信息的鲁棒性。 import numpy as np import cv2def random_erasing(image, sl0.02, sh0.2, r10.3):h, w, _ image.shapearea h * wta…...
GraphReader: 将长文本结构化为图,并让 agent 自主探索,结合的大模型长文本处理增强方法
GraphReader: 将长文本结构化为图,并让 agent 自主探索,结合的大模型长文本处理增强方法 论文大纲理解为什么大模型和知识图谱不够?还要多智能体 设计思路数据分析解法拆解全流程核心模式提问为什么传统的长文本处理方法会随着文本长度增加而…...
VTK 模型封闭 closeSurface 补洞, 网格封闭性检测
网格封闭性检测 见: vtk Edges 特征边 提取 网格封闭性检测_vtkfeatureedges-CSDN博客 由于以前做过3D打印模型,要求模型必须是封闭的,原来对模型封闭有研究过,不过没有记录;现在又遇到,整理一下ÿ…...
【译】仅有 Text2SQL 是不够的: 用 TAG 统一人工智能和数据库
原文地址:Text2SQL is Not Enough: Unifying AI and Databases with TAG 摘要 通过数据库为自然语言问题提供服务的人工智能系统有望释放出巨大的价值。此类系统可让用户利用语言模型(LM)的强大推理和知识能力,以及数据管理系统…...
Java:链接redis报错:NoSuchElementException: Unable to validate object
目录 前言报错信息排查1、确认redis密码设置是否有效2、确认程序配置文件,是否配置了正确的redis登录密码3、检测是否是redis持久化的问题4、确认程序读取到的redis密码没有乱码 原因解决 前言 一个已经上线的项目,生产环境的redis居然没有设置密码&…...
每日一题 334. 递增的三元子序列
334. 递增的三元子序列 使用贪心来找到三个数字 class Solution { public:bool increasingTriplet(vector<int>& nums) {int first INT_MAX;int second INT_MAX;for(int num : nums){if(num < first){first num;}else if(num < second){second num;}els…...
金仓 Kingbase 日常运维 SQL 汇总
金仓 Kingbase 日常运维 SQL 汇总 1 单机启停 sys_ctl start|stop|restart 或指定data路径和端口等 sys_ctl start|stop|restart -D /data/kingbase/data -p 543222 集群启停 sys_monitor start|stop|restart3 修改配置后重新加载 sys_ctl reload4 初始化实例 initdb -E ut…...
JAVA开发ERP时在 PurchaseOrderServiceImpl.java 中添加日志记录进行调试
在 PurchaseOrderServiceImpl.java 中添加日志记录,以便在保存订单时输出参数进行调试。可以使用 Spring 的日志框架(SLF4J 和 Logback)来实现这一点。 添加日志记录 引入 SLF4J 依赖: 确保项目中已经包含了 SLF4J 和 Logback 的依赖。通常在…...
36.3 grafana-dashboard看图分析
kube-prometheus中的grafana总结 db使用 sqlit,volume类型为emptydir 无法持久化,pod扩缩就重新创建通过configMap设置的prometheus DataSource 通过 prometheus-k8s svc对应的 域名访问下面对应两个prometheus容器,有HA 各个dashboard通过 …...
面试题整理5----进程、线程、协程区别及僵尸进程处理
面试题整理5----进程、线程、协程区别及僵尸进程处理 1. 进程、线程与协程的区别1.1 进程(Process)1.2 线程(Thread)1.3 协程(Coroutine)2. 总结对比 3. 僵尸进程3.1 什么是僵尸进程?3.2 僵尸进…...
【C语言程序设计——基础】顺序结构程序设计(头歌实践教学平台习题)【合集】
目录😋 <第1关:顺序结构的应用> 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果: <第2关:交换变量值> 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果: <第…...
LLM大语言模型私有化部署-OpenEuler22.03SP3上容器化部署Dify与Qwen2.5
背景 Dify 是一款开源的大语言模型(LLM) 应用开发平台。其直观的界面结合了 AI 工作流、 RAG 管道、 Agent 、模型管理、可观测性功能等,让您可以快速从原型到生产。相比 LangChain 这类有着锤子、钉子的工具箱开发库, Dify 提供了更接近生产需要的完整…...
C语言中的转义字符
C语言中的转义字符 常见字符ASCII码表...
ilqr算法原理推导及代码实践
目录 一. ilqr原理推导1.1 ilqr问题描述1.2 ilqr算法原理1.3 ilqr算法迭代过程 二. ilqr实践代码 一. ilqr原理推导 1.1 ilqr问题描述 本文参考知乎博主: LQR与iLQR:从理论到实践【详细】 基础LQR只能处理线性系统 (指可以使用 x ( k 1 ) A x ( k ) B u ( k )…...
系列1:基于Centos-8.6部署Kubernetes (1.24-1.30)
每日禅语 “木末芙蓉花,山中发红萼,涧户寂无人,纷纷开自落。”这是王维的一首诗,名叫《辛夷坞》。这首诗写的是在辛夷坞这个幽深的山谷里,辛夷花自开自落,平淡得很,既没有生的喜悦ÿ…...
finereport新的数据工厂插件使用场景一 通过accessToken获取数据
1 有两个接口,一个接口获取一个accessToken,一个接口根据accessToken来获取数据。代码示例为: @RequestMapping(value = {"df_test/getAccessToken"},method = {RequestMethod.GET})@ResponseBodypublic String getAccessToken(HttpServletRequest req, HttpServ…...
matlab绘图时设置左、右坐标轴为不同颜色
目录 一、需求描述 二、实现方法 一、需求描述 当图中存在两条曲线,需要对两条曲线进行分别描述时,应设置左、右坐标轴为不同颜色,并设置刻度线,且坐标轴颜色需要和曲线颜色相同。 二、实现方法 1.1、可以实现: 1…...
魏裕雄的JAVA学习总结
JAVA学习总结 Java面向对象程序设计知识总结第1章 初识Java与面向对象程序设计JAVA概述面向对象程序设计思想JAVA开发环境搭建第一个JAVA程序JAVA常用开发工具 第2章 Java编程基础变量与常量运算符与表达式选择结构循环结构方法数组JVM中的堆内存与栈内存 第3章 面向对象程序设…...
深度学习从入门到精通——图像分割实战DeeplabV3
DeeplabV3算法 参数配置关于数据集的配置训练集参数 数据预处理模块DataSet构建模块测试一下数据集去正则化模型加载模块DeepLABV3 参数配置 关于数据集的配置 parser argparse.ArgumentParser()# Datset Optionsparser.add_argument("--data_root", typestr, defa…...
SAP抓取外部https报错SSL handshake处理方法
一、问题描述 SAP执行报表抓取https第三方数据,数据获取失败。 报错消息: SSL handshake with XXX.COM:449 failed: SSSLERR_SSL_READ (-58)#SAPCRYPTO:SSL_read() failed##SapSSLSessionStartNB()==SSSLERR_SSL_READ# SSL:SSL_read() failed (536875120/0x20001070)# …...
Electron-Vue 开发下 dev/prod/webpack server各种路径设置汇总
背景 在实际开发中,我发现团队对于这几个路径的设置上是纯靠猜的,通过一点点地尝试来找到可行的路径,这是不应该的,我们应该很清晰地了解这几个概念,以下通过截图和代码进行细节讲解。 npm run dev 下的路径如何处理&…...
穷举vs暴搜vs深搜vs回溯vs剪枝专题一>全排列II
题目: 解析: 这题设计递归函数,主要把看如何剪枝 代码: class Solution {private List<List<Integer>> ret;private List<Integer> path;private boolean[] check;public List<List<Integer>> p…...
Nginx中Server块配置的详细解析
Nginx中Server块配置的详细解析 一、Server块简介 在Nginx配置文件中,server块是非常关键的部分。它用于定义虚拟主机,一个server块就代表一个虚拟主机。这使得我们可以在一台Nginx服务器上通过不同的配置来处理多个域名或者基于不同端口的服务请求。 …...
【后端面试总结】Redis的三种模式原理介绍及优缺点
Redis作为一款高性能的键值对数据库,提供了多种模式以满足不同场景下的需求。本文将详细介绍Redis的三种主要模式:主从复制模式、哨兵模式(Sentinel)和集群模式(Cluster),包括它们的原理、配置、…...
TCP协议详解
目录 一. TCP协议概述 1. 概念 2. 特点 (1) 面向连接 (2) 可靠传输 (3) 面向字节流 (4) 全双工通信 (5) 流量控制和拥塞控制 二. TCP协议报文格式 1. 源端口号 和 目的端口号 (16位) 2. 序号 和 确认序号 (32位) 3. 首部长度 (4位) 4. 保留位 (6位) 7. 控制位 8.…...
Webpack学习笔记(2)
1.什么是loader? 上图是Webpack打包简易流程,webpack本身只能理解js和json这样的文件,loader可以让webpack解析其他类型文件,并且将文件转换成模块供我们使用。 test识别出那些文件被转换,use定义转换时使用哪个loader转换 上图…...
【漏洞复现】Grafana 安全漏洞(CVE-2024-9264)
🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦 一、漏洞概述 1.1漏洞简介 漏洞名称:Grafana 安全漏洞 (CVE-2024-9264)漏洞编号:CVE-2024-9264 | CNNVD-202410-1891漏洞类型:命令注入、本地文件包含漏洞威胁等级:…...
C++实现最大字段和
又是一道非常基础且经典的动态规划题目:假设有一个整数序列,我们将连续的几个元素组成的序列称为子段,要求我们得出所有子段和中最大的一个~ 例如:{-2,11,-4,13,-5,-2},这一序列中&a…...
当我用影刀AI Power做了一个旅游攻略小助手
在线体验地址:旅游攻略小助手https://power.yingdao.com/assistant/ca1dfe1c-9451-450e-a5f1-d270e938a3ad/share 运行效果图展示: 话不多说一起看下效果图: 智能体的截图: 工作流截图: 搭建逻辑: 其实这…...
K8s HPA的常用功能介绍
Kubernetes 的 Horizontal Pod Autoscaler (HPA) 是一种自动扩展功能,用于根据资源使用情况(如 CPU、内存等)或自定义指标,动态调整 Pod 的副本数量,从而保证应用的性能和资源利用率。 以下是 HPA 的常用功能介绍&…...
web3跨链预言机协议-BandProtocol
项目简介 Band Protocol 项目最初于 2017年成立并建立在 ETH 之上。后于2020年转移到了 Cosmos 网络上,基于 Cosmos SDK 搭建了一条 Band Chain 。这是一条 oracle-specific chain,主要功能是提供跨链预言机服务。Cosmos生态上第一个,也是目…...
Python如何正确解决reCaptcha验证码(9)
前言 本文是该专栏的第73篇,后面会持续分享python爬虫干货知识,记得关注。 我们在处理某些国内外平台项目的时候,相信很多同学或多或少都见过,如下图所示的reCaptcha验证码。 而本文,笔者将重点来介绍在实战项目中,遇到上述中的“reCaptcha验证码”,如何正确去处理并解…...
电商数据采集电商,行业数据分析,平台数据获取|稳定的API接口数据
电商数据采集可以通过多种方式完成,其中包括人工采集、使用电商平台提供的API接口、以及利用爬虫技术等自动化工具。以下是一些常用的电商数据采集方法: 人工采集:人工采集主要是通过基本的“复制粘贴”的方式在电商平台上进行数据的收集&am…...
【java】Executor框架的组成部分
目录 1. 任务(Task)2. 执行器(Executor)3. 任务结果(Future)4. 线程池(ThreadPool)5. 任务队列(Work Queue)6. 线程工厂(Thread Factoryÿ…...
KMP算法基础
文章一览 前言一、核心思想二、实现步骤三、图解实现四、next数组的实现总结 前言 本栏目将讲解在学习过程中遇到的各种常用算法,深入浅出的讲解算法的用法与使用场景。 那么话不多说,让我们进入第一个算法KMP算法吧! 一、核心思想 KMP&am…...
C语言——实现百分制换算为等级分
问题描述:百分制换算为等级分 //百分制换算为等级分#include<stdio.h>void my_function(int x) {if(x>95 && x<100){printf("A");}else if(x>81 && x<94){printf("B");}else if(x>70 && x<8…...
@pytest.fixture() 跟 @pytest.fixture有区别吗?
在iOS UI 自动化工程里面最早我用的是pytest.fixture(),因为在pycharm中联想出来的fixture是带()的,后来偶然一次我没有带()发现也没有问题,于是详细查了一下pytest.fixture() 和 pytest.fixtur…...
docker run命令大全
docker run命令大全 基本语法常用选项基础选项资源限制网络配置存储卷和挂载环境变量重启策略其他高级选项示例总结docker run 命令是 Docker 中最常用和强大的命令之一,用于创建并启动一个新的容器。该命令支持多种选项和参数,可以满足各种使用场景的需求。以下是 docker ru…...
BootAnimation源码流程分析
BootAnimation流程 bootanimation源码位于frameworks/base/cmds/bootanimation,正如其名,主要功能是加载播放开机动画,是一个C程序,编译生成的可执行文件位于/system/bin 主要逻辑:解析系统路径下的bootanimation.zi…...
Vue前端开发-数据缓存
完成全局性的axios实例对象配置后,则可以在任意一个组件中直接调用这个对象,发送异步请求,获取服务端返回的数据,同时,针对那些不经常变化的数据,可以在请求过程中,进行数据缓存,并根…...
唯品会Android面试题及参考答案
HTTP 和 HTTPS 的区别是什么?你的项目使用的是 HTTP 还是 HTTPS? HTTP 和 HTTPS 主要有以下区别。 首先是安全性。HTTP 是超文本传输协议,数据传输是明文的,这意味着在数据传输过程中,信息很容易被窃取或者篡改。比如&…...
ARM CCA机密计算安全模型之固件启动
安全之安全(security)博客目录导读 目录 1、安全启动(Verified boot) 2、镜像格式和签名方案 3、防回滚 4、离线启动(Off-line boot) 5、CCA HES固件启动流程 6、CCA系统安全域启动过程 7、应用程序PE启动过程 8、稳健性 本节定义了将CCA固件引导至可证明状态的要…...
LeetCode:3376. 破解锁的最少时间 I(DFS回溯 Java)
目录 3376. 破解锁的最少时间 I 题目描述: 实现代码与解析: DFS 原理思路: 3376. 破解锁的最少时间 I 题目描述: Bob 被困在了一个地窖里,他需要破解 n 个锁才能逃出地窖,每一个锁都需要一定的 能量 …...
利用编程获得money?
在当今数字化时代,编程技能为人们开辟了众多赚钱途径。无论你是编程新手还是经验丰富的开发者,都能在广阔的市场中找到适合自己的盈利方式。以下是一份详细的用编程赚钱指南。 一、自由职业平台 像 Upwork、Freelancer 和 Fiverr 等知名自由职业平台&am…...
51c视觉~合集36
我自己的原文哦~ https://blog.51cto.com/whaosoft/12275223 #无监督盲超分算法MLMC 即插即用的解决方案 本文介绍了一种新的无监督盲超分辨率算法MLMC,该算法结合了元学习和马尔可夫链蒙特卡罗核估计,无需监督预训练或参数先验,即可实现…...
域名系统_域名展示出售系统 PC+H5 双端自适应页面
域名系统_域名展示出售系统 PCH5 双端自适应页面 PCH5 双端自适应页面 " 是一套专门用于域名展示和出售的系统源代码 它包含 PC 端和 H5 移动端两个版本,确保在不同设备上都能提供良好的用户体验 这套系统不仅具备基本的域名展示功能,还注重设计…...