MFC标签设计工具 图片控件上,移动鼠标显示图片控件内的鼠标xy的水平和垂直辅助线要在标签模板上加上文字、条型码、二维码 找准坐标和字体大小 源码

news/2024/5/11 4:34:17

需求:要在标签模板上加上文字、条型码、二维码 找准坐标和字体大小

我生成标签时,需要对齐和 调文字字体大小。这工具微调 能快速知道位置 和字体大小。
标签设计(点击图片,上下左右箭头移动 +或-调字体)

已经够用了,滚动条还没完全实现,如果能拖动文字、条型码、二维码到上面就更好了,就是有太多参数需要设置。
在这里插入图片描述

在MFC(Microsoft Foundation Classes)中,要实现在一个图片控件上移动鼠标时显示图片控件内鼠标位置的水平和垂直辅助线,你可以通过处理鼠标移动事件来绘制这些辅助线。以下是一个简化的示例,展示了如何在一个继承自CStatic的类中实现这个功能。

首先,你需要创建一个新的类,继承自CStatic,并在这个类中处理WM_MOUSEMOVE消息来绘制辅助线。

// PictureControl.h
#pragma once#include <afxwin.h>class CPictureControl : public CStatic
{
public:CPictureControl();virtual ~CPictureControl();protected:afx_msg void OnMouseMove(UINT nFlags, CPoint point);DECLARE_MESSAGE_MAP()void DrawCrossHair(CPoint point);
};

.cpp文件中,你需要实现OnMouseMoveDrawCrossHair方法。OnMouseMove方法会在鼠标移动时被调用,而DrawCrossHair方法用于在控件上绘制辅助线。

// PictureControl.cpp
#include "PictureControl.h"BEGIN_MESSAGE_MAP(CPictureControl, CStatic)ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()CPictureControl::CPictureControl()
{
}CPictureControl::~CPictureControl()
{
}void CPictureControl::OnMouseMove(UINT nFlags, CPoint point)
{CStatic::OnMouseMove(nFlags, point);// 绘制辅助线DrawCrossHair(point);
}void CPictureControl::DrawCrossHair(CPoint point)
{CDC* pDC = GetDC();CRect rect;GetClientRect(&rect);// 保存当前DC状态int nSavedDC = pDC->SaveDC();// 设置ROP模式为R2_NOT,这样可以用相同的操作来清除线条pDC->SetROP2(R2_NOT);// 绘制水平线pDC->MoveTo(0, point.y);pDC->LineTo(rect.right, point.y);// 绘制垂直线pDC->MoveTo(point.x, 0);pDC->LineTo(point.x, rect.bottom);// 恢复DC状态pDC->RestoreDC(nSavedDC);ReleaseDC(pDC);
}

最后,确保你的对话框或窗口中的图片控件使用了这个CPictureControl类。如果你是在对话框中使用,你可能需要在对话框的头文件中声明一个CPictureControl成员变量,并在对话框的OnInitDialog方法中将这个控件与实际的控件ID关联起来。

// 在对话框头文件中
CPictureControl m_picControl;// 在对话框的OnInitDialog方法中 
m_picControl.SubclassDlgItem(IDC_PICTURE_CONTROL, this);

请注意,这个示例仅提供了基本的实现框架。根据你的具体需求,你可能需要对代码进行调整,比如在绘制辅助线之前清除之前的线条,或者处理图片的缩放等问题。

最后绑定ID (m_picControl.SubclassDlgItem(IDC_PICTURE_CONTROL, this);)也可以这样

在这里插入图片描述

MFC调用自定义控件类OnMouseMove不响应

必须要将Notify设为True才行。
在这里插入图片描述

画出来了,但是没有清除鼠标移动前的所有辅助线痕迹

在这里插入图片描述

改成点击

必须要将Notify设为True才行。
在这里插入图片描述

// CDlgLableDesign.cpp: 实现文件
//#include "pch.h"
#include "afxdialogex.h"
#include "CDlgLableDesign.h"
#include "Resource.h"#define MAX_SCROLL_POS 2000typedef struct Para
{char templateName[200];LONG fontHeight=82;CPoint point;
}Para;
static Para para = {0};// CDlgLableDesign 对话框IMPLEMENT_DYNAMIC(CDlgLableDesign, CDialogEx)CDlgLableDesign::CDlgLableDesign(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_DIALOG_LabelDesign, pParent)
{}CDlgLableDesign::~CDlgLableDesign()
{
}void CDlgLableDesign::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_EDIT_LOG2, m_editDisplay);//DDX_Control(pDX, IDC_STATIC_IMAGE, m_pictureCtrl);
}BEGIN_MESSAGE_MAP(CDlgLableDesign, CDialogEx)ON_BN_CLICKED(IDC_BUTTON_PRINT_OUTBOX, &CDlgLableDesign::OnBnClickedButtonPrintOutbox)ON_WM_TIMER()
//	ON_WM_MOUSEMOVE()
//	ON_WM_PAINT()
ON_STN_CLICKED(IDC_STATIC_IMAGE, &CDlgLableDesign::OnClickedStaticImage)
//ON_WM_VSCROLL()
ON_WM_CLOSE()
END_MESSAGE_MAP()void CDlgLableDesign::Log(CString szInfo)
{logger.INFO_F(szInfo.GetBuffer(0));CString strInfo;m_editDisplay.GetWindowText(strInfo);int nLength = strInfo.GetLength();m_editDisplay.SetSel(nLength, nLength, FALSE);m_editDisplay.SetFocus();m_editDisplay.SetSel(-1, -1);m_editDisplay.ReplaceSel(szInfo + "\r\n");
}// CDlgLableDesign 消息处理程序
BOOL CDlgLableDesign::LoadImageToPictureControl(CString bmpPath)
{CStatic* pPictureControl = (CStatic*)GetDlgItem(IDC_STATIC_IMAGE);if (pPictureControl == nullptr || bmpPath.IsEmpty())return FALSE;// 加载图片CImage image;HRESULT hr = image.Load(bmpPath);if (FAILED(hr)){Log("加载图片失败"+ bmpPath);return FALSE;}// 获取图片大小int nWidth = image.GetWidth();int nHeight = image.GetHeight();//Log("宽高 "+CString(to_string(nWidth).c_str())+" * " + CString(to_string(nHeight).c_str()) +" 转为mm " + CString(to_string(nWidth* PixToMm600).c_str()) + " * " + CString(to_string(nHeight * PixToMm600).c_str()));// 调整控件大小以适应图片//CRect rect;//pPictureControl->GetWindowRect(&rect);pPictureControl->MoveWindow(208, 10, nWidth, nHeight);// 获取控件的DCCDC* pDC = pPictureControl->GetDC();if (pDC == nullptr)return FALSE;// 创建兼容DCCDC dcImage;if (!dcImage.CreateCompatibleDC(pDC))return FALSE;// 选择图片到DCCBitmap bmp;bmp.Attach(image.Detach());CBitmap* pOldBmp = dcImage.SelectObject(&bmp);// 将图片绘制到控件上pDC->BitBlt(0, 0, nWidth, nHeight, &dcImage, 0, 0, SRCCOPY);// 清理dcImage.SelectObject(pOldBmp);pPictureControl->ReleaseDC(pDC);//CImage image;//HRESULT hResult = image.Load(_T(bmpPath)); // 加载图片//if (SUCCEEDED(hResult))//{//	// 获取Picture Control的句柄//	CStatic* pPictureControl = (CStatic*)GetDlgItem(IDC_STATIC_IMAGE);//	// 获取控件大小//	CRect rect;//	pPictureControl->GetClientRect(&rect);//	int controlWidth = rect.Width();//	int controlHeight = rect.Height();//	// 获取图片原始尺寸//	int imageWidth = image.GetWidth();//	int imageHeight = image.GetHeight();//	// 创建兼容的DC//	CDC* pDC = pPictureControl->GetDC();//	CDC memDC;//	memDC.CreateCompatibleDC(pDC);//	// 创建兼容的位图,并选入内存DC//	CBitmap bmp;//	bmp.CreateCompatibleBitmap(pDC, controlWidth, controlHeight);//	CBitmap* pOldbmp = memDC.SelectObject(&bmp);//	// 清空背景//	memDC.FillSolidRect(&rect, pDC->GetBkColor());//	// 使用CImage绘制到内存DC,这里使用缩放//	image.Draw(memDC.m_hDC, 0, 0, controlWidth, controlHeight, 0, 0, imageWidth, imageHeight);//	// 将内存DC绘制到控件上//	pDC->BitBlt(0, 0, controlWidth, controlHeight, &memDC, 0, 0, SRCCOPY);//	// 清理//	memDC.SelectObject(pOldbmp);//	ReleaseDC(pDC);//}//else//{//	Log("图片加载失败:" + bmpPath);//}return TRUE;
}
BOOL ReadPara()
{CString DebugPara = "";GetPrivateProfileString("DEBUG", "DebugPara", "", DebugPara.GetBuffer(2000), 2000, configFileName); DebugPara.ReleaseBuffer();if (DebugPara.GetLength() > 0){utlStrToHex((BYTE*)&para, DebugPara.GetBuffer(), DebugPara.GetLength() / 2);return TRUE;}return FALSE;
}
BOOL WritePara()
{char DebugPara[4000] = {0};utlHexToStr(DebugPara, (BYTE*)&para, sizeof(para));if (WritePrivateProfileString("DEBUG", "DebugPara", DebugPara, configFileName)){return TRUE;}return FALSE;
}
BOOL CDlgLableDesign::OnInitDialog()
{CDialogEx::OnInitDialog();SetTimer(1, 100, NULL);ShowWindow(SW_MAXIMIZE);// 启用垂直滚动条SetScrollRange(SB_VERT, 0, MAX_SCROLL_POS); // 假设滚动范围是0到200//log位置自动长度CRect rect;GetDlgItem(IDC_EDIT_LOG2)->GetWindowRect(&rect);GetClientRect(&rect);rect.left = 8;rect.top = 70;rect.right = 8+195;rect.bottom = rect.bottom -10;GetDlgItem(IDC_EDIT_LOG2)->MoveWindow(&rect);return TRUE;  // return TRUE unless you set the focus to a control// 异常: OCX 属性页应返回 FALSE
}void CDlgLableDesign::OnBnClickedButtonPrintOutbox()
{CFileDialog fileDlg(TRUE, _T("bmp"), NULL, OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, _T("Bitmap Files (*.bmp)|*.bmp||"));if (fileDlg.DoModal() == IDOK){memset((char*) & para, 0, sizeof(para));memcpy(para.templateName, fileDlg.GetPathName().GetBuffer(), fileDlg.GetPathName().GetLength());WritePara();Log("加载模板:" + CString(para.templateName));LoadImageToPictureControl(para.templateName); // 加载图片}}void CDlgLableDesign::OnTimer(UINT_PTR nIDEvent)
{// TODO: 在此添加消息处理程序代码和/或调用默认值if (nIDEvent == 1){if (ReadPara()){if (strlen(para.templateName) > 0){Log("加载模板:" + CString(para.templateName));LoadImageToPictureControl(para.templateName); // 加载图片}}KillTimer(1); // 销毁定时器}CDialogEx::OnTimer(nIDEvent);
}//void CDlgLableDesign::OnMouseMove(UINT nFlags, CPoint point)
//{// TODO: 在此添加消息处理程序代码和/或调用默认值// 获取图片控件的位置和大小
//	CRect rect;
//	CStatic* pPictureControl = (CStatic*)GetDlgItem(IDC_STATIC_IMAGE);
//	pPictureControl->GetWindowRect(&rect);
//	ScreenToClient(&rect);
//// 计算鼠标相对于图片控件的坐标
//	int x = point.x - rect.left;
//	int y = point.y - rect.top;
//// 在log中输出坐标
//	CString str;
//	str.Format(_T("x: %d, y: %d"), x, y);
//
//
//// 判断点是否在矩形内
//	if (rect.PtInRect(point)) { 获取鼠标的当前位置//CPoint mousePos = point; 绘制水平和垂直辅助线//CClientDC dc(this);//CPen pen(PS_SOLID, 1, RGB(255, 0, 0)); // 红色辅助线//dc.SelectObject(&pen);//dc.MoveTo(mousePos.x, 0);//dc.LineTo(mousePos.x, rect.Height());//dc.MoveTo(0, mousePos.y);//dc.LineTo(rect.Width(), mousePos.y); 重绘图片控件//Invalidate();//CClientDC dc(this); 设置字体//CFont font;//font.CreatePointFont(100, _T("Arial"), &dc);//CFont* pOldFont = dc.SelectObject(&font); 使用TextOut函数在鼠标位置下方绘制文本//dc.TextOut(point.x, point.y + 20, str); 清除原来的文本CRect rect;GetClientRect(&rect);InvalidateRect(rect); 恢复原始字体//dc.SelectObject(pOldFont);Invalidate();
//	}//Log(str);
//	CDialogEx::OnMouseMove(nFlags, point);
//}void CDlgLableDesign::OnClickedStaticImage()
{::GetCursorPos(&para.point); // 获取当前鼠标位置ScreenToClient(&para.point); // 将屏幕坐标转换为窗口坐标ShowImage();
}
void CDlgLableDesign::ShowImage()
{LoadImageToPictureControl(para.templateName); // 加载图片// 获取图片控件的位置和大小CRect rect;CStatic* pPictureControl = (CStatic*)GetDlgItem(IDC_STATIC_IMAGE);pPictureControl->GetWindowRect(&rect);// 获取控件位置ScreenToClient(&rect); // 将屏幕坐标转换为窗口坐标// 计算鼠标相对于图片控件的坐标int x = para.point.x - rect.left;int y = para.point.y - rect.top;// 在log中输出坐标CString str;str.Format(_T("%d, %d "), x, y);Log(str);SetClipboard(str);//画辅助线CDC* pDC = GetDC();//CRect rect;//GetClientRect(&rect);// 保存当前DC状态int nSavedDC = pDC->SaveDC();DrawSomething(pDC, para.point.x, para.point.y);  //画一些别的东西// 设置ROP模式为R2_NOT,这样可以用相同的操作来清除线条//pDC->SetROP2(R2_NOT);CPen redPen;redPen.CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); // 1像素宽的实线,红色// 保存旧的画笔CPen* pOldPen = pDC->SelectObject(&redPen);// 绘制水平线pDC->MoveTo(rect.left, para.point.y);pDC->LineTo(rect.right, para.point.y);// 绘制垂直线pDC->MoveTo(para.point.x, rect.top);pDC->LineTo(para.point.x, rect.bottom);// 恢复旧的画笔pDC->SelectObject(pOldPen);// 恢复DC状态pDC->RestoreDC(nSavedDC);ReleaseDC(pDC);
}
BOOL CDlgLableDesign::DrawSomething(CDC* pDC,int x,int y)
{// 设置字体CFont font;LOGFONT lf;memset(&lf, 0, sizeof(LOGFONT));lf.lfHeight = para.fontHeight; // 字体大小lf.lfWeight = FW_HEAVY; // 加粗_tcscpy_s(lf.lfFaceName, ("黑体")); // 字体名称font.CreateFontIndirect(&lf);//font.CreatePointFont(240, "Arial", NULL);CFont* pOldFont = pDC->SelectObject(&font);SetBkMode(pDC->m_hDC, TRANSPARENT);pDC->TextOut(x, y, _T("DEV1"));pDC->SelectObject(pOldFont);return TRUE;
}BOOL CDlgLableDesign::PreTranslateMessage(MSG* pMsg)
{if (pMsg->message == WM_KEYDOWN){switch (pMsg->wParam){case VK_LEFT:para.point.x--;ShowImage();break;case VK_RIGHT:para.point.x++;ShowImage();break;case VK_UP:para.point.y--;ShowImage();break;case VK_DOWN:para.point.y++;ShowImage();break;case VK_PRIOR:case VK_OEM_MINUS:case VK_SUBTRACT:para.fontHeight--;Log("字高:"+ CString(to_string(para.fontHeight).c_str()));ShowImage();break;case VK_NEXT:case VK_OEM_PLUS:case VK_ADD:para.fontHeight++;Log("字高:" + CString(to_string(para.fontHeight).c_str()));ShowImage();break;default:break;}return TRUE;}return CDialogEx::PreTranslateMessage(pMsg);
}void CDlgLableDesign::OnClose()
{WritePara();CDialogEx::OnClose();
}
#pragma once
#include "afxdialogex.h"// CDlgLableDesign 对话框class CDlgLableDesign : public CDialogEx
{DECLARE_DYNAMIC(CDlgLableDesign)public:CDlgLableDesign(CWnd* pParent = nullptr);   // 标准构造函数virtual ~CDlgLableDesign();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_DIALOG_LabelDesign };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持DECLARE_MESSAGE_MAP()
public:virtual BOOL OnInitDialog();afx_msg void OnBnClickedButtonPrintOutbox();afx_msg void OnTimer(UINT_PTR nIDEvent);//	afx_msg void OnMouseMove(UINT nFlags, CPoint point);
//	afx_msg void OnPaint();
public:CEdit m_editDisplay;void Log(CString szInfo);BOOL CDlgLableDesign::DrawSomething(CDC* pDC, int x, int y);void CDlgLableDesign::ShowImage();BOOL LoadImageToPictureControl(CString pic);// 在对话框头文件中afx_msg void OnClickedStaticImage();
//	afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);virtual BOOL PreTranslateMessage(MSG* pMsg);afx_msg void OnClose();
};

http://www.mrgr.cn/p/36743362

相关文章

mac-git上传至github(ssh版本,个人tokens总出错)

第一步 git clone https://github.com/用户名/项目名.git 第二步 cd 项目名 第三步 将本地的文件移动到项目下 第四步 git add . 第五步 git commit -m "添加****文件夹" 第六步 git push origin main 报错&#xff1a; 采用ssh验证 本地文件链接公钥 …

循序渐进丨MogDB 对 Oracle DBLink兼容性增强

本特性自 MogDB 5.0.0版本开始引入&#xff0c;支持 Oracle DBLink语法&#xff0c;可以使用符号访问 Oracle 数据库中的表。 示 例 01 环境准备 MogDB 环境 已安装 MogDB 数据库。已安装oracle_fdw插件&#xff0c;具体安装方法参见oracle_fdw安装文档https://docs.mogdb.io/…

flask各种版本的项目,终端命令运行方式的实现

目录 写在前面 一、Flask项目的基本结构 二、使用终端命令运行Flask项目 1. 安装Flask 2. 创建Flask应用 3. 配置FLASK_APP环境变量 4. 运行Flask应用 5. 访问Flask应用 三、Flask CLI的其他功能 1. 创建Flask应用 2. 运行开发服务器 3. 清理缓存文件 4. 运行单元…

45.跳跃游戏||

// 定义一个名为Solution的类 class Solution {// 定义一个public方法jump&#xff0c;输入参数为一个整数数组nums&#xff0c;返回值类型为整数public int jump(int[] nums) {// 初始化跳跃次数结果变量为0int result 0;// 初始化当前覆盖的最远距离下标为0int end 0;// 初…

打造新质生产力,亚信科技2024年如何行稳致远?

引言&#xff1a;不冒进、不激进&#xff0c;稳扎稳打&#xff0c; 一个行业一个行业地深度拓展。 【全球云观察 &#xff5c; 科技热点关注】 基于以往“一巩固、三发展”的多年业务战略&#xff0c;亚信科技正在落实向非通信行业、标准产品、软硬一体产品和国际市场的“四…

git clone 后如何 checkout 到 remote branch

what/why 通常情况使用git clone github_repository_address下载下来的仓库使用git branch查看当前所有分支时只能看到master分支&#xff0c;但是想要切换到其他分支进行工作怎么办❓ 其实使用git clone下载的repository没那么简单&#x1f625;&#xff0c;clone得到的是仓库…

自营商城私域商城的选品上货如何借助API实现自动化商品采集商品搜索无货源?

商业智能时代的来临&#xff0c;在线化、网络化、智能化、企业与用户的颗粒度越来越细&#xff0c;满足每个人的个性化要求也是未来商业的重要特征&#xff01;马云曾经说过&#xff0c;未来的核心资源是数据&#xff0c;数据将成为一家企业动力源&#xff0c;而这一切的基础都…

重塑未来:Web3如何改变我们的数字生活

引言 随着科技的飞速发展&#xff0c;Web3已经成为数字时代的新潮流&#xff0c;其革命性的变革正在渐渐改变着我们的数字生活。本文将深入探讨Web3如何改变我们的数字生活&#xff0c;涉及其意义、应用场景、对未来的影响&#xff0c;以及我们如何适应这一变革&#xff0c;为…

Si24R2F+2.4GHz ISM 频段低功耗无线集成嵌入式发射基带无线

Si24R2F在原有Si24R2F的基础上&#xff1a;优化了射频性能、增加NTC测温、增加自动唤醒间隔、优化了蓝牙性能。在固定资产管理、冷链物流和牛羊畜牧业标签市场更具竞争力。 在原有SI24R2E做白卡/校徽的群体&#xff0c;在新的卡片机应用&#xff0c;更加推荐用SI24R2F&#xff…

学习可视化比较好用的网站Apache ECharts

Apache ECharts 是一个基于 JavaScript 的开源可视化图表库&#xff0c;它提供了直观、交互丰富且可高度个性化定制的数据可视化图表。这个库最初由百度团队开源&#xff0c;并在 2018 年初捐赠给了 Apache 基金会&#xff0c;成为 ASF 的孵化级项目。在 2021 年 1 月 26 日&am…

DHCP的使用。

打开服务管理器&#xff0c;点击方框中的添加角色和功能。 点击下一步。 点击下一步。 点击下一步。 将DHCP服务器勾选上&#xff0c;点击下一步。 点击下一步。 点击下一步。 点击安装。 等待安装。 点击箭头所指处。 点击&#xff0c;点击完成DHCP配置。 点击提交。 点击DHCP…

【C++入门】 初见,单推,与C++的第一次约会

关注小庄 顿顿解馋(ᕑᗢᓫ∗)˒ 引言&#xff1a;本篇博客我们开始与C的第一次约会&#xff0c;C是兼容c的&#xff0c;本篇博客我们将了解到C关键字有哪些&#xff0c;C命名空间&#xff0c;C输入与输出和缺省参数的内容&#xff0c;请放心食用 ~ 文章目录 一 &#x1f3e0; C…

【论文速读】| 对大语言模型解决攻击性安全挑战的实证评估

本次分享论文为&#xff1a;An Empirical Evaluation of LLMs for Solving Offensive Security Challenges 基本信息 原文作者&#xff1a;Minghao Shao, Boyuan Chen, Sofija Jancheska, Brendan Dolan-Gavitt, Siddharth Garg, Ramesh Karri, Muhammad Shafique 作者单位&a…

【Selenium】隐藏元素的定位和操作|隐藏与isDisplay方法

一、selenium 中隐藏元素如何定位&#xff1f; 如果单纯的定位的话&#xff0c;隐藏元素和普通不隐藏元素定位没啥区别&#xff0c;用正常定位方法就行了 但是吧~~~能定位到并不意味着能操作元素&#xff08;如click,clear,send_keys&#xff09; 二、隐藏元素 如下图有个输入框…

【搜索引擎2】实现API方式调用ElasticSearch8接口

1、理解ElasticSearch各名词含义 ElasticSearch对比Mysql Mysql数据库Elastic SearchDatabase7.X版本前有Type&#xff0c;对比数据库中的表&#xff0c;新版取消了TableIndexRowDocumentColumnmapping Elasticsearch是使用Java开发的&#xff0c;8.1版本的ES需要JDK17及以上…

Amazon SageMaker + Stable Diffusion 搭建文本生成图像模型

如果我们的计算机视觉系统要真正理解视觉世界&#xff0c;它们不仅必须能够识别图像&#xff0c;而且必须能够生成图像。文本到图像的 AI 模型仅根据简单的文字输入就可以生成图像。 近两年&#xff0c;以ChatGPT为代表的AIGC技术崭露头角&#xff0c;逐渐从学术研究的象牙塔迈…

回文子串 每日温度 接雨水

647. 回文子串 力扣题目链接 如果s【i】和s【j】相同 dp【i1】【j-1】也是回文串的话 &#xff08;等于true&#xff09; 那么dp【i】【j】也是回文串 true 定义一个bool二维数组 遍历顺序是从下到上 从左到右 因为dp【i】【j】是通过dp【i1】【j-1】推出来的 i从最后一…

CI/CD实战-jenkins部署 3

安装 软件下载地址&#xff1a;Index of /jenkins/redhat/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 启动服务 安装推荐插件 不新建用户&#xff0c;使用admin账号登录 修改一下初始密码 新建项目测试 安装git命令 生成密钥 在gitlab中上传公钥 修改ssh 创建中…

AQS源码分析

前言 AbstractQueuedSynchronizer是抽象同步队列&#xff0c;其是实现同步机器的基础组件&#xff0c;并发包中的锁的底层就是使用AQS实现的。AQS中 维护了一个volatile int state&#xff08;代表共享资源&#xff09;和一个FIFO线程等待队列&#xff08;多线程争用资源被阻塞…

培训机构必备,乔拓云教育系统助你快速上线移动学员端口

在当今数字化时代&#xff0c;自媒体平台已经成为人们获取信息、学习新知识的重要渠道。而对于培训机构而言&#xff0c;如何有效利用这些平台&#xff0c;将优质课程推广给更多学员&#xff0c;成为了一个亟待解决的问题。现在&#xff0c;乔拓云教育系统为你提供了一个全新的…