CTreeCtrl自绘

CSWTreeCtrl.h)

#pragma once#define _OWNER_DRAWN_TREE  // 自绘CTreeCtrl,可支持背景图片显示功能class CSWTreeCtrl : public CTreeCtrl
{DECLARE_DYNAMIC(CSWTreeCtrl)// 成员私有结构定义// 构造/析构函数
public:CSWTreeCtrl();virtual ~CSWTreeCtrl();// 私有成员变量
private:// 私有成员函数
private:void CommonConstruct(); // 初始化// 受保护成员变量
protected:int m_nFirstColumnWidth; // 第一列宽度int m_nOffsetX;      	 // 相对于父窗体X偏移量LVBKIMAGE m_bkImage;	 // 背景图片CImageList m_imgBtns;	 // 数控件展开的+/-图标符号// 受保护成员函数
protected:BOOL CheckHit(CPoint point);
#ifdef _OWNER_DRAWN_TREELRESULT CustomDrawNotify(LPNMTVCUSTOMDRAW lpNMTVCustomDraw);void OwnerDrawBackground(CDC* pDC);
#endif //_OWNER_DRAWN_TREE// 虚函数
protected:// 消息函数
protected:DECLARE_MESSAGE_MAP()afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);afx_msg void OnMouseMove(UINT nFlags, CPoint point);afx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);afx_msg void OnPaint();afx_msg void OnTimer(UINT_PTR nIDEvent);afx_msg BOOL OnEraseBkgnd(CDC* pDC);
#ifdef _OWNER_DRAWN_TREEafx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar *pScrollBar);
#endif //_OWNER_DRAWN_TREE// 共有成员变量
public:// 共有成员函数
public:// 获取背景图片BOOL GetBkImage(LVBKIMAGE* plvbkImage) const;// 设置背景图片BOOL SetBkImage(LVBKIMAGE* plvbkImage);#ifdef _OWNER_DRAWN_TREE// 设置树控件+/-按钮图标void SetTreeBtnBitmap(CBitmap* pBitmap, COLORREF clrMask = RGB(255, 0, 255));
#endif //_OWNER_DRAWN_TREE// 静态成员变量
public:// 静态成员函数
public:};

实现

#include "stdafx.h"
#include <shlwapi.h>
#include "CSWTreeCtrl.h"// IE 5.0 or higher required
#ifndef TVS_NOHSCROLL
#error CSWTreeCtrl requires IE 5.0 or higher; _WIN32_IE should be greater than 0x500.
#endif// 绘画树控件横向节点连接虚线
static void _DotHLine(HDC hdc, LONG x, LONG y, LONG w, COLORREF cr)
{for (; w > 0; w -= 2, x += 2)SetPixel(hdc, x, y, cr);
}// 绘画树控件竖向节点连接虚线
static void _DotVLine(HDC hdc, LONG x, LONG y, LONG w, COLORREF cr)
{for (; w > 0; w -= 2, y += 2)SetPixel(hdc, x, y, cr);
}IMPLEMENT_DYNAMIC(CSWTreeCtrl, CTreeCtrl)
CSWTreeCtrl::CSWTreeCtrl()
{CommonConstruct();
}CSWTreeCtrl::~CSWTreeCtrl()
{
}BEGIN_MESSAGE_MAP(CSWTreeCtrl, CTreeCtrl)ON_WM_MOUSEMOVE()ON_WM_LBUTTONDOWN()ON_WM_LBUTTONDBLCLK()ON_WM_PAINT()ON_WM_ERASEBKGND()ON_WM_VSCROLL()ON_WM_MOUSEWHEEL()ON_WM_KEYDOWN()
END_MESSAGE_MAP()void CSWTreeCtrl::CommonConstruct()
{
#ifdef _OWNER_DRAWN_TREE m_bkImage.hbm = NULL;m_bkImage.xOffsetPercent = 0;m_bkImage.yOffsetPercent = 0;
#endif //_OWNER_DRAWN_TREE
}#ifdef _OWNER_DRAWN_TREE
// 设置树控件+/-按钮图标
void CSWTreeCtrl::SetTreeBtnBitmap(CBitmap* pBitmap, COLORREF clrMask)
{ASSERT(pBitmap);if (pBitmap && pBitmap->GetSafeHandle()){m_imgBtns.Add(pBitmap, clrMask);BITMAP bmp;pBitmap->GetBitmap(&bmp);if (m_imgBtns.GetSafeHandle())m_imgBtns.DeleteImageList();m_imgBtns.Create(bmp.bmWidth / 2, bmp.bmHeight, ILC_COLOR32 | ILC_MASK, 2, 1);}
}
#endif //_OWNER_DRAWN_TREEBOOL CSWTreeCtrl::GetBkImage(LVBKIMAGE* plvbkImage) const
{memcpy(plvbkImage, &m_bkImage, sizeof(LVBKIMAGE));return TRUE;
}BOOL CSWTreeCtrl::SetBkImage(LVBKIMAGE* plvbkImage)
{memcpy(&m_bkImage, plvbkImage, sizeof(LVBKIMAGE));Invalidate();return TRUE;
}void CSWTreeCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{Invalidate();CTreeCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
}void CSWTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{if (CheckHit(point)){HTREEITEM hItem = HitTest(point);if (hItem){
#ifdef _OWNER_DRAWN_TREECRect rcItem, rcClient;GetClientRect(&rcClient);GetItemRect(hItem, &rcItem, FALSE);if (rcItem.bottom > rcClient.bottom){Invalidate();EnsureVisible(hItem);SelectItem(hItem);return;}
#endif //_OWNER_DRAWN_TREESelectItem(hItem);}CTreeCtrl::OnLButtonDown(nFlags, point);}else{SetFocus();}
}void CSWTreeCtrl::OnLButtonDblClk(UINT nFlags, CPoint point)
{if (CheckHit(point)){HTREEITEM hItem = HitTest(point);if (hItem){
#ifdef _OWNER_DRAWN_TREECRect rcItem, rcClient;GetClientRect(&rcClient);GetItemRect(hItem, &rcItem, FALSE);if (rcItem.bottom > rcClient.bottom){Invalidate();CTreeCtrl::OnLButtonDown(nFlags, point);return;}
#endif //_OWNER_DRAWN_TREESelectItem(hItem);}CTreeCtrl::OnLButtonDblClk(nFlags, point);}else{SetFocus();}
}void CSWTreeCtrl::OnMouseMove(UINT nFlags, CPoint point)
{if (CheckHit(point)){CTreeCtrl::OnMouseMove(nFlags, point);}
}#ifdef _OWNER_DRAWN_TREE
LRESULT CSWTreeCtrl::CustomDrawNotify(LPNMTVCUSTOMDRAW lpNMTVCustomDraw)
{lpNMTVCustomDraw->nmcd.hdr.hwndFrom = GetSafeHwnd();lpNMTVCustomDraw->nmcd.hdr.code = NM_CUSTOMDRAW;lpNMTVCustomDraw->nmcd.hdr.idFrom = GetWindowLong(m_hWnd, GWL_ID);return GetParent()->SendMessage(WM_NOTIFY, (WPARAM)0, (LPARAM)lpNMTVCustomDraw);
}void CSWTreeCtrl::OwnerDrawBackground(CDC* pDC)
{NMTVCUSTOMDRAW stuNMTVCustomDraw;DWORD dwFlags;DWORD dwRet;CRect rcClient;GetClientRect(&rcClient);memset(&stuNMTVCustomDraw, 0, sizeof(NMTVCUSTOMDRAW));stuNMTVCustomDraw.nmcd.dwDrawStage = CDDS_PREPAINT;stuNMTVCustomDraw.nmcd.hdc = pDC->m_hDC;stuNMTVCustomDraw.nmcd.rc = rcClient;dwFlags = (DWORD)CustomDrawNotify(&stuNMTVCustomDraw); // CDDS_PREPAINT// 填充背景色COLORREF crBkgnd = IsWindowEnabled() ? pDC->GetBkColor() : GetSysColor(COLOR_BTNFACE);pDC->FillSolidRect(rcClient, crBkgnd);if (m_bkImage.hbm && IsWindowEnabled()){// 画背景图片int xOffset = m_nOffsetX;int yOffset = rcClient.left;int yHeight = rcClient.Height();SCROLLINFO srlInfo;if (GetScrollInfo(SB_VERT, &srlInfo, SIF_POS | SIF_RANGE)){yOffset = -srlInfo.nPos;yHeight = max(srlInfo.nMax + 1, rcClient.Height());}CDC dcMem;dcMem.CreateCompatibleDC(pDC);BITMAP bmp;::GetObject(m_bkImage.hbm, sizeof(BITMAP), &bmp);CBitmap* pOldBitmap =dcMem.SelectObject(CBitmap::FromHandle(m_bkImage.hbm));// copy the background bitmap from temporary DC to painting DCfloat x = (float)m_bkImage.xOffsetPercent / 100 * (float)rcClient.Width();float y = (float)m_bkImage.yOffsetPercent / 100 * (float)rcClient.Height();pDC->BitBlt(/*xOffset*/+(int)x,/*yOffset+*/(int)y,bmp.bmWidth, bmp.bmHeight, &dcMem, 0, 0, SRCCOPY);dcMem.SelectObject(pOldBitmap);}if (dwFlags&CDRF_NOTIFYPOSTERASE){stuNMTVCustomDraw.nmcd.dwDrawStage = CDDS_POSTERASE;dwRet = (DWORD)CustomDrawNotify(&stuNMTVCustomDraw); // CDDS_POSTERASE}CFont* pOldFont = pDC->SelectObject(GetFont());CImageList* pstateList = GetImageList(TVSIL_STATE);CImageList* pimgList = GetImageList(TVSIL_NORMAL);CSize szIcon, szStateImg;if (pimgList){IMAGEINFO ii;if (pimgList->GetImageInfo(0, &ii))szIcon = CSize(ii.rcImage.right - ii.rcImage.left, ii.rcImage.bottom - ii.rcImage.top);}if (pstateList){IMAGEINFO ii;if (pstateList->GetImageInfo(0, &ii))szStateImg = CSize(ii.rcImage.right - ii.rcImage.left, ii.rcImage.bottom - ii.rcImage.top);}// 开始画树节点HTREEITEM hItem = GetFirstVisibleItem();while (hItem){int nOldBkMode = pDC->SetBkMode(TRANSPARENT);DWORD dwStyle = GetStyle();DWORD dwState = GetItemState(hItem, 0xFFFF);BOOL bEnabled = IsWindowEnabled();BOOL bSelected = dwState & TVIS_SELECTED;BOOL bHasFocus = (GetFocus() && GetFocus()->m_hWnd == m_hWnd) ? TRUE : FALSE;// 更新NMCUSTOMDRAW结果内容stuNMTVCustomDraw.nmcd.dwItemSpec = (DWORD_PTR)hItem;if (bEnabled){if (bHasFocus){stuNMTVCustomDraw.clrTextBk = bSelected ? GetSysColor(COLOR_HIGHLIGHT) : crBkgnd;stuNMTVCustomDraw.clrText = ::GetSysColor(bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT);stuNMTVCustomDraw.nmcd.uItemState = dwState | (bSelected ? CDIS_FOCUS : 0);}else{if (GetStyle()&TVS_SHOWSELALWAYS){stuNMTVCustomDraw.clrTextBk = bSelected ? GetSysColor(COLOR_INACTIVEBORDER) : crBkgnd;stuNMTVCustomDraw.clrText = ::GetSysColor(COLOR_MENUTEXT);}else{stuNMTVCustomDraw.clrTextBk = crBkgnd;stuNMTVCustomDraw.clrText = ::GetSysColor(COLOR_MENUTEXT);}}}else{stuNMTVCustomDraw.clrTextBk = bSelected ? GetSysColor(COLOR_BTNSHADOW) : crBkgnd;stuNMTVCustomDraw.clrText = ::GetSysColor(COLOR_GRAYTEXT);}GetItemRect(hItem, &stuNMTVCustomDraw.nmcd.rc, 0);CRgn rgn;rgn.CreateRectRgn(stuNMTVCustomDraw.nmcd.rc.left, stuNMTVCustomDraw.nmcd.rc.top, stuNMTVCustomDraw.nmcd.rc.left + m_nFirstColumnWidth, stuNMTVCustomDraw.nmcd.rc.bottom);pDC->SelectClipRgn(&rgn);dwRet = CDRF_DODEFAULT;if (dwFlags&CDRF_NOTIFYITEMDRAW){stuNMTVCustomDraw.nmcd.dwDrawStage = CDDS_ITEMPREPAINT;dwRet = (DWORD)CustomDrawNotify(&stuNMTVCustomDraw); // CDDS_ITEMPREPAINT}if (!(dwFlags&CDRF_SKIPDEFAULT)){// 画树节点图标和+/-按钮CRect rcItem;int nImage, nSelImage;GetItemRect(hItem, &rcItem, TRUE);GetItemImage(hItem, nImage, nSelImage);int x = rcItem.left - 3;int yCenterItem = rcItem.top + (rcItem.bottom - rcItem.top) / 2;if (pimgList){int nImageIndex = dwState & TVIS_SELECTED ? nImage : nSelImage;x -= szIcon.cx + 1;pimgList->Draw(pDC, nImageIndex, CPoint(x, yCenterItem - szIcon.cy / 2), ILD_TRANSPARENT);}if (GetStyle()&TVS_CHECKBOXES && pstateList != NULL){DWORD dwStateImg = GetItemState(hItem, TVIS_STATEIMAGEMASK) >> 12;x -= szStateImg.cx;pstateList->Draw(pDC, dwStateImg, CPoint(x, yCenterItem - szStateImg.cy / 2), ILD_TRANSPARENT);}if (dwStyle&TVS_HASLINES){CPen pen;pen.CreatePen(PS_DOT, 1, GetLineColor());CPen* pOldPen = pDC->SelectObject(&pen);HTREEITEM hItemParent = GetParentItem(hItem);if (hItemParent != NULL || dwStyle & TVS_LINESATROOT){_DotHLine(pDC->m_hDC, x - szIcon.cx / 2 - 2, yCenterItem, szIcon.cx / 2 + 2, RGB(128, 128, 128));}if (hItemParent != NULL || dwStyle & TVS_LINESATROOT && GetPrevSiblingItem(hItem) != NULL){_DotVLine(pDC->m_hDC, x - szIcon.cx / 2 - 2, rcItem.top,yCenterItem - rcItem.top, RGB(128, 128, 128));}if (GetNextSiblingItem(hItem) != NULL){_DotVLine(pDC->m_hDC, x - szIcon.cx / 2 - 2, yCenterItem,rcItem.bottom - yCenterItem, RGB(128, 128, 128));}int x1 = x - szIcon.cx / 2 - 2;while (hItemParent != NULL){x1 -= szIcon.cx + 3;if (GetNextSiblingItem(hItemParent) != NULL){_DotVLine(pDC->m_hDC, x1, rcItem.top, rcItem.Height(), RGB(128, 128, 128));}hItemParent = GetParentItem(hItemParent);}pDC->SelectObject(pOldPen);}if (dwStyle&TVS_HASBUTTONS && ItemHasChildren(hItem)){// 画+/-符号按钮int nImg = GetItemState(hItem, TVIF_STATE) & TVIS_EXPANDED ? 1 : 0;m_imgBtns.Draw(pDC, nImg, CPoint(x - szIcon.cx / 2 - 6, yCenterItem - 4),	ILD_TRANSPARENT);}}pDC->SelectClipRgn(NULL);if (dwRet&CDRF_NOTIFYPOSTPAINT){stuNMTVCustomDraw.nmcd.dwDrawStage = CDDS_ITEMPOSTPAINT;dwRet = (DWORD)CustomDrawNotify(&stuNMTVCustomDraw); // CDDS_ITEMPOSTPAINT}pDC->SetBkMode(nOldBkMode);hItem = GetNextVisibleItem(hItem);};pDC->SelectObject(pOldFont);
}BOOL CSWTreeCtrl::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{Invalidate();return CTreeCtrl::OnMouseWheel(nFlags, zDelta, pt);
}void CSWTreeCtrl::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar *pScrollBar)
{Invalidate();CTreeCtrl::OnVScroll(nSBCode, nPos, pScrollBar);
}
#endif //_OWNER_DRAWN_TREEvoid CSWTreeCtrl::OnPaint()
{CRect rcClient;GetClientRect(&rcClient);CPaintDC dc(this);CDC dcMem;CBitmap bmpMem;dcMem.CreateCompatibleDC(&dc);if (bmpMem.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height())){CBitmap* pOldBmp = dcMem.SelectObject(&bmpMem);
#ifdef _OWNER_DRAWN_TREE	// if owner-drawnOwnerDrawBackground(&dcMem);	// use our code
#else						// else use standard codeCWnd::DefWindowProc(WM_PAINT, (WPARAM)dcMem.m_hDC, 0);
#endif //_OWNER_DRAWN_TREEdc.BitBlt(0, 0, rcClient.right, rcClient.bottom, &dcMem, 0, 0, SRCCOPY);dcMem.SelectObject(pOldBmp);bmpMem.DeleteObject();}dcMem.DeleteDC();
}BOOL CSWTreeCtrl::OnEraseBkgnd(CDC* pDC)
{return TRUE;
}BOOL CSWTreeCtrl::CheckHit(CPoint point)
{UINT fFlags;HTREEITEM hItem = HitTest(point, &fFlags);CRect rcItem, rcClient;GetClientRect(rcClient);GetItemRect(hItem, &rcItem, TRUE);if (fFlags & TVHT_ONITEMICON ||fFlags & TVHT_ONITEMBUTTON ||fFlags & TVHT_ONITEMSTATEICON)return TRUE;if (GetStyle()&TVS_FULLROWSELECT){rcItem.right = rcClient.right;if (rcItem.PtInRect(point))return TRUE;return FALSE;}if (fFlags & TVHT_ONITEMLABEL){rcItem.right = m_nFirstColumnWidth;if (!rcItem.PtInRect(point))return FALSE;CString strSub;AfxExtractSubString(strSub, GetItemText(hItem), 0, '\t');CDC* pDC = GetDC();pDC->SelectObject(GetFont());rcItem.right = rcItem.left + pDC->GetTextExtent(strSub).cx + 6;ReleaseDC(pDC);if (!rcItem.PtInRect(point))return FALSE;return TRUE;}return FALSE;
}

根据节点关联数据值,采用递归算法查找指定节点。

HTREEITEM findTreeItem(CTreeCtrl& treeCtrl, HTREEITEM hItem, DWORD dwData) {if (treeCtrl.GetItemData(hItem) == dwData)return hItem;if (treeCtrl.ItemHasChildren(hItem)) {HTREEITEM hChild = treeCtrl.GetChildItem(hItem);HTREEITEM hFindItem = findTreeItem(treeCtrl, hChild, dwData);if (hFindItem != NULL)return hFindItem;}HTREEITEM hNext = treeCtrl.GetNextSiblingItem(hItem);if (hNext) {HTREEITEM hFindItem = findTreeItem(treeCtrl, hNext, dwData);if (hFindItem != NULL)return hFindItem;elsereturn NULL;}else {return NULL;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/76642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pip和conda的环境管理,二者到底应该如何使用

关于pip与conda是否能混用的问题&#xff0c;Anaconda官方早就给出了回答 先说结论&#xff0c;如果conda和pip在相同环境下掺杂使用&#xff0c;尤其是频繁使用这两个工具进行包的安装&#xff0c;可能会导致环境状态混乱 就像其他包管理器一样&#xff0c;大部分这些问题均…

提升你的Android开发技能:从AR/VR沉浸到UI设计和故障排除

文章目录 探索最新AR/VR应用在教育、游戏、医疗等领域的应用教育领域游戏领域医疗领域 深入了解Android内存管理与性能优化的方法与技巧垃圾回收机制内存泄漏使用弱引用避免过度渲染内存优化图像优化延迟加载Android中的调试技术应用程序分析 分享如何提高Android应用的易用性和…

Leetcode算法入门与数组丨1. 数据结构与算法简介

文章目录 前言1 数据结构与算法1.1 数据结构1.2 算法 2 算法复杂度2.1 算法复杂度简介2.2 时间复杂度2.3 空间复杂度 3 总结 前言 Datawhale组队学习丨9月Leetcode算法入门与数组丨打卡笔记 这篇博客以及接下来几篇将会是一个 入门型 的文章&#xff0c;主要是自己学习的一个…

Java FTP按关键字批量下载文件

一、所需jar <dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.8.0</version></dependency> 二、工具类 import java.io.*; import java.net.URLConnection; import java.util.A…

032:vue中三元运算, style、class、type、 event等多种场景示例

第032个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

c++标准库的错误代码

cppreference的std::errc: std::errc - cppreference.com 对应定义(come from: 2022\Community\VC\Tools\MSVC\14.33.31629\include\xerrc.h) enum class errc { // names for generic error codesaddress_family_not_supported 102, // EAFNOSUPPORTaddress_in_use …

Hystrix Readed time out,看我这一篇就让你彻底解决!

在说这个问题的时候&#xff0c;作者真心想吐槽&#xff0c;由于作者在一个特殊的环境无法访问外网&#xff0c;所以用了度娘去查&#xff0c;发现搜索到的结果真的没啥用&#xff0c;有的根本就说不清为啥这么配置解决问题&#xff0c;有些简直的恶心一顿抄&#xff0c;有些连…

Python爬虫技术在SEO优化中的关键应用和最佳实践

大家好&#xff01;今天我要和大家分享一个关于SEO优化的秘密武器&#xff1a;Python爬虫技术。在这篇文章中&#xff0c;我们将探讨Python爬虫在SEO优化中的关键应用和最佳实践。无论您是一名SEO专家、网站管理员&#xff0c;还是对优化网站曝光度感兴趣的初学者&#xff0c;都…

《Effective Java》知识点(2)--对于所有对象都通用的方法

10. 覆盖equals时请遵守通用约定 10.1 不要轻易覆盖equals方法&#xff0c;除非迫不得已。因为&#xff1a; 10.1.1 类的每个实例本质上都是唯一的。 10.1.2 类没有必要提供”逻辑相等“的测试功能。 10.1.3 超类已经覆盖了equals&#xff0c;超类的行为对于这个类也是合适…

VR全景广告——实体商家的营销新选择

前几年&#xff0c;大家出行不便&#xff0c;那个时候实体商家整天苦恼于没有客户&#xff0c;没有销量&#xff0c;一直到引入VR全景广告才算是有所好转。随着VR全景技术不断完善&#xff0c;许多行业、领域开始结合VR全景&#xff0c;例如景区、房地产、车企等都会利用VR全景…

「程序员必须掌握的算法」双指针「上篇」

双指针&#xff08;Two Pointers&#xff09;是解决算法问题的常用方法之一&#xff0c;它通过维护两个指针在某个序列中游走来解决问题。最常见的双指针问题是在一个有序数组中查找是否存在两个数的和等于目标值。 具体来说&#xff0c;设一个指针 left 初始指向数组第一个元…

解决nexus3登录x509: certificate has expired or is not yet valid

笔者前面的博文使用nexus3作为Docker镜像仓库介绍了如何使用nexus3来作为容器的镜像仓库,在生成证书时,使用了有效期限。如果证书过期了,使用podman或者docker登录,则会提示类似如下的信息: x509: certificate has expired or is not yet valid: current time 2023-09-12…

CMS-织梦[dede]-通用免登发布插件

CMS-织梦[dede]-通用免登发布插件 1. 织梦通用免登陆发布插件功能说明2. 织梦通用免登陆发布接口使用说明2-1 下载插件2-2 安装插件3 对接火车头等采集工具 3 爬虫【古诗文网】示例[可选]测试火车头入库模型 使用火车头&#xff0c;简数采集器&#xff0c;八爪鱼等文章采集工具…

构造函数注入指定bean名称

配置类 Configuration public class ThreadPoolTaskExecutorConfig {Beanpublic ThreadPoolTaskScheduler syncScheduler() {ThreadPoolTaskScheduler syncScheduler new ThreadPoolTaskScheduler();syncScheduler.setPoolSize(10);syncScheduler.setThreadGroupName("s…

智慧公厕助推城市管理智能化和治理精细化

随着城市化进程的不断加快&#xff0c;城市管理面临着诸多挑战和问题。而智慧公厕作为城市数字化赋能的重要一环&#xff0c;正成为推动城市管理智能化和治理精细化的关键力量。本文将以智慧公厕头部厂家广州中期科技有限公司&#xff0c;所实施大量精品案例项目的实景实图&…

【深度学习】 Python 和 NumPy 系列教程(二):Python基本数据类型:3、字符串(索引、切片、运算、格式化)

目录 一、前言 二、实验环境 三、Python基本数据类型 3. 字符串&#xff08;Strings&#xff09; 1. 初始化 2. 索引 3. 切片 4. 运算 a. 拼接运算 b. 复制运算 c. 子串判断 d. 取长度 5. 格式化 a. 使用位置参数 b. 使用关键字参数 c. 使用属性访问 f-string…

【linux命令讲解大全】076.pgrep命令:查找和列出符合条件的进程ID

文章目录 pgrep补充说明语法选项参数实例 从零学 python pgrep 根据用户给出的信息在当前运行进程中查找并列出符合条件的进程ID&#xff08;PID&#xff09; 补充说明 pgrep 命令以名称为依据从运行进程队列中查找进程&#xff0c;并显示查找到的进程ID。每一个进程ID以一个…

计算机毕设之基于Hadoop+springboot的物品租赁系统的设计与实现(前后端分离,内含源码+文档+教程)

该系统基于Hadoop平台&#xff0c;利用Java语言、MySQL数据库&#xff0c;结合目前流行的 B/S架构&#xff0c;将物品租赁管理的各个方面都集中到数据库中&#xff0c;以便于用户的需要。在确保系统稳定的前提下&#xff0c;能够实现多功能模块的设计和应用。该系统由管理员功能…

Mybatis 框架 ( 四 ) QueryWrapper

4.5.Wrapper条件构造器 Wrapper &#xff1a; 条件构造抽象类&#xff0c;最顶端父类 AbstractWrapper &#xff1a; 用于查询条件封装&#xff0c;生成 sql 的 where 条件 QueryWrapper &#xff1a; Entity 对象封装操作类&#xff0c;不是用lambda语法 UpdateWrapper &am…

android注解之APT和javapoet

前言 前面我们已经讲过注解的基本知识&#xff0c;对于注解还不太了解的&#xff0c;可以去看一下之前的文章&#xff0c; android 注解详解_袁震的博客-CSDN博客。 之前我们在讲注解的时候&#xff0c;提到过APT和JavaPoet&#xff0c;那么什么是APT和JavaPoet呢&#xff1…