当前位置: 首页 > 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…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...