MFC案例:图片文件转图标(ico)格式
本案例程序目的是将一般图像文件转换成图标格式(ico)。实现起来不是很复杂,这里为了介绍MFC的具体使用方法,在程序界面上分成几个功能块,包括:打开图像文件、选择ICON大小、转换、预览、保存等。相关具体步骤如下:
一、建立一个基于对话框的MFC应用
项目名称:PicFileToIcoFile
其余使用缺省;在Dialog界面,将自动生成的控件删去。
二、程序界面:标题
在对话框上部居中显示“普通图像文件转Ico文件”几个字。做法:拖入一个静态文本框放在对话框靠上居中位置;设置这个静态文本框:右键静态文本框->属性->ID:改为IDC_TITLE->对齐文本:选择Center。接下来,在PicFileToIcoFileDlg.cpp(以下简称*.cpp)中找到BOOL CPicFileToIcoFileDlg::OnInitDialog()函数,在//TODO:行下面加入以下代码:
//显示程序界面标题“普通图像文件转Ico文件 ”CFont titleFont;titleFont.CreateFont(36, 0, 0, 0, FW_NORMAL, FALSE, FALSE,FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,FIXED_PITCH | FF_MODERN, _T("宋体"));GetDlgItem(IDC_TITLE)->SetFont(&titleFont);CString str;str = L"普通图像文件转Ico文件";GetDlgItem(IDC_TITLE)->SetWindowText(str);
三、为保证一些变量或自定义函数在不同函数中都能使用,在PicFileToIcoFileDlg.h中,类内以public:方式声明以下变量和自定义函数:
1.变量
CString m_filePath; //记录打开源图像文件路径及文件名CImage sourceImage=L""; //CImage类对象,用于载入源图像 int hadTrans = 0; //是否完成转换的标志int cxIcon=32, cyIcon=32; //icon图标的大小,默认32*32
2.自定义函数
void transform(int isTrans,int isPreview,int isSave); //转换等功能实现void recove(); //恢复部分界面
(以上两个函数具体意义见下面实现部分)
四、程序界面:打开源图像文件并显示文件名
1.从工具箱中拖入一个Button放在对话框左偏上位置,然后:右键Button->属性->描述文字改为:“打开源图像文件”、ID改为:IDC_OPENFILE。
2.再从工具箱中拖入一个文本编辑框(Edit Control),放到Button右边,用途是作为打开文件的显示界面;右键文本编辑框->属性->ID:改为IDC_EDIT_OPEN。
3.再右键“打开源图像文件”控件->选择:添加事件处理程序->类列表选择:CPicFileToIcoFileDlg,其余缺省。此时,在*Dlg.cpp文件中,可以看到增加了一个OnBnClickedOpenfile函数,在这个函数中我们实现打开文件、显示文件名功能。这个函数的代码如下:
void CPicFileToIcoFileDlg::OnBnClickedOpenfile()
{// TODO: 在此添加控件通知处理程序代码CFileDialog fileDlg( //声明文件对话框类对象TRUE, //TRUE — 打开文件、FALSE —保存文件NULL, NULL, OFN_HIDEREADONLY, L"All Files(*.*)||", AfxGetMainWnd(), 0UL, 1);fileDlg.DoModal(); //显示打开文件对话框(可在此选择图像文件)m_filePath = fileDlg.GetPathName();//获得路径及文件名GetDlgItem(IDC_EDIT_OPEN)->SetWindowText(m_filePath);//在文本编辑框中显示recove(); //后添加
}
五、在完善其它程序界面前,先将前面声明的两个自定义函数实现一下。
1.实现transform函数,我们在这个函数中实现转换、预览、保存等功能,也就是程序界面上“开始转换”、“预览”、“保存”分在三个Button上执行,但调用的都是这一个函数。通过控制这个函数的参数isTrans、isPreview、isSave实现运行部分或全部代码。具体如下:
void CPicFileToIcoFileDlg::transform(int isTrans, int isPreview, int isSave)
{HICON hIcon=NULL; //转换后的图标句柄(不是最终的图标文件)CDC cmptblDC; //声明设备上下文兼容对象HBITMAP hOldBmp=NULL;//声明默认bitmapif (isTrans == 1) //“选择转换”Button按下式执行{//1.声明CImage对象,将欲转换的图片载入对象中CImage sourceImage;sourceImage.Load(m_filePath); //载入图像int w = sourceImage.GetWidth(); //获取图像宽度(像素)int h = sourceImage.GetHeight(); //获取图像高度(像素)//2.定义与当前设备上下文兼容对象,再定义与当前设备上下文指针兼容的BITMAP对象(尺寸是我们最后需要的Icon尺寸),并把这个BITMAP对象选入兼容设备上下文CDC* CurrentDC = GetDC(); //声明设备上下文指针并获得当前设备(指显示器)指针cmptblDC.CreateCompatibleDC(CurrentDC); //让生成的设备上下文对象与当前设备上下文兼容CBitmap bmp; //声明CBitmap对象bmpbmp.CreateCompatibleBitmap(CurrentDC, cxIcon, cyIcon); //生成与当前设备上下文指针兼容的CBitmaphOldBmp = (HBITMAP)cmptblDC.SelectObject(bmp); //将bmp选入兼容设备上下文对象并保留缺省指针//3.调用CImage成员函数,将原图像拷贝到兼容设备上下文中,再获得已选入兼容设备上下文中的bmp指针sourceImage.StretchBlt(cmptblDC.m_hDC, 0, 0, cxIcon, cyIcon, 0, 0, w, h, SRCCOPY);//拉伸(缩放)拷贝图像函数HBITMAP hBmp = (HBITMAP)bmp.m_hObject;//通过bmp的属性获得其指针(此时bmp中已有图像)//4.声明一个Icon信息结构体对象并将bmp作为参数写入其属性中ICONINFO iconinfo;memset(&iconinfo, 0, sizeof(iconinfo)); //将iconinfo赋初值为0iconinfo.fIcon = 1; //1代表图标 0代表光标(此处我们需要的是图标)iconinfo.hbmColor = hBmp; //图标颜色位图的句柄(HBITMAP类型)iconinfo.hbmMask = hBmp; //指定图标位掩码位图(HBITMAP类型)iconinfo.xHotspot = 0; //对于图标而言此坐标无用iconinfo.yHotspot = 0;//5.创建图标hIcon = CreateIconIndirect(&iconinfo);if (!hIcon){MessageBox(L"转换失败......");return;}sourceImage.Detach(); //将img对象与bmp分离}//6.预览图标(需要同时运行转换部分)if (isTrans == 1 && isPreview == 1){if (hadTrans==0){MessageBox(L"请先进行转换操作...");return;}//显示图标DrawIconEx(GetDC()->m_hDC, 280, 350, hIcon, 64, 64, 0, NULL, DI_NORMAL);hadTrans = 0;}if (isTrans == 1 && isSave == 1){//7.声明创建图片对象专用结构体并进行赋值PICTDESC pictdesc; //这个结构体的属性中包含通过OleCreatePictureIndirect函数创建图片对象的参数memset(&pictdesc, 0, sizeof(pictdesc)); //将该结构体赋初值为0pictdesc.cbSizeofstruct = sizeof(pictdesc); //结构体字节长度属性pictdesc.picType = PICTYPE_ICON; //图片类型pictdesc.icon.hicon = hIcon; //(将图片选入)路线:hIcon<-iconinfo<-hBmp<-img//8.创建图片对象IPicture* ipPic = NULL; //声明一个图片接口指针ipPic(IPicture接口可接收图片)HRESULT resOle = OleCreatePictureIndirect(&pictdesc, IID_IPicture, TRUE, (LPVOID*)&ipPic);//创建由pictdesc对象初始化的新图片对象,结果存入IPicture*指向的地址//参数:1、pictdesc取址,2、接口指针类型,3、销毁对象时销毁图片,4、结果接收指针if (FAILED(resOle)){MessageBox(L"接口指针定义失败...");exit(1);}//9.将图片对象内容、字节数传入IStream流接口对象中LPSTREAM pStream = 0; //声明一个空的流接口对象指针HRESULT hResult = CreateStreamOnHGlobal(0, TRUE, &pStream);//创建流指针对象(申请空间)if (FAILED(resOle)){MessageBox(L"申请流对象内存空间失败...");exit(1);}LONG size = 0;ipPic->SaveAsFile(pStream, TRUE, &size);//图片对象ipPic调用成员函数SaveAsFile将自身图像写入pSream,字节数存到size//10.将流对象中的内容保存进ico类型文件LARGE_INTEGER offsetLI; //Union组合起来的用来表示大的整数的结构体offsetLI.HighPart = 0;offsetLI.LowPart = 0;ULARGE_INTEGER ulnewpos; //同上,但无符号,用于记录流内部指针的位置pStream->Seek(offsetLI, STREAM_SEEK_SET, &ulnewpos); //对pStream内部指针进行定位//参1:LARGE_INTEGER类型的偏移量,此处为0//参2:STREAM_SEEK_SET(值=0),文件首//参3:将定位指针信息存入ulnewposHANDLE hFile = CreateFile(L"ico.ico", GENERIC_ALL, 0, 0, CREATE_ALWAYS, 0, 0);//生成ico文件句柄//参1:文件名 参2:访问模式 参3:共享模式 参4:安全属性//参5:打开文件模式 参6:文件属性 参7:模板文件句柄if (hFile){char* buf = new char[size]; //定义字符数组,长度为流接口对象中的字节长度memset(buf, 0, size); //赋值为0ULONG nRead = 0; //定义无符号长整型pStream->Read(buf, size, &nRead);//参1:指向缓冲区的指针,用于接收流数据//参2:试图读取的数据字节数//参3:从流对象读取的实际字节数ULONG nWrited = 0;WriteFile(hFile, buf, nRead, &nWrited, 0);//参1:待写入文件的句柄//参2:待写入内容//参3:要写入数据的字节数量//参4:实际写入文件的字节数量//参5:是否异步写,一般置为NULLCloseHandle(hFile); //关闭文件句柄}ipPic->Release(); //释放图片接口指针}cmptblDC.SelectObject(hOldBmp); //恢复兼容对象默认bmp
}
2.实现recove()函数,在transform函数中,有模拟的进度条和预览图标的显示,当重新打开文件或者重新选择ICON大小时,模拟的进度条和预览的图标应隐去,这个函数就是实现这个功能。为保证打开文件时也能实现这个功能,这个函数也要添加到OnBnClickedOpenfile()中。
函数代码如下:
void CPicFileToIcoFileDlg::recove()
{CDC* pDC;pDC = GetDC();int startX = 290;int posY = 285;int step = 18;pDC->SetBkColor(0xF0F0F0);//文字背景灰pDC->SetTextColor(0xF0F0F0); //文字前景色for (int i = 0; i < 26; i++){pDC->TextOut(startX + step * i, posY, L">"); //恢复进度条}pDC->FillSolidRect(280, 350, 64, 64, 0xF0F0F0); //恢复预览区hadTrans = 0;
}
六、程序界面:选择ICON大小
1. 常用的ico文件像素大小一般有32*32、48*48、64*64、128*128、256*256等类别。这里用单选框进行选择,为排列整齐并让这几个单选框成为一体,故先从工具箱中先拖入一个Group Box控件,位置放在打开文件及显示编辑框的正下方;然后右键Group Box->属性->描述文字改为:选择ICON大小。
2.向Group Box中拖入5个单选框(Radio Button)横向一字排开,分别将其属性中的ID、描述文字进行修改,并为每个控件添加变量,结果如下:
ID 文字描述 变量名
CHOICE32 32*32像素 m_Choice32
CHOICE48 48*48像素 m_Choice48
CHOICE48 64*64像素 m_Choice64
CHOICE128 128*128像素 m_Choice128
CHOICE256 256*256像素 m_Choice256
3.为这5个单选框添加事件处理程序,添加的程序名称及添加的代码如下:
void CPicFileToIcoFileDlg::OnBnClickedChoice32()
{// TODO: 在此添加控件通知处理程序代码m_Choice32.SetCheck(TRUE); //置为已选m_Choice48.SetCheck(FALSE);m_Choice64.SetCheck(FALSE);m_Choice128.SetCheck(FALSE);m_Choice256.SetCheck(FALSE);cxIcon = 32;cyIcon = 32;recove();
}
void CPicFileToIcoFileDlg::OnBnClickedChoice48()
{// TODO: 在此添加控件通知处理程序代码m_Choice32.SetCheck(FALSE);m_Choice48.SetCheck(TRUE);//置为已选m_Choice64.SetCheck(FALSE);m_Choice128.SetCheck(FALSE);m_Choice256.SetCheck(FALSE);cxIcon = 48;cyIcon = 48;recove();
}
void CPicFileToIcoFileDlg::OnBnClickedChoice64()
{// TODO: 在此添加控件通知处理程序代码m_Choice32.SetCheck(FALSE);m_Choice48.SetCheck(FALSE);m_Choice64.SetCheck(TRUE);//置为已选m_Choice128.SetCheck(FALSE);m_Choice256.SetCheck(FALSE);cxIcon = 64;cyIcon = 64;recove();
}
void CPicFileToIcoFileDlg::OnBnClickedChoice128()
{// TODO: 在此添加控件通知处理程序代码m_Choice32.SetCheck(FALSE);m_Choice48.SetCheck(FALSE);m_Choice64.SetCheck(FALSE);m_Choice128.SetCheck(TRUE);//置为已选m_Choice256.SetCheck(FALSE);cxIcon = 128;cyIcon = 128;recove();
}
void CPicFileToIcoFileDlg::OnBnClickedChoice256()
{// TODO: 在此添加控件通知处理程序代码m_Choice32.SetCheck(FALSE);m_Choice48.SetCheck(FALSE);m_Choice64.SetCheck(FALSE);m_Choice128.SetCheck(FALSE);m_Choice256.SetCheck(TRUE);//置为已选cxIcon = 256;cyIcon = 256;recove();
}
七、程序界面:开始转换
1、从工具箱中拖入一个Button放在“选择ICON大小”下方靠左,右键这个Button->属性->ID:改为IDC_TRANS、描述文字:改为开始转换。
2、右键“开始转换”,选择添加事件处理程序,在*.cpp文件中可以看到生成了一个函数 void CPicFileToIcoFileDlg::OnBnClickedTrans(),在这个函数中TODO:之下先添加下列代码:
// TODO: 在此添加控件通知处理程序代码if (m_filePath == L""){MessageBox(L"尚未打开文件,无转换对象......");return;}transform(1,0,0); //控制参数仅运行转换部分hadTrans = 1;CDC* pDC;pDC = GetDC();int startX = 290;int posY = 285;int step = 18;pDC->SetBkColor(0xF0F0F0);//文字背景灰pDC->SetTextColor(0x000000); //文字颜色黑for (int i = 0; i < 26; i++){pDC->TextOut(startX + step * i, posY, L">");Sleep(50);}
八、预览
1、从工具箱中拖入一个Button放在对话框下方左端,右键这个Button->属性->ID:改为IDC_PREVIEW、描述文字:预 览
2、右键“预 览”,选择添加事件处理程序,在*.cpp文件中可以看到生成了一个函数void CPicFileToIcoFileDlg::OnBnClickedPreview(),在这个函数的TODO:行下面,添加代码:
// TODO: 在此添加控件通知处理程序代码if (m_filePath == L""){MessageBox(L"尚未打开文件,无转换对象......");return;}transform(1, 1, 0);
六、程序界面:保存
再拖入一个Button放到对话框下方右端,文字描述改为:保 存。右键保存->选择添加事件处理程序,在*.cpp中可以看到函数void CPicFileToIcoFileDlg::OnBnClickedSave()。在该函数TODO:下方,添加下列代码:
// TODO: 在此添加控件通知处理程序代码if (m_filePath == L""){MessageBox(L"尚未打开文件,无转换对象......");return;}transform(1, 0, 1);//运行转换、保存文件部分MessageBox(L"已将图标在当前目录下保存成ico.ico");
七、至此,程序的界面及功能已经实现完毕,退出时没有需要处理的内容,故退出操作直接使用对话框右上角的“X”完成。
运行后界面截图:
相关文章:
MFC案例:图片文件转图标(ico)格式
本案例程序目的是将一般图像文件转换成图标格式(ico)。实现起来不是很复杂,这里为了介绍MFC的具体使用方法,在程序界面上分成几个功能块,包括:打开图像文件、选择ICON大小、转换、预览、保存等。相关具体步骤如下: 一、…...
【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
文章目录 一、软件下载安装1、Unity官网2、下载Unity Hub 二、修改Unity Hub配置1、设置Unity Hub中文语言2、修改默认存储目录 三、安装unity编辑器1、点击安装编辑器2、版本选择3、关于版本号4、安装模块选择5、等待下载完成自动安装即可6、追加unity和模块 四、许可证管理专…...
东子生物完成A轮战略融资,数字商品交易全新升级为数商时代
2024年11月23日,东子生物数字时代正式上线,标志着公司全面迈入“数商时代”,作为国内领先的生物科技企业,东子生物在数字化浪潮中精准布局,以创新科技推动产业升级,以全新的思维引领健康产业,兼…...
数据结构经典算法总复习(上卷)
第一章:数据结构导论 无重要考点,仅需了解时间复杂度。 第二章:线性表 1.获得线性表第i个元素 void GetElem_sq(SqList L, int i, ElemType &e) {if (i<1 || i>L.length) ErrorMsg("Invalid i value"); //注意错误监…...
电脑使用CDR时弹出错误“计算机丢失mfc140u.dll”是什么原因?“计算机丢失mfc140u.dll”要怎么解决?
电脑使用CDR时弹出“计算机丢失mfc140u.dll”错误:原因与解决方案 在日常电脑使用中,我们时常会遇到各种系统报错和文件丢失问题。特别是当我们使用某些特定软件,如CorelDRAW(简称CDR)时,可能会遇到“计算…...
oracle使用imp命令导入dmp文件
需求: 增量导入 tbl_servicelegalclause 表数据(dmp格式)。 导入思路:使用 dba 创建一个 临时库,先将 tbl_servicelegalclause.dmp(增量的数据) 文件导入到 临时库,然后确认临时库数…...
电脑出现 0x0000007f 蓝屏问题怎么办,参考以下方法尝试解决
电脑蓝屏是让许多用户头疼的问题,其中出现 “0x0000007f” 错误代码更是较为常见且棘手。了解其背后成因并掌握修复方法,能帮我们快速恢复电脑正常运行。 一、可能的硬件原因 内存问题 内存条长时间使用可能出现物理损坏,如金手指氧化、芯片…...
Logback日志框架中的继承机制详解
在Logback框架中,logger的继承机制是基于层级结构(hierarchical context)工作的。每个logger都被分配一个名称,这个名称可以看作是一个路径或目录结构,从而形成了一个逻辑上的树状结构。这种结构使得日志记录具有很强的…...
[Unity]【图形渲染】【游戏开发】Shader数学基础4-更多矢量运算
在计算机图形学和着色器编程中,矢量运算是核心的数学工具之一。矢量用于描述空间中的位置、方向、速度等各种物理量,并在图形变换、光照计算、纹理映射等方面起着至关重要的作用。本篇文章将详细讲解矢量和标量之间的乘法与除法、矢量的加法与减法、矢量的模与单位矢量、点积…...
node.js的异步工作之---回调函数与回调地狱
回调函数:在 Node.js 中,很多 API 都是异步的,通常通过回调函数来处理操作完成后的结果。这种回调模式虽然非常高效,但会导致代码逐渐变得难以维护,尤其是当有多个异步操作嵌套时(即回调地狱)。…...
tcp 的三次握手与四次挥手
问1: 请你说一下tcp的三次握手一次握手两次握手三次握手问: 为什么不四(更多)次握手? 问 2: 请说一下 tcp 的 4 次挥手一次挥手两次挥手问题:能不能等到数据传输完成再返回 ack? 三次挥手四次挥手问: 为什么要等两个最大报文存在时间? bg: tcp 是可靠的连接,如何保证 建立连…...
《三角洲行动》游戏运行时提示“缺失kernel32.dll”:问题解析与解决方案
《三角洲行动》游戏运行时提示“缺失kernel32.dll”:问题解析与解决方案 作为软件开发领域的一名从业者,我深知电脑游戏运行过程中可能遇到的各种挑战,尤其是文件丢失、文件损坏以及系统报错等问题。今天,我将以经典游戏《三角洲…...
Android——自定义按钮button
项目中经常高频使用按钮,要求:可设置颜色,有圆角且有按下效果的Button 一、自定义按钮button button的代码为 package com.fslihua.clickeffectimport android.annotation.SuppressLint import android.content.Context import android.gra…...
Pandas基础学习(1)
之前看的pandas的教材和课程里,内容参差不齐,实际使用很少的方法的内容有点多,导致很乱而且记不住那么多,这个帖子尽量用最少的文字,最精炼的语言来总结比较实用的方法,内容主要来源于《利用python进行数据…...
20241224在Ubuntu20.04.6下给X99平台上的M6000显卡安装驱动程序
20241224在Ubuntu20.04.6下给X99平台上的M6000显卡安装驱动程序 2024/12/24 16:18 下载驱动程序: https://www.nvidia.cn/drivers/lookup/ https://www.nvidia.cn/drivers/results/ https://www.nvidia.cn/drivers/details/237923/ https://www.nvidia.cn/drivers/l…...
批量多线程给TXT文档插入相关腾讯AI【高质量无水印无版权】原创图片
给蜘蛛访问的网站文章插入相关图片,可以带来以下好处: 1、提升用户体验:图片能够直观地展示文章内容,帮助用户更好地理解和消化信息。对于阅读者来说,图文并茂的内容往往更具吸引力,也能提高他们的阅读…...
保护模式基本概念
CPU 架构 RISC(Reduced Instruction Set Computer) 中文即"精简指令集计算机”。RISC构架的指令格式和长度通常是固定的(如ARM是32位的指令)、且指令和寻址方式少而简单、大多数指令在一个周期内就可以执行完毕 CISC&…...
mysql 查询优化之字段建立全文索引
最近在接手一些老项目时发现表设计存在问题导致查询较慢 例如一张旧表的设计: 模糊匹配某个关键字时,需要十几秒左右,而且表的数据量不多 都知道mysql8.0版本InnoDB引擎都支持全文索引了,因此可以在content建立全文索引,但全文索引对中文支持并不完善…...
redis和mysql的区别
Redis是一种非关系型数据库(NoSQL),将数据存储在缓存中,这虽然提高了运行效率,但是保存时间却很短。将数据存储在内存中,因此读写速度非常快,特别适合用于需要高速访问的场景,如缓存…...
【Laravel】接口的访问频率限制器
Laravel 接口的访问频率,你可以在 Laravel 中使用速率限制器(Rate Limiter)。以下是一个详细的步骤,展示如何为这个特定的 API 路由设置速率限制: 1. 配置 RouteServiceProvider 首先,确保在 App\Provide…...
LabVIEW水泵性能测试系统
在现代工业应用中,水泵作为一种广泛使用的流体输送设备,其性能的可靠性对整个生产系统的稳定运行至关重要。通过LabVIEW软件配合专业硬件设备,设计了一套水泵性能测试系统,实现对各类水泵的综合性能测试与分析,提升水泵…...
基于推理的目标检测 DetGPT
基于推理的目标检测 DetGPT flyfish detgpt.github.io 近年来,由于大型语言模型(LLMs)的发展,计算机视觉领域取得了重大进展。这些模型使人类与机器之间能够进行更有效、更复杂的交互,为模糊人类与机器智能界限的新技…...
【Java 基础】-- ArrayList 和 Linkedlist
目录 1. Java 中的 ArrayList 和 LinkedList 简介 ArrayList LinkedList 2. 相同数量级下的内存开销对比 ArrayList 的内存开销 LinkedList 的内存开销 3. 它们的速度对比 总结 1. Java 中的 ArrayList 和 LinkedList 简介 ArrayList 数据结构:基于动态数组…...
电脑不小心删除了msvcr120.dll文件怎么办?“缺失msvcr120.dll文件”要怎么解决?
一、文件丢失与损坏的常见原因及解决办法 1. 不小心删除系统文件 常见情况:有时在清理电脑垃圾文件时,可能会不小心删除一些重要的系统文件,如msvcr120.dll等。解决办法: 恢复文件:如果刚删除不久,可以尝…...
数据结构----链表头插中插尾插
一、链表的基本概念 链表是一种线性数据结构,它由一系列节点组成。每个节点包含两个主要部分: 数据域:用于存储数据元素,可以是任何类型的数据,如整数、字符、结构体等。指针域:用于存储下一个节点&#…...
【面试 - 遇到的问题】Vue 里 router-view 使用 key + 关闭页面后重新打开页面-获取的数据赋值到旧组件问题(钩子执行顺序)
目录 【1】问题描述【2】问题排查前 - 页面渲染、tag 页签渲染 逻辑梳理页面渲染【借用别人的描述】<router-view :key"key" />1. 不设置key 属性2. 设置 key 属性值为 $route.path/page/1 > /page/2/page?id1 > /page?id2, 3. 设置 key 属性值为 $rou…...
Dubbo简单总结
1、dubbo服务暴露的流程 ulr:protocol://username:password@host:port/path?param1=value1¶m2=value2 a、服务的暴露起始于 Spring IOC 容器刷新完毕之后,会根据配置参数组装成 URL, 然后根据 URL 的参数来进行本地或者远程调用。 b、会通过 proxyFactory.getInv…...
智慧社区电商系统:提升用户体验的界面设计
3.1可行性分析 开发者在进行开发系统之前,都需要进行可行性分析,保证该系统能够被成功开发出来。 3.1.1技术可行性 开发该智慧社区电子商务系统所采用的技术是vue和MYSQL数据库。计算机专业的学生在学校期间已经比较系统的学习了很多编程方面的知识&…...
电感降额和选型规范
通常元器件有一个最佳降额范围,在此范围内,元器件工作应力的降低对其失效率的下降有显著的改善,设备的设计易于实现,且不必在设备的质量,体积,成本方面付出大的代价,应按设备可靠性要求…...
STM32HAL库中RTC闹钟设置时分秒,年月日
在STM32的HAL库中,RTC(实时时钟)模块提供了多种功能来管理时间和日期,包括设置闹钟。对于RTC闹钟功能,确实主要集中在时、分、秒的配置上,但年、月、日也可以通过RTC日期寄存器进行设置,并且可以…...
linux-19 根文件系统(一)
之前提到过,linux的目录是一个倒置的树,它通过层次性的方式来组织,管理整个系统的文件,而这本身实际上是通过文件系统。文件系统,大家记得文件系统是内核的主要功能之一, 它的主要目的就是实现本机上的某一…...
kotlin中泛型中in和out的区别
概念含义 in关键字(逆变) 在Kotlin泛型中,in关键字主要用于定义逆变(Contravariance)。它表示一个泛型类型参数可以是指定类型或者它的超类型。简单来说,就是对于类型A和B,如果A是B的子类型&…...
Spring学习(一)——Sping-XML
一、Spring的概述 (一)什么是Spring? Spring是针对bean对象的生命周期进行管理的轻量级容器。提供了功能强大IOC、AOP及Web MVC等功能。Spring框架主要由七部分组成:分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 S…...
设计模式——桥接模式
文章目录 1. 定义2. 结构组成3. 桥接模式结构4. 示例代码5. 模式优势6. 总结 1. 定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的主要目的是将抽象部分与它的实现部分分离,使它们都可以独立地变化。 2. 结构组成 桥接模…...
python Enum类介绍及cls关键字用法详解
文章目录 Enum 类基本用法定制枚举枚举方法枚举类方法 cls 关键字类方法工厂方法总结 在 Python中, Enum 类和 cls 关键字有一些特定的用法和含义。下面我将详细解释它们的用法: Enum 类 Enum 类是Python标准库中的一个类,用于创建枚举&a…...
模型的多GPU并行训练,DDP
DDP全称是DistributedDataParallel, 在torch.nn.parallel里面。 今天总结一下用DDP进行多GPU并行训练的方法, 内容来自build gpt2加上自己的补充。 如果你有多块GPU,就可以充分利用它们。 DDP会创建多个process(进程,不是线程哦&…...
直流有刷电机多环控制(PID闭环死区和积分分离)
直流有刷电机多环控制 提高部分-第8讲 直流有刷电机多环控制实现(1)_哔哩哔哩_bilibili PID模型 外环的输出作为内环的输入,外环是最主要控制的效果,主要控制电机的位置。改变位置可以改变速度,改变速度是受电流控制。 实验环境 【 !】功能简介: 按下KEY1使能电机,按下…...
LabVIEW软件开发的未来趋势
LabVIEW软件开发的未来趋势可以从以下几个方面来分析: 1. 与AI和机器学习的深度结合 趋势:LabVIEW正在向集成AI和机器学习方向发展,尤其是在数据处理、预测性维护和自动化控制领域。 原因:AI技术的普及使得实验和工业场景中的…...
ChatGPT之父:奥尔特曼
奥尔特曼 阿尔特曼一般指萨姆奥尔特曼,他是OpenAI的联合创始人兼首席执行官,被称为“ChatGPT之父”.以下是其具体介绍: 个人经历 1985年4月22日出生于美国芝加哥,8岁学会编程,9岁拥有电脑,对信息技术和互联网产生兴趣.高中就读于约翰巴勒斯中学,后进入斯坦福大学主修计…...
MySQL8.0后的double write有什么变化
什么是double write? 一部分是内存中的double write buffer ,大小为2MB(16k一个页,一共128个页)。 第二部分是磁盘共享表空间的128个数据页,在对脏页进行落盘的时候,并不是直接进行落盘&#x…...
wsl ubuntu Unexpected error from cudaGetDeviceCount
wsl ubuntu Unexpected error from cudaGetDeviceCount 在这里插入图片描述 参考资料: Quad (4x) A6000 WSL2 CUDA Init Errors...
渐开线齿轮和摆线齿轮有什么区别?
摆线齿形与渐开线齿形的区别 虽然在比对这两种齿形,但有一个事情希望大家注意:渐开线齿轮只是摆线齿轮的一个特例。 (1)摆线齿形的压力角在啮合开始时最大,在齿节点减小到零,在啮合结束时再次增大到最大…...
状态图的理解和实践
状态图(State Diagram)是软件工程和系统设计中的一种重要工具,主要用于描述对象在其生命周期中的动态行为。通过状态图,我们可以清晰地看到对象所经历的状态序列、引起状态转移的事件(event)以及因状态转移…...
mysql(基础语法)
准备一张员工表 /*Navicat Premium Data TransferSource Server : localhost_3306Source Server Type : MySQLSource Server Version : 80037 (8.0.37)Source Host : localhost:3306Source Schema : studymysqlTarget Server Type : MySQLTar…...
openjdk17 从C++视角看 String的intern的jni方法JVM_InternString方法被gcc编译器连接
symbols-unix 文件部分内容 JVM_IHashCode JVM_InitClassName JVM_InitStackTraceElement JVM_InitStackTraceElementArray JVM_InitializeFromArchive JVM_InternString 要理解在 symbols-unix 文件中包含 JVM_InternString 方法的原因,我们需要从构建过程、符号…...
金融保险行业数字化创新实践:如何高效落地自主可控的企业级大数据平台
使用 TapData,化繁为简,摆脱手动搭建、维护数据管道的诸多烦扰,轻量替代 OGG, Kettle 等同步工具,以及基于 Kafka 的 ETL 解决方案,「CDC 流处理 数据集成」组合拳,加速仓内数据流转,帮助企业…...
一键打断线(根据相交点打断)——CAD c# 二次开发
多条相交线根据交点一键打断,如下图: 部分代码如下: finally namespace IFoxDemo; public class Class1 {[CommandMethod("ddx")]public static void Demo(){//"ifox可以了".Print();Database db HostApplicationServices.Workin…...
flask基础
from flask import Flask, requestapp Flask(__name__)# app.route(/) # def hello_world(): # put applications code here # return Hello World!app.route(/) # 路由 当用户访问特定 URL 时,Flask 会调用对应的视图函数来处理请求 def index():return …...
Springboot基于Web的高校志愿者服务管理系统81559
Springboot基于Web的高校志愿者服务管理系统81559 本系统(程序**源码数据库调试部署开发环境)带论文文档1****万字以上,文末可获取,系统界面在最后面。** 系统程序文件列表 项目功能: 志愿者,团队,招募机构,团队信息…...
各种网站(学习资源及其他)
欢迎围观笔者的个人博客~ 也欢迎通过RSS网址https://kangaroogao.github.io/atom.xml进行订阅~ 大学指南 上海交通大学生存手册中国科学技术大学人工智能与数据科学学院本科进阶指南USTC不完全入学指南大学生活质量指北科研论 信息搜集 AI信息搜集USTC飞跃网站计算机保研 技…...