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不同,Whisper是一个免费的开源模型。它的主要功能就是将语音翻译成文本。本文将介绍如何使用这个重要应用库。 二、 Whisper概念 2.1 Whisper是啥? Whisper 是一种自动…...
try-catch-finally的字节码原理
Java 中有一个非常重要的内容是 try-catch-finally 的执行顺序和返回值问题,其中 finally 一定会执行,但是为什么会这样? 下面看下 try-catch-finally 背后的实现原理 try-catch public class Test {public static void main(String[] args)…...
基于双层优化的微电网系统规划设计方法(Matlab代码实现)
目录 💥1 概述 1.1 微电网系统结构 1.2 微电网系统双层规划设计结构 1.3 双层优化模型 1.4 上层容量优化模型 1.5 下层调度优化模型 📚2 运行结果 🎉3 文献来源 🌈4 Matlab代码、数据、文章讲解 💥1 概述 文献来源&…...
【Nginx13】Nginx学习:HTTP核心模块(十)Types、AIO及其它配置
Nginx学习:HTTP核心模块(十)Types、AIO及其它配置 今天学习的内容也比较简单,主要的是 Types 相关的配置,另外还会了解一下 AIO 以及部分没有特别大的分类归属的配置指令的使用。后面的内容都是 HTTP 核心模块中比较小…...
2023年华数杯数学建模C题思路分析
文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 0 赛题思路 (赛题出来以后第一时间在CSDN分享) 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格式的数据,所以,需要将数据集格式调整为 datasets|images|train|00000…...
Jmeter用于接口测试中,关联如何实现
Jmeter用于接口测试时,后一个接口经常需要用到前一次接口返回的结果,应该如何获取前一次请求的结果值,应用于后一个接口呢,拿一个登录的例子来说明如何获取。 1、打开jmeter, 使用的3.3的版本,新建一个测试计划&#x…...
线程状态
从卖包子的案例学习进程间的通信 public class Test {public static void main(String[] args) {Object objnew Object();Thread th1new Thread(){Overridepublic void run() {synchronized (obj){System.out.println("来三个包子!");try {obj.wait(); /…...
HTML一些基础知识
1、Web标准:主要包含结构、表现、行为。结构用于对网页元素进行整理和分类,主要指HTML。表现用于设置网页元素的板式、颜色、大小等外观样式,主要指的是CSS。行为主要指的是网页模型的定义以及交互的编写,主要是js文件。 Html相当…...
git 命令总结
一、本地分支和仓库里的分支不同步(本地看不到最新的分支) 1.使用 git fetch origin 或者git remote update origin --prune命令更新 2.git branch -r 查看 即可 二、git 合并代码 1. git 如何把分支代码合并到master 1.1 首先切换到分支 git checkou…...
【Django】如何优化数据库访问
原文作者:我辈李想 版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、数据库层面优化常用优化postgresql查询分库分表 二、内存层面优化三、代码层面优化 前言 Django是一个高级的Web框架,它…...
常压室温超导材料:揭开物理学的新篇章
常压室温超导材料:揭开物理学的新篇章 目录 引言超导现象简介常压室温超导材料的重要性常压室温超导材料的研究进展常压室温超导材料的挑战与前景结论 1. 引言 自从1911年荷兰物理学家海克卡默林奥涅斯发现超导现象以来,超导技术在许多领域都有着广泛…...
【《C# 10 和 .NET 6入门与跨平台开发(第6版)》——一本循序渐进的C#指南】
这个新版本对上一版做了全面修订,涵盖C# 10和.NET 6的所有新功能. 本书讨论面向对象编程、编写函数、测试函数、调试函数、实现接口以及继承类等主题;介绍.NET API,这些API可执行多种任务,如管理和查询数据,监视和改进…...
2.5 BUMP图改进
一、Bump Mapping介绍 凹凸贴图映射技术是对物体表面贴图进行变化然后进行光计算的一种技术。例如给法线分量添加噪音,或者在一个保护扰动值的纹理图中进行查找。这是一个提升物理真实感的有效方法,但却不需要额外的提升物体的几何复杂度。这种法式在提…...
第六篇-ChatGLM2-6B-CentOS7安装部署-GPU版
环境 系统:CentOS-7 CPU: 14C28T 显卡: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
此类为扩展注入类,使用autofuc 仅供参考 注入接口和实现。 使用方法: //配置项调用ConfigContainer public void ConfigureContainer(ContainerBuilder builder){TestMicroService.ConfigContainer(builder);} //service调用RegisteApiController …...
【Spring】Spring对IoC的实现
根据 【动力节点】最新Spring框架教程,全网首套Spring6教程,跟老杜从零学spring入门到高级 以及老杜的原版笔记 https://www.yuque.com/docs/share/866abad4-7106-45e7-afcd-245a733b073f?# 《Spring6》 进行整理, 文档密码:mg9b…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
