MFC案例:基于对话框的简易阅读器
一、功能目标:
1.阅读txt文件
2.阅读时可以调整字体及字的大小
3.打开曾经阅读过的文件时,能够自动从上次阅读结束的位置开始显示,也就是能够保存和再次使用阅读信息。
4.对于利用剪贴板粘贴来的文字能够存储成txt文件保存。
5.显示界面可以调整大小。
二、设计步骤
1. 建立一个基于对话框的MFC项目,项目名:simpleReader
1.1 对话框左上角图标Icon改为自己的图标
步骤:右键资源视图Icon->选择添加资源->导入自己的图标->回到资源视图->删除ID为IDR_MAINFRAME的Icon->右键新导入Icon ID->选择属性,ID号改为IDR_MAINFRAME;
2.从工具箱中向对话框内拖入一个文本编辑框(Edit Control)。
2.1 让编辑框充满对话框,这个编辑框是显示阅读文字的界面。
2.2 右键编辑框,点击属性,将编辑框的ID改为IDC_TEXTEDIT。同时,对编辑框的其它属性进行设置:Auto VScroll置为True,垂直滚动置为True,多行置为True,想要返回置为True。
2.3 右键文本编辑框,选择添加变量,变量名:m_textEdit,注意是控件类型。
3.在CsimpleReaderDlg类中以public方式声明需要的变量
具体位置可在simpleReaderDlg.h文件最后(在自动生成的变量m_textEdit的后边)。
3.1 声明 CString filePathName; //阅读文件的路径及文件名
3.2 声明自定义类readFileInfo,用于记录阅读文件的相关信息
typedef class
{
public:
CString fileName; //已阅读文件名(含路径)
int startPos; //阅读位置
int endPos; //阅读位置
} readFileInfo;
//说明:阅读位置使用阅读结束时光标所在位置(字符数)表示。这个位置实质是光标选黑的区域,因此表示其位置需有两个数表示。通过编辑框对象的成员函数GetSel()函数获得,该函数的返回值是DWORD类型,通过LOWORD、HIWORD两个有参宏将返回值解析得到两个阅读位置。当没有选择区域只是光标停在某位置时,这两个值相等。
3.3 #define READNUM 4 //定义记录阅读文件个数的常量(可更改),打开文件个数超过READNUM时,最早打开的文件会被顶掉。
3.4 声明readFileInfo数组:
readFileInfo readfileinfo[READNUM]; //用于记录最多READNUM个文件阅读信息的自定义类数组
3.5 #define MAXTCHAR 10000 //文本编辑框接收数组最大长度
4. 阅读信息存储文件
4.1 前面声明了自定义数组readfileinfo[READNUM]用来处理阅读信息,这些信息如不保存进文件,程序关闭时信息会丢失,因此有必要建立一个文件进行保存,文件名:readInfo.txt,保存路径就在项目目录中。
4.2 在simpleReaderDlg.h文件中,类内以public方式声明阅读信息保存函数:readInfoSave(); 在文件simpleReaderDlg.cpp中实现这个函数。代码如下:
void CsimpleReaderDlg::readInfoSave()
{CFile file;file.Open(L"readInfo.txt", CFile::modeCreate | CFile::modeWrite);for (int i = 0; i < READNUM; i++){TCHAR a[256] = { 0 };wcscpy_s(a, readfileinfo[i].fileName);TCHAR b[64] = { 0 };TCHAR c[64] = { 0 };wsprintf(b, L"%i\0", readfileinfo[i].startPos);wsprintf(c, L"%i\0", readfileinfo[i].endPos);file.Write(a, 256);file.Write(b, 64);file.Write(c, 64);}file.Close();
}
4.3 在simpleReaderDlg.h文件中,类内以public方式声明阅读信息读取函数:readInfoRead(); 并在simpleReaderDlg.cpp中实现这个函数。代码如下:
void CsimpleReaderDlg::readInfoRead()
{CFile file;if (file.Open(L"readInfo.txt", CFile::modeRead))//打开成功{TCHAR a[258] = { 0 };TCHAR b[64] = { 0 };TCHAR c[64] = { 0 };for (int i = 0; i < READNUM; i++){file.Read(a, 256);file.Read(b, 64);file.Read(c, 64);readfileinfo[i].fileName = a;readfileinfo[i].startPos = _wtoi(b);readfileinfo[i].endPos = _wtoi(c);}file.Close();} else{MessageBox(L"调试");return;}
}
4.4 在simpleReaderDlg.cpp中,找到OnInitDialog()函数,在里面添加一些代码。目的是,当程序第一次运行,保存阅读文件信息的文件readInfo.txt不存在时,添加一个记录内容为空的文件保存成readInfo.txt。具体在TODO:后面添加下列代码:
CFile fileCheck;if (!fileCheck.Open(L"readInfo.txt", CFile::modeRead)){fileCheck.Open(L"readInfo.txt", CFile::modeCreate | CFile::modeWrite); //如不存在,新建一个for (int i = 0; i < READNUM; i++) //填入空数据{readfileinfo[i].fileName = L"";readfileinfo[i].startPos = 0;readfileinfo[i].endPos = 0;}fileCheck.Close();readInfoSave(); //保存文件}else fileCheck.Close(); //如存在,结束检查readInfoRead(); //读入数据存进数组readfileinfo[READNUM]
5.退出函数
5.1 对话框右上角“X”单击响应退出函数
右键对话框->属性->单击消息列->选中消息 WM_CLOSE->点击<Add>OnClose。这样,在simpleReaderDlg.cpp中添加了void CsimpleReaderDlg::OnClose()函数,这个函数是点击对话框右上角“X”的响应函数,这个系统自动生成的函数在函数尾部自动调用了父类关闭函数CDialogEx::OnClose()。我们在此只需处理保存阅读文件信息即可,其余交给CDialogEx::OnClose()处理,代码如下:
void CsimpleReaderDlg::OnClose()
{int m_startPos = LOWORD(m_textEdit.GetSel()); int m_endPos = HIWORD(m_textEdit.GetSel());//m_textEdit.GetSel()的返回值是DWORD类型,其低位、高位有不同含义。//低位代表选择区域的开始位置、高位代表选择区域的结束位置。将光标//置于某处不做选择,高低位值相等,用此位置表示阅读位置。readFileInfo temp;temp.fileName = filePathName;temp.startPos = m_startPos;temp.endPos = m_endPos;int choice = -1; //choice用来表示当前阅读文件是否读过以及相关信息在readfileinfo数组//中的位置,-1表示没有读过,数组中没有它的信息for (int i = 0; i < READNUM; i++) //确定choice的值{if (readfileinfo[i].fileName == filePathName) choice = i;}if (choice == -1) //当前阅读文件信息不在readfileinfo数组中{for (int i = READNUM - 1; i > 0; i--) //将数组第0位置腾出{readfileinfo[i] = readfileinfo[i - 1];}}if (choice > 0 && choice < READNUM) /*当前阅读文件信息在readfileinfo数组1~READNUM-1之间,需将其移动到数组第0位置,实际是空出0位,后边重新写入*/{for (int i = choice; i > 0; i--){readfileinfo[i] = readfileinfo[i - 1];}}//choice==0的情况无需调整,故不考虑readfileinfo[0] = temp; //将当前阅读文件信息存入数组第0位置readInfoSave(); //将readfileinfo数组存入文件readInfo.txt
5.1 选择菜单退出
见后。
6. 在对话框上添加菜单栏
步骤:解决方案资源管理器->右键项目名simpleReader->添加->资源->选择Meni->新建->进入菜单编辑界面->顶行写上“文件(F)”。这时,回到资源视图,点击Menu,可看到菜单(指整个菜单)的ID是IDR_MENU1。右键对话框->属性->菜单->选中这个ID。
6.1 打开文件函数
再回到菜单编辑界面,在“文件(F)”的下方添加菜单“打开(O)”,接着,右键“打开(O)”选择属性,将其ID改为ID_OPEN;再次右键“打开(O)”,选择“添加事件处理程序”进入事件处理程序设置界面:类列表选择CsimpleReaderDlg,其余按缺省,确定后在simpleReaderDlg.cpp可看到空的函数void CsimpleReaderDlg::OnOpen(),相关代码如下:
void CsimpleReaderDlg::OnOpen()
{CFileDialog dlg ( //打开文件对话框TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,L"All Files(*.TXT)|*.TXT||", AfxGetMainWnd());CString tempText = _T("");if (dlg.DoModal() == IDOK){filePathName = dlg.GetPathName();CFile file(filePathName, CFile::modeRead);TCHAR* read = new TCHAR[MAXTCHAR];memset(read, '\0', sizeof(TCHAR) * MAXTCHAR);file.Read(read, MAXTCHAR);for (int i = 0;; i++){tempText += read[i];if (read[i] == '\0')break;}file.Close();m_textEdit.SetWindowText(tempText);}int choice = -1; //检查当前打开文件是否已阅读过for (int i = 0; i < READNUM; i++) //{if (readfileinfo[i].fileName == filePathName) choice = i;}int a, b;if (choice == -1){a = 0; b = 0; //如果是未阅读读过的阅读位置设在开始}else {a = readfileinfo[choice].startPos;b = readfileinfo[choice].endPos;}m_textEdit.SetSel(a,b,0);
}
6.2 从菜单退出函数
回到菜单编辑界面,在“打开(O)”下面填写“退出(Q)”,右键“退出”->属性->ID改为ID_QUIT;再右键“退出”,选择“添加事件处理程序”进入事件处理程序设置界面:类列表选择CsimpleReaderDlg,其余按缺省,确定后在simpleReaderDlg.cpp可看到空的函数void CsimpleReaderDlg::OnQuit(),有关处理文件退出代码如下,就一句:
void CsimpleReaderDlg::OnQuit()
{// TODO: 在此添加命令处理程序代码OnClose();//这里只需调用点击右上角“X”的响应函数即可
}
6.3 字体调整函数
回到菜单编辑界面,在“文件(F)”右边再在添加一列下拉函数“格式(O)”,在“格式”下面填写“字体(F)”,右键“字体”->属性->ID改为ID_FONT;再右键“字体”,选择“添加事件处理程序”进入事件处理程序设置界面:类列表选择CsimpleReaderDlg,其余按缺省,确定后在simpleReaderDlg.cpp可看到空的函数void CsimpleReaderDlg::OnFont()。在写代码前,在CsimpleReaderDlg.h类内先声明一个CFont对象m_Font,用于保存新选定的字体。具体代码如下:
void CsimpleReaderDlg::OnFont()
{// TODO: 在此添加命令处理程序代码//记录阅读位置int m_startPos = LOWORD(m_textEdit.GetSel());int m_endPos = HIWORD(m_textEdit.GetSel());//设置字体CFont* tempFont = m_textEdit.GetFont(); //获取编辑框当前字体指针LOGFONT LogFont; //声明逻辑字体对象tempFont->GetLogFont(&LogFont); //加载逻辑字体CFontDialog dlg(&LogFont); //逻辑字体对话框,在此选择字体if (dlg.DoModal() == IDOK){m_Font.Detach(); //将m_Font与原对象剥离LOGFONT temp;dlg.GetCurrentFont(&temp); //获取当前字体信息m_Font.CreateFontIndirect(&temp); //创建字体m_textEdit.SetFont(&m_Font); //设置字体}//重置阅读位置m_textEdit.SetSel(m_startPos, m_endPos, 0);
}
7.处理文本框内容变动函数
单击文本编辑框->右键选择属性->点击控件事件->点击EN_CHANGE->选择
<add>OnEnChangeTextedit,在cpp文件中可以看到增加了void CsimpleReaderDlg::OnEnChangeTextedit()这个文件。添加这个文件的目的是当采用Crt_V方式粘贴进阅读内容时,对粘贴的内容予以保存。相关代码如下:
void CsimpleReaderDlg::OnEnChangeTextedit()
{// TODO: 如果该控件是 RICHEDIT 控件,它将不// 发送此通知,除非重写 CDialogEx::OnInitDialog()// 函数并调用 CRichEditCtrl().SetEventMask(),// 同时将 ENM_CHANGE 标志“或”运算到掩码中。// TODO: 在此添加控件通知处理程序代码CString writeText;m_textEdit.GetWindowText(writeText);TCHAR* write = new TCHAR[MAXTCHAR]; //在堆区声明一个一百万字节的字符串数组memset(write, '\0', sizeof(TCHAR) * MAXTCHAR);write = writeText.GetBuffer();CFileDialog dlg( //保存文件对话框FALSE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("All Files(*.TXT)|*.TXT||"), AfxGetMainWnd()); if (dlg.DoModal() == IDOK) //判断另存为确认键是否按下{filePathName = dlg.GetPathName();//获取路径及文件名并赋给全局变量,除此处使用外退出时也需使用if ((filePathName.Right(4) != _T(".TXT")) && (filePathName.Right(4) != _T(".txt"))){filePathName += _T(".TXT"); //如无后缀则添加}CFile file(filePathName, CFile::modeCreate | CFile::modeWrite);file.Write(write, writeText.GetLength() * sizeof(write[0]));file.Close();}
}
9.处理对话框大小变动函数
选中对话框,右键属性->单击消息->选择WM_SIZE消息->点击<add>OnSize,这样在.cpp文件中,多了一个函数void CsimpleReaderDlg::OnSize(UINT nType, int cx, int cy),在这个函数中TODO:行后边添加:
CWnd* pEdit = GetDlgItem(IDC_TEXTEDIT);if (pEdit) pEdit->MoveWindow(0, 0, cx, cy);
10.帮助文件
选择菜单编辑界面,在“格式”右边在添加一列下拉:“帮助(H)”。在“帮助”下边填上“使用说明(N)”,右键“使用说明”选择属性,将ID改为ID_NOTE;接着,再右键使用说明,选择添加事件处理程序。这样,在.cpp中生成函数void CsimpleReaderDlg::OnNote()。先不写代码,在资源视图中:右键项目名->添加->资源->Dialog->新建;在对话框界面,将“取消”按钮删除。再拖入两个静态文本框,将其ID改为IDC_NOTE、IDC_NOTE1。
右键对话框,添加MFC类,类名FileHelp,基类CDialogEx,对话框ID使用默认IDD_DIALOG1。然后在 simpleReaderDlg.cpp首部添加:#include “Filehelp.h”。再在解决方案资源管理器中找到HelpFile.cpp,点开,在void HelpFile::DoDataExchange(CDataExchange* pDX)函数的CDialogEx::DoDataExchange(pDX)行下面添加下列代码:
CFont font,font1;font.CreateFont(20, 20, 0, 0, FW_NORMAL, FALSE, FALSE,FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,FIXED_PITCH | FF_MODERN, _T("楷体") );GetDlgItem(IDC_NOTE)->SetFont(&font);CString strText;strText = L"使用方法:";GetDlgItem(IDC_NOTE)->SetWindowText(strText);font1.CreateFont(18, 0, 0, 0, FW_NORMAL, FALSE, TRUE,TRUE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,FIXED_PITCH | FF_MODERN, _T("楷体"));strText = L"1.一次最好只打开一个文件,只有关闭程序时阅读位置信息才被保存。";GetDlgItem(IDC_NOTE1)->SetWindowText(strText);strText = "2.若调整界面窗口大小可以在打开文件前进行,以免文字跑动。";GetDlgItem(IDC_NOTE2)->SetWindowText(strText);strText = "3.阅读期间改变字体、字号等操作对原文件不起作用。";GetDlgItem(IDC_NOTE3)->SetWindowText(strText);strText = "4.本简易阅读器的字符集是UTF-16,如打开某些文件显示乱码,可用其它软件打开文件然后Ctr_C、Ctr_V到本阅读器,保存一下再打开。";GetDlgItem(IDC_NOTE4)->SetWindowText(strText);
前面生成的OnNote()函数的代码如下:
void CsimpleReaderDlg::OnNote()
{// TODO: 在此添加命令处理程序代码HelpFile dlg;dlg.DoModal();//创建模态对话框
}
程序完成后的界面截图如下:
相关文章:
MFC案例:基于对话框的简易阅读器
一、功能目标: 1.阅读txt文件 2.阅读时可以调整字体及字的大小 3.打开曾经阅读过的文件时,能够自动从上次阅读结束的位置开始显示,也就是能够保存和再次使用阅读信息。 4.对于利用剪贴板粘贴来的文字能够存储成txt文件保存。 5.显示…...
Python+OpenCV系列:图像的运算
文章目录 PythonOpenCV系列:图像的加权和、覆盖1. 图像加权和(加权融合)2. 图像覆盖(区域叠加)3. 应用场景4. 总结 PythonOpenCV系列:图像的加权和、覆盖 在图像处理中,图像的加权和与覆盖是两…...
【Python】【Conda 】Conda vs venv:Python开发者的虚拟环境选择指南
目录 引言一、概述1.1 Conda 虚拟环境1.2 Python venv 虚拟环境 二、安装与设置2.1 安装 Conda 虚拟环境2.2 安装 Python venv 虚拟环境 三、依赖管理3.1 Conda 依赖管理3.2 Python venv 依赖管理 四、适用场景五、性能与资源占用5.1 Conda 性能与资源占用5.2 Python venv 性能…...
gitee仓库的使用
1、本地创建文件夹:比如H:\python-study\Djangogitee 2、在gitee上创建一个仓库,比如django-project 3、Git 全局设置: 在第一步创建的文件夹下,打开Git Bash(需要提前下载好Git工具),执行下面命令 git co…...
openjudge_简单英文题_33:Is It a Tree
题目 33:Is It a Tree 总时间限制: 1000ms 内存限制: 65536kB 描述 Given edges of a graph with N nodes. Check whether it is a tree. 输入 First line: one positive integers N (N < 100). Next N lines: an N*N 0/1 matrix A{a[i][j]}, indicating whether there ex…...
MyBatis-Plus 中 IdWorker.getId() 方法
前言 在分布式系统中,生成全局唯一标识符(ID)是一个常见的需求。MyBatis-Plus 提供了多种 ID 生成策略,其中基于 Twitter 的 Snowflake 算法实现的 IdWorker.getId() 方法因其高效性和适应分布式环境的特点而备受青睐。然而&…...
JAVA面试汇总(三)集合(一)
JAVA多线程七篇终于写完了,今天开始了新的JAVA面试汇总,集合部分,这部分其实比多线程有意思多了,这个计划最多五篇,也许不到五篇,这是第一篇,开卷。 1.Collection和Collections 的区别ÿ…...
zookeeper的安装
zookeeper的安装 一.前言 zookeeper开源组件是为分布式应用,提供协调服务的一种解决方案。本文主要是介绍在Centos7的操作系统中,如何以单机,伪集群,集群的方式来安装部署zookeeper服务。zookeeper要求的jdk版本为1.6以上。本文假…...
2025系统架构师(一考就过):选择题基础知识一
考点1:CPU、指令 真题1:CPU 执行算术运算或逻辑运算时,常将源操作数和结果暂存在(累加器(AC))中。 真题2:在程序的执行过程中,Cache与主存的地址映射是由(硬…...
线性dp—acwing
题目:数字三角形 898. 数字三角形 - AcWing题库 看某个点,是从那些路径过来的去分析 分析1: 代码1:(顺序正推,二维dp数组) #include<bits/stdc.h> using namespace std;const int N 5…...
【QT】:QT(介绍、下载安装、认识 QT Creator)
背景 🚀 在我们的互联网中的核心岗位主要有以下几种 开发(程序员)测试运维(管理机器)产品经理(非技术岗位,提出需求) 而我们这里主要关注的是开发方向,开发岗位又分很…...
GPIO在ZYNQ7000中的结构和相关寄存器解析
GPIO MASK DATA LSW和 MASK DATA MSW LSW和MSW分别是LSW (Least Significant Word)和MSW (Most Significant Word)。 因为DATA是u32,所以如果寄存器的基址是XGPIOPS_DATA_LSW_OFFSET,那么32位就能同时让高16位的MASK DATA MSW]31:16和 MASK DATA LSW的bit7同时为…...
Docker学习笔记
目录 1,Docker概述 I,虚拟机技术 虚拟机技术缺点 II,容器化技术 III,比较docker和虚拟机技术不同 Ⅳ,DevOps(开发,运维) 1,应用更快速的交付和部署 2,更编辑的升级和扩缩容 …...
皮带,传送带异物检测识别数据集,2345张图像,yolo,coco,voc标记三种格式的数据集整理
皮带,传送带异物检测识别数据集,2345张图像,yolo,coco,voc标记三种格式的数据集整理 数据集分割 训练组79% 1860图片 有效集14% 318图片 测试集7% 167图片 预处理 自动定向: 已应用 调…...
大模型qiming面试内容整理-技术能力评估
技术能力评估是大模型相关岗位面试中最重要的环节之一,主要考察候选人是否具备处理复杂机器学习问题、设计和优化模型的能力。以下是技术能力评估的具体内容和可能涉及的题目: 机器学习基础 ● 监督学习与无监督学习: ○ 理解基本的机器学习类型和模型:监督学习:如回归(线…...
前端成长之路:HTML(3)
在HTML中,有列表标签。列表最大的特点是整齐、简洁、有序,用列表进行布局会更加自由方便。根据使用的情景不同,可以将列表分为三大类:无序列表、有序列表和自定义列表。 无序列表 在HTML中使用<ul>标签定义一个无序列表&a…...
小程序给元素设置line-height为0引起页面更新无效
问题 在小程序中使用setData更新,数据更新完毕,页面却没有更新值,甚至出现渲染错乱现象; 发现 但当点击相应事件的时候,视图又更新了。 思考 开始认为是没有在dom渲染后进行数据更新产生的问题,换了方法执行…...
【1355个俚语完结】跟李笑来学美式俚语(Most Common American Idioms): Part 68
Goal Completed 2024年12月11日22点25分完成这本书的学习。习得1355个俚语,尽管有些记得不牢,但是好在走在路上,一直往前走。后面就是多重复,多练习。 查看自己commit的日志,是从2024年11月15日开始学习这本书&#…...
TcpServer 服务器优化之后,加了多线程,对心跳包进行优化
TcpServer 服务器优化之后,加了多线程,对心跳包进行优化 TcpServer.h #ifndef TCPSERVER_H #define TCPSERVER_H#include <iostream> #include <winsock2.h> #include <ws2tcpip.h> #include <vector> #include <map> #…...
螺丝螺帽缺陷检测识别数据集,支持yolo,coco,voc三种格式的标记,一共3081张图片
螺丝螺帽缺陷检测识别数据集,支持yolo,coco,voc三种格式的标记,一共3081张图片 3081总图像数 数据集分割 训练组90% 2781图片 有效集7% 220图片 测试集3% 80图片 预处理…...
若依微服务中配置 MySQL + DM 多数据源
文章目录 1、导入 MySQL 和达梦(DM)依赖2、在 application-druid.yml 中配置达梦(DM)数据源3、在 DruidConfig 类中配置多数据源信息4、在 Service 层或方法级别切换数据源4.1 在 Service 类上切换到从库数据源4.2 在方法级别切换…...
Apache APISIX快速入门
本文将介绍Apache APISIX,这是一个开源API网关,可以处理速率限制选项,并且可以轻松地完全控制外部流量对内部后端API服务的访问。我们将看看是什么使它从其他网关服务中脱颖而出。我们还将详细讨论如何开始使用Apache APISIX网关。 在深入讨…...
【C++】继承
目录 1. 继承的概念及定义 1.1 继承的概念 1.2 继承定义 1.2.1 定义格式 1.2.2 继承基类成员访问方式的变化 1.3 继承类模板 2. 基类和派生类间的转换 3. 继承中的作用域 3.1 隐藏规则: 3.2 考察继承作用域相关选择题 3.2.1 A和B类中的两个func构成什么关…...
设计模式详解(十):策略模式——Strategy
什么是Strategy设计模式? Strategy模式是一种行为型设计模式,它定义了一系列算法,将每种算法封装到独立的类中,使它们可以互换。使用该模式,可以在不修改客户端代码的情况下动态地改变算法的行为。 为什么需要Strate…...
B4X编程语言:B4X控件方法汇总
1、AddNode、AddView方法 AddNode(Node As javafx.scence.Node,Left As Double,Top As Double,Width As Double,Height As Double) B4J控件 AddView(View As javafx.scence.Node,Left As Double,Top As Double,Width As Double,Height As Double) B4J的B4XView …...
如何阅读一本书
阅读很重要,我们真的会阅读吗? 这本书的初版是 1940年,时隔 80年,其内容仍然不过时。第一次读这本书时,给我最大的影响就是主题阅读,每次学习一个新理论、技术,都入手多本关于这项理论、技术的书籍,不同的作者,不同作者的写作背景、角度、目的,导致了风格不同的书籍,…...
vscode 排除文件夹搜索
排除的文件夹 node_modules/,dist/...
1. Flink自定义Source
一. Source 简介 DataStream是Flink的低级API,用于进行数据的实时处理,Flink编程模型分为Source、Transformation、Sink三个部分,如下图所示。 默认Flink提供了大量的内置Source,常见的Source如下: 基于文件的Sour…...
短信验证码burp姿势
首先声明,本文仅仅作为学习使用,因个人原因导致的后果,皆有个人承担,本人没有任何责任。 在之前的burp学习中,我们学习了图片验证码的突破,但是现实中还有很多短信验证码,在此我介绍几种短信验…...
scala的正则表达式3
贪婪模式与非贪婪模式 1.贪婪模式 贪婪模式是正则表达式的默认行为。在这种模式下,量词(如*、、?、{n,m})会尝试匹配尽可能多的字符。例如,正则表达式".*"会匹配任意数量的任意字符,包括空字符。 2非贪婪…...
Kotlin设计模式之中介者模式
中介者模式(Mediator Pattern)用于定义一个对象,该对象封装了一组对象之间的交互方式。中介者使各对象不需要显式地相互引用,从而使其耦合松散,并可以独立地改变它们之间的交互。以下是Kotlin中实现中介者模式的方法&a…...
Android 车载虚拟化底层技术-Kernel 5.10 -Android12(multi-cards)技术实现
详细代码实现见 Android Display Graphics系列文章-汇总Android Display Graphics系列文章-汇总 Android Display Graphics系列文章-汇总 Android Display Graphics系列文章-汇总 本文主要包括部分: 一、Android12的Kernel 5.10版本 1.1 Kernel 5…...
ZZNUOJ_1726:算法提高 选择排序(C/C++/Java)
题目描述 排序,顾名思义,是将若干个元素按其大小关系排出一个顺序。形式化描述如下:有n个元素a[1],a[2],…,a[n],从小到大排序就是将它们排成一个新顺序a[i[1]]<a[i[2]]<…<a[i[n]] i[k]为这个新顺序。 选择排序的思想极其简单,每一步都把一个最小…...
Python+OpenCV系列:模版匹配
文章目录 1. 模板匹配基本原理2. cv2.matchTemplate() 函数函数原型: 3. 模板匹配步骤4. 单目标模板匹配示例5. 多目标模板匹配多目标模板匹配示例代码解析: 6. 多模板匹配多模板匹配示例代码解析 7. 总结 模板匹配是一种在图像中寻找模板的位置的方法。…...
AWS云计算问答式知识库系统的实现
AWS平台上建立一个生成式人工智能专业文文档问答式网站,前端用Flask框架,后端用Fast API,前端调用后端的唯一API来完成大模型文档搜索的功能,使用AWS Bedrock里的Titan和Llama3模型,以及OpenAI 4.0 API来调用模型并提供…...
【C语言】库函数常见的陷阱与缺陷(4):内存内容操作函数
目录 一、memcmp函数 1.1. 功能与用法 1.2. 陷阱与缺陷 1.2.1. 比较范围限制问题 1.2.2. 数据类型兼容性隐患 1.2.3. 其它 1.3. 安全使用建议 1.4. 代码示例 二、memcpy函数 2.1. 功能与用法 2.2. 陷阱与缺陷 2.2.1. 缓冲区溢出风险 2.2.2. 重叠内存区域处理隐患 …...
Java 类与对象的详细讲解
引言 在Java中,类(Class)和对象(Object)是面向对象编程(OOP)的核心组成部分。通过它们,我们可以创建复杂的数据结构,并实现代码的重用性和可维护性。本文将深入探讨Java…...
Python爬虫之使用BeautifulSoup进行HTML Document文档的解析
BeautifulSoup 是一个用于解析 HTML 和 XML 文档的 Python 库,它为开发者提供了一种简单的方式来查找、遍历和修改文档树。BeautifulSoup 特别擅长处理不规则或格式不佳的标记语言,可以自动更正无效的 HTML,因此在网页抓取(Web Sc…...
vue2 纯前端实现像chatGpt一样的文字流式输出
1、先展示一下效果啦 文字流输出 2、首先确定接口返回的是字符串,那就先调取接口 // 由于需求关系 有很多个文本需要一起逐字输出 所以这里就采用了Promise.all的形式 async getThreeTextarea() {let taskArray [ "重点项目文本","应用领域文本&qu…...
基于PHP课堂签到系统的设计与实现
摘 要 随着教育业的迅速发展和学生人数的不断增加,导致在班级登记制度中传统的“点到”方式不能适应学校的实际需要。从而需要设计一个好的课堂签到系统将会对课堂签到管理工作带来事半功倍的效果。文章着重介绍了基于实践应用的班级签到系统的开发流程,…...
LLMs之APE:基于Claude的Prompt Improver的简介、使用方法、案例应用之详细攻略
LLMs之APE:基于Claude的Prompt Improver的简介、使用方法、案例应用之详细攻略 目录 Prompt Improver的简介 0、背景痛点 1、优势 2、实现思路 Prompt优化 示例管理 提示词评估 Prompt Improver的使用方法 1、使用方法 Prompt Improver的案例应用 1、Kap…...
51c深度学习~合集9
我自己的原文哦~ https://blog.51cto.com/whaosoft/12750420 #傅里叶特征 (Fourier Feature)与核回归 位置编码背后的理论解释 本文探讨了位置编码背后的理论基础,特别是傅里叶特征(Fourier Feature)与核回归(Kern…...
前端流式播放TTS语音:技术细节与实现
摘要 本文将介绍如何在前端实现流式播放文本到语音(TTS)的语音,并加入确保语音播放不重叠的改进方案。我们将探讨使用Web Audio API和WebSocket进行实时语音播放的技术细节,并提供相应的代码示例。 一、引言 在之前的讨论中&am…...
数据结构面试题整理
1. 简述什么是数据结构? 数据结构就是一种组织和存储数据的方式,使得我们可以高效地访问和修改数据。就像你整理房间一样,不同的物品有不同的收纳方式,数据也有不同的存储和管理方法。 比如,数组就像一个排成一排的抽…...
前端实现浏览器自定义滚动条
前言: 最近有个项目,产品觉得浏览器默认滚动条太丑了。想美化一下,比如自定义颜色,加上圆角,宽高都要更改一下。我查了资料和文档总结了一下 写法,特此记录以便之后使用。 浏览器滚动条api 总结ÿ…...
Oracel 统计信息收集
1. 常规的通过PLSQL客户端进行统计信息收集,需要指定用户名和表名 begin dbms_stats.gather_table_stats(ownname > &owner, tabname > &tablename, estimate_percent > DBMS_STATS.AUTO_SAMPLE_SIZE, cascade > TRUE, degree > 4, m…...
openpnp - Too many misdetects - retry and verify fiducial/nozzle tip detection
文章目录 openpnp - Too many misdetects - retry and verify fiducial/nozzle tip detection概述笔记环境光最好弱一些在设备标定时,吸嘴上不要装绿色屏蔽片如果吸嘴不在底部相机中间,先检查设置底部相机坐标调整底部相机坐标 吸嘴校验的细节底部相机坐…...
Windows安装WSL子系统及docker,以及WSL和docker配置、使用及问题解决
在Windows操作系统中,Ubuntu子系统(也称为Windows Subsystem for Linux, WSL)为开发者提供了一个在Windows环境下运行Linux环境的平台。然而,有时用户在按照Ubuntu子系统或者使用WSL时,可能会遇到各种问题,下面总结一下解决方式。 想要在Windows上安装Docker(实际上是基…...
光伏电站建设成本利润估算
截至2024年9月底,全国光伏发电装机容量达到7.7亿千瓦,同比增长48.4%。其中集中式光伏4.3亿千瓦,分布式光伏3.4亿千瓦。2024年前三季度,全国光伏发电量6359亿千瓦时,同比增长45.5%。全国光伏发电利用率97.2%,同比下降1.1个百分点.早在今年2月份,中国光伏行业协会名誉理…...
TimesFM(Time Series Foundation Model)安装(2)
TimesFM(Time Series Foundation Model)安装简介 readme TimesFM(Time Series Foundation Model)安装简介(1)-CSDN博客https://blog.csdn.net/chenchihwen/article/details/144359861?spm1001.2014.3001…...