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

MFC第二十四天 使用GDI对象画笔和画刷来开发控件(分页控件选择态的算法分析、使用CToolTipCtrl开发动静态提示)

文章目录

  • GDI对象画笔和画刷来开发控件
    • 梯形边框的按钮控件
      • CMainDlg.h
      • CMainDlg.cpp
      • CLadderCtrl.h
      • CLadderCtrl.cpp
    • 矩形边框的三态按钮控件 CToolTipCtrl开发动静态提示
      • CMainDlg.h
      • CMainDlg.cpp
      • CLadderCtrl.h
      • CLadderCtrl.cpp: 实现文件
    • 矩形边框的三态按钮控件 CToolTipCtrl开发动态提示
      • CMainDlg.h
      • CMainDlg.cpp
      • CLadderCtrl.h
      • CLadderCtrl.cpp
  • 附录

GDI对象画笔和画刷来开发控件

梯形边框的按钮控件

CMainDlg.h

class CMainDlg : public CDialogEx
{
// 构造CLadderCtrl m_ladd;protected:virtual BOOL OnInitDialog();afx_msg void OnPaint();
public:afx_msg void OnSize(UINT nType, int cx, int cy);
};

CMainDlg.cpp

void CMainDlg::OnSize(UINT nType, int cx, int cy)
{CDialogEx::OnSize(nType, cx, cy);if (m_ladd){m_ladd.SetWindowPos(NULL, 0, cy - 20, cx, cy, SWP_NOZORDER);}
}
BOOL CMainDlg::OnInitDialog(){CDialogEx::OnInitDialog();SetIcon(m_hIcon, TRUE);			// 设置大图标SetIcon(m_hIcon, FALSE);		// 设置小图标CRect rect;GetClientRect(rect);rect.top = rect.bottom - 20;m_ladd.Create(WS_CHILD | WS_VISIBLE, rect, this,8888);m_ladd.InsertItem(0, _T("组建"));m_ladd.InsertItem(1, _T("调试"));m_ladd.InsertItem(2, _T("在文件1中查找"));m_ladd.InsertItem(3, _T("在文件2中查找"));m_ladd.InsertItem(4, _T("结果"));return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

CLadderCtrl.h

class CLadderCtrl : public CWnd{DECLARE_DYNAMIC(CLadderCtrl)CStringArray m_ds;  //存储一组字符串 使用Add方法添加新的字符串,使用RemoveAt方法删除指定位置的字符串,使用GetAt方法获取特定位置的字符串等。int m_nIndex{}; CBrush m_br, m_brSel;CFont m_font, m_fontSel;
public:CLadderCtrl();virtual ~CLadderCtrl();BOOL Create(DWORD dwStyle, CRect rect, CWnd* pParent, int nID);LONG InsertItem(int nItem, LPCTSTR lpszItem);int SetCurSel(int nItem);int GetCurSel() const;int GetItemCount() const;BOOL DeleteAllItems();	BOOL DeleteItem(int nItem);
};

CLadderCtrl.cpp

CLadderCtrl::CLadderCtrl(){m_br.CreateSolidBrush(GetSysColor(COLOR_BTNFACE));m_brSel.CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT));HFONT hfont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); // GetStockObject 返回的是void* 要给转为具体类型LOGFONT lf;GetObject(hfont, sizeof(lf), &lf);m_font.CreateFontIndirect(&lf);lf.lfWeight = 700;m_fontSel.CreateFontIndirect(&lf);
}
CLadderCtrl::~CLadderCtrl()	{}
BOOL CLadderCtrl::Create(DWORD dwStyle, CRect rect, CWnd* pParent, int nID){return CWnd::Create(NULL, NULL, dwStyle, rect, pParent, nID);
}
LONG CLadderCtrl::InsertItem(int nItem, LPCTSTR lpszItem)
{m_ds.InsertAt(nItem,lpszItem);return nItem;
}
int CLadderCtrl::SetCurSel(int nItem)
{return 0;
}
int CLadderCtrl::GetCurSel() const
{return 0;
}
int CLadderCtrl::GetItemCount() const
{return (int)m_ds.GetCount();
}
BOOL CLadderCtrl::DeleteAllItems()
{m_ds.RemoveAll();return TRUE;
}
BOOL CLadderCtrl::DeleteItem(int nItem)
{m_ds.RemoveAt(nItem);return TRUE;
}
void CLadderCtrl::OnPaint()
{CPaintDC dc(this); // device context for paintingCRect rect;GetClientRect(rect);dc.SetBkMode(TRANSPARENT);dc.FillSolidRect(rect, GetSysColor(COLOR_INFOBK));int i = -1, nCount =(int) m_ds.GetCount();const int H = rect.Height(); //创建一个宽度为矩形高度的四分之一,高度为整个矩形高度的矩形rc。CRect rc{ H/4,0,0,rect.bottom };dc.SelectObject(&m_br);POINT ptSel[4];CString sSel;CRect rSel;dc.SelectObject(&m_font); //宋体9 就是默认字体/*HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);LOGFONT lf;GetObject(hFont, sizeof(lf), &lf);*/while (++i<nCount){CString str = m_ds[i];CSize size = dc.GetTextExtent(str); //获取字符串str在设备上下文dc中的宽度和高度,并将结果存储在CSize对象size中rc.right = rc.left + size.cx +H; //左边界加上字符串宽度和一个常量H	 可以保证矩形rc的宽度至少能够容纳字符串,并且在右边留出一个宽度为常量H的空白区域POINT pts[] = { {rc.left-H/4,rc.top},{rc.right + H / 4,rc.top},{rc.right - H / 4,rc.bottom},{rc.left + H / 4,rc.bottom} };if (i!=m_nIndex){dc.Polygon(pts, _countof(pts));//dc.Rectangle(rc);dc.DrawText(str, rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);}else{memcpy(ptSel, pts, sizeof(pts));sSel = str;rSel = rc;}rc.left = rc.right;}dc.SelectObject(&m_brSel);dc.Polygon(ptSel, _countof(ptSel)); //要覆盖二次绘画dc.SelectObject(&m_fontSel);dc.DrawText(sSel, rSel, DT_CENTER | DT_VCENTER | DT_SINGLELINE);}
//	dc.TextOut(0, 0, _T("测试系统颜色"));void CLadderCtrl::OnLButtonDown(UINT nFlags, CPoint point)  //和上面算法一致 这个用来算出位置
{CWnd::OnLButtonDown(nFlags, point);CClientDC dc(this);dc.SelectStockObject(DEFAULT_GUI_FONT);int i = -1, nCount = (int)m_ds.GetCount();CRect rect;GetClientRect(rect);CRect rc{ 0,0,0,rect.bottom };while (++i<nCount)   {CString str = m_ds[i];CSize size = dc.GetTextExtent(str);rc.right = rc.left + size.cx + rect.Height();dc.SelectObject(i == m_nIndex ? &m_brSel : &m_br);if (rc.PtInRect(point)){if (i != m_nIndex)  //去除无效点击 {m_nIndex = i;Invalidate(FALSE);}break;}rc.left = rc.right;}
}

在这里插入图片描述

矩形边框的三态按钮控件 CToolTipCtrl开发动静态提示

CMainDlg.h

#include "CLadderCtrl.h"
class CMainDlg : public CDialogEx
{
// 构造CLadderCtrl m_ladd;	CToolTipCtrl m_tip;
public:CMainDlg(CWnd* pParent = nullptr);	// 标准构造函数	
public:afx_msg void OnSize(UINT nType, int cx, int cy);virtual BOOL PreTranslateMessage(MSG* pMsg);
};

CMainDlg.cpp

BOOL CMainDlg::OnInitDialog()
{CDialogEx::OnInitDialog();CRect rect;GetClientRect(rect);rect.top = rect.bottom - 20;m_ladd.Create(WS_CHILD | WS_VISIBLE, rect, this,8888);m_ladd.InsertItem(0, _T("组建"));m_ladd.InsertItem(1, _T("调试"));m_ladd.InsertItem(2, _T("在文件1中查找"));m_ladd.InsertItem(3, _T("在文件2中查找"));m_ladd.InsertItem(4, _T("结果"));m_tip.Create(this);m_tip.AddTool(&m_ladd, _T("没想到吧"));return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
void CMainDlg::OnSize(UINT nType, int cx, int cy)
{CDialogEx::OnSize(nType, cx, cy);if (m_ladd)m_ladd.SetWindowPos(NULL, 0, cy - 20, cx, 20, SWP_NOZORDER);
}
BOOL CMainDlg::PreTranslateMessage(MSG* pMsg) //皇军的岗楼
{m_tip.RelayEvent(pMsg);return CDialogEx::PreTranslateMessage(pMsg);
}

CLadderCtrl.h

class CLadderCtrl : public CWnd
{DECLARE_DYNAMIC(CLadderCtrl)CStringArray m_ds;int m_nIndex{};int m_nTrack{};CBrush m_br, m_brSel,m_brTrack; //三态按钮  三态控件  没有选中色(普通) 选中色 放在上面的框色(追踪态)CBrush m_brBack;CPen m_pen;int GetIndex(CPoint point);
public:CLadderCtrl();virtual ~CLadderCtrl();BOOL Create(DWORD dwStyle, CRect rect, CWnd* pParent, int nID);LONG InsertItem(int nItem, LPCTSTR lpszItem);int SetCurSel(int nItem);int GetCurSel() const;int GetItemCount() const;BOOL DeleteAllItems();BOOL DeleteItem(int nItem);
// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_MAIN_DIALOG };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持DECLARE_MESSAGE_MAP()
public:afx_msg void OnPaint();afx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg void OnMouseMove(UINT nFlags, CPoint point);
};

CLadderCtrl.cpp: 实现文件

#include "pch.h"
#include "CreatControl.h"
#include "afxdialogex.h"
#include "CLadderCtrl.h"
CLadderCtrl::CLadderCtrl()  //有对应的构造函数可以在定义时直接给予初始化{}
{m_br.CreateSolidBrush(RGB(64,86,140));m_brSel.CreateSolidBrush(RGB(230,245,255)); m_brTrack.CreateSolidBrush(RGB(187, 194, 241));m_brBack.CreateSolidBrush(RGB(93, 107, 153)); //默认的背景m_pen.CreatePen(PS_SOLID, 1, RGB(93, 107, 153));
}
CLadderCtrl::~CLadderCtrl()
{
}
BOOL CLadderCtrl::Create(DWORD dwStyle, CRect rect, CWnd* pParent, int nID)
{return CWnd::Create(NULL, NULL, dwStyle, rect, pParent, nID);
}
LONG CLadderCtrl::InsertItem(int nItem, LPCTSTR lpszItem)
{m_ds.InsertAt(nItem,lpszItem);return nItem;
}
int CLadderCtrl::SetCurSel(int nItem)
{ASSERT(nItem > -1 && nItem < m_ds.GetCount());m_nIndex = nItem;Invalidate(FALSE);return 0;
}
int CLadderCtrl::GetCurSel() const
{return m_nIndex;
}int CLadderCtrl::GetItemCount() const
{return (int)m_ds.GetCount();
}BOOL CLadderCtrl::DeleteAllItems()
{m_ds.RemoveAll();return TRUE;
}BOOL CLadderCtrl::DeleteItem(int nItem)
{m_ds.RemoveAt(nItem);return TRUE;
}void CLadderCtrl::DoDataExchange(CDataExchange* pDX)
{CWnd::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CLadderCtrl, CWnd)ON_WM_PAINT()ON_WM_LBUTTONDOWN()ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()
void CLadderCtrl::OnPaint()
{CPaintDC dc(this); // device context for paintingCRect rect;GetClientRect(rect);dc.SetBkMode(TRANSPARENT);dc.FillRect(rect,&m_brBack);int i = -1, nCount =(int) m_ds.GetCount();int nLeft = 0;CRect rc{ 0,0,0,rect.bottom };CFont* pFont = GetFont();dc.SelectStockObject(DEFAULT_GUI_FONT); //宋体9 就是默认字体dc.SelectObject(&m_pen);/*HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);LOGFONT lf;GetObject(hFont, sizeof(lf), &lf);*/while (++i<nCount){CString str = m_ds[i];CSize size = dc.GetTextExtent(str);rc.right = rc.left + size.cx + rect.Height();if (i == m_nIndex){dc.SelectObject(&m_brSel);dc.SetTextColor(GetSysColor(COLOR_WINDOWTEXT));}else if (i == m_nTrack){dc.SelectObject(&m_brTrack);dc.SetTextColor(GetSysColor(COLOR_WINDOWTEXT));}else{dc.SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));dc.SelectObject(&m_br);}//dc.SelectObject(i == m_nIndex ? &m_brSel:&m_br); dc.Rectangle(rc);dc.DrawText(str, rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);rc.left = rc.right;}}
//	dc.TextOut(0, 0, _T("测试系统颜色"));
int CLadderCtrl::GetIndex(CPoint point)
{CClientDC dc(this);dc.SelectStockObject(DEFAULT_GUI_FONT);int i = -1, nCount = (int)m_ds.GetCount();CRect rect;GetClientRect(rect);CRect rc{ 0,0,0,rect.bottom };while (++i < nCount){CString str = m_ds[i];CSize size = dc.GetTextExtent(str);rc.right = rc.left + size.cx + rect.Height();dc.SelectObject(i == m_nIndex ? &m_brSel : &m_br);if (rc.PtInRect(point)){return i;}rc.left = rc.right;}return -1;
}
void CLadderCtrl::OnLButtonDown(UINT nFlags, CPoint point)  //和上面算法一致 这个用来算出位置
{int nIndex = GetIndex(point);if (nIndex != m_nIndex)  //去除无效点击 {m_nIndex = nIndex;Invalidate(FALSE);}CWnd::OnLButtonDown(nFlags, point);
}
void CLadderCtrl::OnMouseMove(UINT nFlags, CPoint point)
{int nIndex = GetIndex(point);if (nIndex == m_nIndex)   return;if (m_nTrack!=nIndex)   {m_nTrack = nIndex;Invalidate(FALSE);}CWnd::OnMouseMove(nFlags, point);
}

在这里插入图片描述

矩形边框的三态按钮控件 CToolTipCtrl开发动态提示

本次只添加了与静态提示不同之处的代码

CMainDlg.h

#include "CLadderCtrl.h"
class CMainDlg : public CDialogEx
{
// 构造CLadderCtrl m_ladd;	CToolTipCtrl m_tip;
public:CMainDlg(CWnd* pParent = nullptr);	// 标准构造函数public:afx_msg void OnSize(UINT nType, int cx, int cy);virtual BOOL PreTranslateMessage(MSG* pMsg);afx_msg BOOL SetTipText(UINT id, NMHDR* pHdr, LRESULT* pResult);//反射型消息 手动创建的 一消息一函数一控件 一IDafx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
};

CMainDlg.cpp

设置动态文字的函数

BOOL CMainDlg::SetTipText(UINT id, NMHDR* pHdr, LRESULT* pResult){int nIndex = m_ladd.GetTrack();if (nIndex < 0 || nIndex >= m_ladd.GetItemCount())return FALSE;TOOLTIPTEXT* pText = (TOOLTIPTEXT*)pHdr;if (pText->uFlags & TTF_IDISHWND){auto nID = (int)pHdr->idFrom;CString str = m_ladd.GetItemText(nIndex);_tcscpy_s(pText->szText, 80, str);return TRUE;}return FALSE;return 0;
}
BOOL CMainDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message){switch (pWnd->GetDlgCtrlID())	{case 8888:{static int nTrack = -1; // 用来看它是否切换 全局变量int n = m_ladd.GetTrack();if (nTrack !=n ){	 //切换算法nTrack = n;m_tip.Update();}}break;}return CDialogEx::OnSetCursor(pWnd, nHitTest, message);
}

CLadderCtrl.h

class CLadderCtrl : public CWnd{CStringArray m_ds;int m_nIndex{};int m_nTrack{};CBrush m_br, m_brSel,m_brTrack; //三态按钮 没有选中色(普通) 选中色 放在上面的框色(追踪态)CBrush m_brBack;int GetIndex(CPoint point);
public:int GetTrack() const{return m_nTrack; //拿到你追踪到的是几号}CString GetItemText(int nIndex) const{return m_ds[nIndex]; //拿到的对应的索引来获取文字}CLadderCtrl();

CLadderCtrl.cpp

int CLadderCtrl::GetIndex(CPoint point)
{CClientDC dc(this);dc.SelectStockObject(DEFAULT_GUI_FONT);int i = -1, nCount = (int)m_ds.GetCount();CRect rect;GetClientRect(rect);CRect rc{ 0,0,0,rect.bottom };while (++i < nCount){CString str = m_ds[i];CSize size = dc.GetTextExtent(str);rc.right = rc.left + size.cx + rect.Height();dc.SelectObject(i == m_nIndex ? &m_brSel : &m_br);if (rc.PtInRect(point)){return i;}rc.left = rc.right;}return -1;
}
void CLadderCtrl::OnLButtonDown(UINT nFlags, CPoint point)  //和上面算法一致 这个用来算出位置
{int nIndex = GetIndex(point);if (nIndex != m_nIndex)  //去除无效点击 {m_nIndex = nIndex;Invalidate(FALSE);}CWnd::OnLButtonDown(nFlags, point);
}
void CLadderCtrl::OnMouseMove(UINT nFlags, CPoint point)
{int nIndex = GetIndex(point);//if (nIndex == m_nIndex)   //	return;if (m_nTrack!=nIndex)   {m_nTrack = nIndex;Invalidate(FALSE);}CWnd::OnMouseMove(nFlags, point);
}

在这里插入图片描述

附录

CDC::FillSolidRect:无边框的纯色填充
GetSysColor获取系统常用的颜色。
GetStockObject(API) 获取系统预定义对象
CDC::SelectStockObject:选择系统预定义对象。
来自于API:GetStockObject
GDI对象的构造函数:CFile的构造函数
a)CPen的构造函数:
CPen(int nPenStyle, int nWidth, COLORREF crColor);
CPen pen;pen.CreatePen(PS_XXX...);
两句合成一句就是:CPen pen(PS_XXX...);b)CBrush的构造函数CBrush(COLORREF crColor);             // CreateSolidBrushCBrush(int nIndex, COLORREF crColor); // CreateHatchBrushexplicit CBrush(CBitmap* pBitmap);          // CreatePatternBrush

MouseMove 进入任意控件都不会理你 除非回到主窗口范围内
OnSetCursor 不论在什么控件都会显示出来 还可以switch getDlgCtrlID 任何控件都会执行

相关文章:

MFC第二十四天 使用GDI对象画笔和画刷来开发控件(分页控件选择态的算法分析、使用CToolTipCtrl开发动静态提示)

文章目录 GDI对象画笔和画刷来开发控件梯形边框的按钮控件CMainDlg.hCMainDlg.cppCLadderCtrl.hCLadderCtrl.cpp 矩形边框的三态按钮控件 CToolTipCtrl开发动静态提示CMainDlg.hCMainDlg.cppCLadderCtrl.hCLadderCtrl.cpp: 实现文件 矩形边框的三态按钮控件 CToolTipCtrl开发动…...

【NLP-新工具】语音转文本与OpenAI的用途

一、说明 OpenAI最近2022发布了一个名为Whisper的新语音识别模型。与DALLE-2和GPT-3不同&#xff0c;Whisper是一个免费的开源模型。它的主要功能就是将语音翻译成文本。本文将介绍如何使用这个重要应用库。 二、 Whisper概念 2.1 Whisper是啥&#xff1f; Whisper 是一种自动…...

try-catch-finally的字节码原理

Java 中有一个非常重要的内容是 try-catch-finally 的执行顺序和返回值问题&#xff0c;其中 finally 一定会执行&#xff0c;但是为什么会这样&#xff1f; 下面看下 try-catch-finally 背后的实现原理 try-catch public class Test {public static void main(String[] args)…...

基于双层优化的微电网系统规划设计方法(Matlab代码实现)

目录 &#x1f4a5;1 概述 1.1 微电网系统结构 1.2 微电网系统双层规划设计结构 1.3 双层优化模型 1.4 上层容量优化模型 1.5 下层调度优化模型 &#x1f4da;2 运行结果 &#x1f389;3 文献来源 &#x1f308;4 Matlab代码、数据、文章讲解 &#x1f4a5;1 概述 文献来源&…...

【Nginx13】Nginx学习:HTTP核心模块(十)Types、AIO及其它配置

Nginx学习&#xff1a;HTTP核心模块&#xff08;十&#xff09;Types、AIO及其它配置 今天学习的内容也比较简单&#xff0c;主要的是 Types 相关的配置&#xff0c;另外还会了解一下 AIO 以及部分没有特别大的分类归属的配置指令的使用。后面的内容都是 HTTP 核心模块中比较小…...

2023年华数杯数学建模C题思路分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor 1 竞赛信息 为了培养学生的创新意识及运用数…...

安卓手机变身Linux服务器

文章目录 前言一、准备工作1、安卓手机2、下载软件二、开始安装1、检查系统,确认版本并安装2、配置(安卓7.0 及以上的用户忽略此步)3、问题处理【没有异常的小伙伴忽略】总结前言 在实际开发中有很多地方都需要服务器资源,但是服务器资源不论在哪里都是比较紧缺的资源,今…...

【Ansible】Ansible自动化运维工具之playbook剧本

playbook 一、playbook 的概述1. playbook 的概念2. playbook 的构成 二、playbook 的应用1. 安装 httpd 并启动2. 定义、引用变量3. 指定远程主机 sudo 切换用户4. when条件判断5. 迭代6. Templates 模块6.1 添加模板文件6.2 修改主机清单文件6.3 编写 playbook 7. tags 模块 …...

Yolov8目标检测

Yolov8目标检测 目录 Yolov8目标检测一、准备数据集二、源码下载配置2.1 下载库2.2 修改配置2.3 训练2.4 验证2.5 测试2.6 模型导出2.7 本地测试 一、准备数据集 Yolov8只支持yolo格式的数据&#xff0c;所以&#xff0c;需要将数据集格式调整为 datasets|images|train|00000…...

Jmeter用于接口测试中,关联如何实现

Jmeter用于接口测试时&#xff0c;后一个接口经常需要用到前一次接口返回的结果&#xff0c;应该如何获取前一次请求的结果值&#xff0c;应用于后一个接口呢&#xff0c;拿一个登录的例子来说明如何获取。 1、打开jmeter, 使用的3.3的版本&#xff0c;新建一个测试计划&#x…...

线程状态

从卖包子的案例学习进程间的通信 public class Test {public static void main(String[] args) {Object objnew Object();Thread th1new Thread(){Overridepublic void run() {synchronized (obj){System.out.println("来三个包子&#xff01;");try {obj.wait(); /…...

HTML一些基础知识

1、Web标准&#xff1a;主要包含结构、表现、行为。结构用于对网页元素进行整理和分类&#xff0c;主要指HTML。表现用于设置网页元素的板式、颜色、大小等外观样式&#xff0c;主要指的是CSS。行为主要指的是网页模型的定义以及交互的编写&#xff0c;主要是js文件。 Html相当…...

git 命令总结

一、本地分支和仓库里的分支不同步&#xff08;本地看不到最新的分支&#xff09; 1.使用 git fetch origin 或者git remote update origin --prune命令更新 2.git branch -r 查看 即可 二、git 合并代码 1. git 如何把分支代码合并到master 1.1 首先切换到分支 git checkou…...

【Django】如何优化数据库访问

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、数据库层面优化常用优化postgresql查询分库分表 二、内存层面优化三、代码层面优化 前言 Django是一个高级的Web框架&#xff0c;它…...

常压室温超导材料:揭开物理学的新篇章

常压室温超导材料&#xff1a;揭开物理学的新篇章 目录 引言超导现象简介常压室温超导材料的重要性常压室温超导材料的研究进展常压室温超导材料的挑战与前景结论 1. 引言 自从1911年荷兰物理学家海克卡默林奥涅斯发现超导现象以来&#xff0c;超导技术在许多领域都有着广泛…...

【《C# 10 和 .NET 6入门与跨平台开发(第6版)》——一本循序渐进的C#指南】

这个新版本对上一版做了全面修订&#xff0c;涵盖C# 10和.NET 6的所有新功能. 本书讨论面向对象编程、编写函数、测试函数、调试函数、实现接口以及继承类等主题&#xff1b;介绍.NET API&#xff0c;这些API可执行多种任务&#xff0c;如管理和查询数据&#xff0c;监视和改进…...

2.5 BUMP图改进

一、Bump Mapping介绍 凹凸贴图映射技术是对物体表面贴图进行变化然后进行光计算的一种技术。例如给法线分量添加噪音&#xff0c;或者在一个保护扰动值的纹理图中进行查找。这是一个提升物理真实感的有效方法&#xff0c;但却不需要额外的提升物体的几何复杂度。这种法式在提…...

第六篇-ChatGLM2-6B-CentOS7安装部署-GPU版

环境 系统&#xff1a;CentOS-7 CPU: 14C28T 显卡&#xff1a;Tesla P40 24G 驱动: 515 CUDA: 11.7 cuDNN: 8.9.2.26模型文件 https://huggingface.co/THUDM/chatglm2-6b 下载模型相关文件到自己目录 我的是/models/chatglm2-6b [rootai-server chatglm2-6b]# pwd /models/c…...

dotnet 依赖注入-批量注入Controller,service,Dao

此类为扩展注入类&#xff0c;使用autofuc 仅供参考 注入接口和实现。 使用方法&#xff1a; //配置项调用ConfigContainer public void ConfigureContainer(ContainerBuilder builder){TestMicroService.ConfigContainer(builder);} //service调用RegisteApiController …...

【Spring】Spring对IoC的实现

根据 【动力节点】最新Spring框架教程&#xff0c;全网首套Spring6教程&#xff0c;跟老杜从零学spring入门到高级 以及老杜的原版笔记 https://www.yuque.com/docs/share/866abad4-7106-45e7-afcd-245a733b073f?# 《Spring6》 进行整理&#xff0c; 文档密码&#xff1a;mg9b…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...