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

MFC 简单绘图与文本编辑

目录

一.创建单文档项目

二.消息映射机制

三.WM_PAINT消息触发

四.CVIEW类

五.设备上下文

六.资源类和资源的关系

七.画线,矩形

八.画布

九.画笔

十.画刷

十一.利用TRACE打印日志

十二.文本编程

十三.ID号

十四.菜单栏

十五.菜单命令路由

十六.工具栏


一.创建单文档项目

应用程序选择

文档模板属性

用户界面功能

高级功能

生成的类,会生成 APP,VIEW,DOC,MainFrame

因为这两个项目在同一个解决方案下面,所以把MFCPaint设置为启动项目

编译MFCPaint项目

二.消息映射机制

在 MFCPaintView.h 文件中记录了 MFCPaintView 类的原型,在 MFCPaintView.cpp 中记录 MFCPaintView 类的实现,虚函数的实现,消息映射机制。源码如下:

BEGIN_MESSAGE_MAP(CMFCPaintView, CView)ON_WM_CONTEXTMENU()ON_WM_RBUTTONUP()ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()ON_WM_CREATE()ON_WM_CHAR()
END_MESSAGE_MAP()

一些消息比如 WM_PAINT这样的消息又框架封装,自动处理这个消息映射到OnDraw函数处理,这个函数在CView中是虚函数,MFCPaintView中仍然是虚函数,但在MFCPaintView实例化时进行了实现。还有一些消息的处理需要依赖消息映射表来处理

在 BEGIN_MESSAGE_MAP 宏中,CMFCPaintView 是接收消息的类,而 CView 则是基类。

  1. CMFCPaintView:表示接收消息的类,也称为派生类。在这个例子中,CMFCPaintView 是自定义的视图类,是从 MFC 框架提供的 CView 类派生而来的。CMFCPaintView 类扩展了 CView 类的功能,并可以添加自定义的成员函数、变量和逻辑。

  2. CView:表示基类,也称为父类或者超类。在这个例子中,CView 是 MFC 框架中的一个类,用于实现视图。它提供了一些基本的功能和接口,包括绘图、响应用户输入、窗口管理等。CMFCPaintView 类通过派生自 CView 类,继承了 CView 类的功能,并可以在派生类中进行扩展和自定义。

通过将 CMFCPaintView 作为接收消息的类,我们可以在 CMFCPaintView 类中定义消息处理函数,并将它们与相应的消息进行关联。当窗口接收到对应的消息时,框架会自动调用相应的处理函数来处理该消息。

而 CView 则是作为基类,在宏的第二个参数中提供给 BEGIN_MESSAGE_MAP,它是处理消息的起点,当消息映射表中的消息没有匹配到具体的处理函数时,框架会继续向基类查找,直到找到匹配的处理函数或者到达消息映射表的末尾。这样的设计使得消息处理可以在派生类和基类中灵活地进行组织和划分。

给消息映射表添加映射,MFCPaintView右键,选择属性,选择消息,选择想要添加的消息即可

比如添加 WM_CHAR消息处理,就会在MFCPaintView中添加一个函数

afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);

afx_msg 是 MFC 框架中的一个宏,用于声明一个消息处理函数。在 MFC 中,消息处理函数需要使用 afx_msg 宏进行声明,以便正确连接到消息映射机制。

在MFCPaintView中就会添加一个方法。

三.WM_PAINT消息触发

WM_PAINT 消息是 Windows 操作系统发送给窗口的一个重要消息,它用于通知窗口需要进行绘图操作。当窗口的客户区域(即窗口内部可以进行绘图操作的区域)需要刷新或重绘时,Windows 就会发送 WM_PAINT 消息给窗口,以便窗口进行相应的绘图操作。

WM_PAINT 消息的触发通常由以下几种情况引起:

  1. 窗口首次创建:当一个窗口首次被创建时,Windows 会自动发送 WM_PAINT 消息给窗口,以便对窗口进行初始的绘图操作。

  2. 窗口被激活:当一个窗口从非激活状态转换为激活状态时,Windows 会发送 WM_PAINT 消息给窗口,以便窗口可以重新绘制自己。

  3. 窗口尺寸变化:当窗口的大小发生变化时,Windows 会发送 WM_PAINT 消息给窗口,以便窗口可以根据新的大小来重新绘制自己。

  4. 窗口重叠变化:当窗口与其他窗口发生重叠变化时,或者其他窗口遮盖了部分窗口的客户区域时,Windows 会发送 WM_PAINT 消息给被遮盖的窗口,以便窗口可以重新绘制被遮盖的区域。

  5. 窗口被显式地要求重绘:开发人员可以通过调用 InvalidateRectInvalidateRgn 函数来显式地要求窗口进行重绘操作。当这些函数被调用时,Windows 会发送 WM_PAINT 消息给窗口。

当窗口接收到 WM_PAINT 消息时,通常会执行以下操作:

  1. 开始绘图操作:通过调用 BeginPaint 函数来获取一个设备上下文(DC),以便进行后续的绘图操作。

  2. 绘制内容:使用获取到的设备上下文进行绘图操作,包括绘制图形、文本、图像等。

  3. 结束绘图操作:通过调用 EndPaint 函数来释放设备上下文,并通知系统绘图操作已完成。

在MFC消息映射表没有WM_PAINT的映射,WM_PAINT是如何调用OnDraw()函数处理?

在 MFC 中,如果消息映射表中没有 WM_PAINT 的映射,框架会自动调用 CWnd::DefWindowProc 函数来处理该消息,进而调用 OnPaint 函数来进行绘图操作。所以,即使没有显式地映射 WM_PAINT 消息,我们也可以在 OnDraw 函数中实现窗口绘图。

四.CVIEW类

CView 类是 MFC(Microsoft Foundation Classes)框架中的一个基类,用于实现视图(View)的功能。在 MFC 应用程序中,视图通常用于显示和处理用户界面的可视化部分。

CView 类是从 CWnd 类派生而来的,因此它继承了 CWnd 类的一些基本窗口功能。CView 类主要用于以下几个方面的功能:

  1. 绘图:CView 类提供了 OnDraw 函数用于绘制视图内容。开发人员可以重写该函数,在其中使用 GDI(图形设备接口)绘制图形、文本、位图等。绘图操作可以响应窗口消息(如 WM_PAINT),也可以通过代码触发。

  2. 响应用户输入:CView 类可以处理鼠标、键盘等用户输入消息。开发人员可以重写 OnMouse...、OnKey... 等函数来响应相应的用户输入事件,并执行相应的操作。

  3. 布局管理:CView 类可以用于管理视图的布局。开发人员可以通过调整控件的位置、大小、对齐方式等属性,来控制视图元素的布局和外观。

  4. 与文档类的交互:CView 类通常与文档类(CDocument)紧密相关。视图类负责将文档类中的数据呈现给用户,并将用户的修改反馈给文档类。开发人员可以通过重写 OnUpdate 函数,实现视图的数据更新和刷新。

  5. 与框架交互:CView 类还可以与 MFC 框架中的其他类进行交互,如与窗口类(CFrameWnd)进行通信、与菜单类(CMenu)进行菜单操作、与工具栏类(CToolBar)进行工具条操作等。

也就是说CVIEW主要控制程序的视图元素。使用VS2019时就会自动的生成一个类继承自这个类,我们在编写程序时,只需要注意处理消息即可,在类中对消息处理的实现,最后往往会再调用一个CVIEW中的消息对应处理方法。因为系统往往只会给一次消息,对这个消息可以有多个类进行处理,而且处理都不一样,这就是再调用一次的作用。

五.设备上下文

设备上下文(Device Context,简称 DC)是一个抽象概念,用于表示用于绘图和输出的设备环境。设备上下文封装了与设备相关的绘图表面、画笔、字体、剪辑区域等信息,提供了一组函数和属性,用于在特定设备上进行绘图操作。

设备上下文是由操作系统提供的,它可以代表不同类型的设备,如显示器、打印机、屏幕缓冲区等。每个设备上下文都有自己的属性和功能,可以通过设备上下文进行绘制、填充、剪辑、文本输出等操作。

在 Windows 应用程序开发中,设备上下文通常用于使用 GDI(图形设备接口)进行绘图。GDI 提供了一组函数和数据结构,用于在设备上进行绘图操作。设备上下文是 GDI 中的核心概念,通过设备上下文可以获取和操作设备相关的绘图资源,如画笔、画刷、字体等。

在 MFC(Microsoft Foundation Classes)框架中,设备上下文由 CDC(CDC 类型的指针)表示。CDC 类封装了设备上下文操作的功能,例如绘图、调色板管理、文本输出等。通过获取设备上下文指针,可以使用 CDC 类的成员函数来进行相应的绘图操作。

设备上下文的使用是有一定规则的,例如在使用完设备上下文后,需要释放相关资源,避免资源泄露。通常在获取设备上下文之后,需要调用 ReleaseDC() 或者 DeleteDC() 函数来释放设备上下文。

获取设备上下文

void CMyView::OnDraw(CDC* pDC)
{// 获取设备上下文指针CDC* pDC = GetDC();// 使用设备上下文进行绘图操作// ...// 释放设备上下文资源ReleaseDC(pDC);
}

CDC类中提供了很多系统调用,如获取资源,设置资源等等。

六.资源类和资源的关系

资源则是具体的实际资源,可以是文件、图像、音频、数据库连接等等,它是应用程序所需要的资料或者工具。资源可以以不同的形式存在,例如在内存中、硬盘上、网络上等。它们可以被资源类所管理和操作。

资源类通过对资源进行封装和抽象,提供了一种统一的接口和管理方式,使得应用程序能够更方便地访问和利用资源。资源类可以对资源进行创建、加载、释放、更新等操作,同时还可以提供一些额外的功能,如缓存、安全性控制、多线程支持等。

资源类就像是对资源所用的一些属性等信息进行抽象,可以提供对类实例化设置属性来设置资源的属性,再通过系统调用来使用资源,释放资源。

七.画线,矩形

想要实现画线功能,需要捕捉到鼠标左键摁下,鼠标左键抬起的位置,就可以绘制处一条直线。

还可以实现更复杂的功能,当鼠标左键摁下后,不抬起,鼠标移动,同时会划出一条线跟随鼠标移动。View相关的类是控制界面的绘制,需要在其中写代码

在 MFCPaintView.h 文件中,是MFCPaintView这个类,给该类加上几个属性

	CPoint m_start;// 起始点,用于绘制线条的CPoint m_cur; // 当前点,用于绘制线条CPoint m_ptStop; // 终止点,用于绘制线条BOOL m_bStatus; // 绘制状态,用于绘制线条CString m_strText; // 用户输入的字符串

有意思的时,CPoint这个类是鼠标的坐标,继承自一个结构体

typedef struct tagPOINT
{LONG  x;LONG  y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;

处理鼠标摁下消息,记录线的起始点;处理鼠标移动的消息,记录一下临时值,线的临时终点;处理鼠标抬起的消息,记录线的终点;

现在讨论一下实现的思路:

  • OnLButtonDown()处理鼠标左键摁下,记录起始点;同时设置状态值为TRUE,表示鼠标已经摁下,FALSE,表示鼠标没有抬起;
  • OnMouseMove()处理鼠标移动消息,判断状态值,未抬起。就记录临时重点,调用 InvalidateRect(NULL); 进行界面重绘;
  • OnLButtonUp()处理鼠标左键抬起,记录线的终点,调用 InvalidateRect(NULL); 进行界面重绘,修改状态值;
// CMFCPaintView 消息处理程序void CMFCPaintView::OnLButtonDown(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值m_start = point;m_bStatus = TRUE;CView::OnLButtonDown(nFlags, point);
}void CMFCPaintView::OnLButtonUp(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值m_ptStop = point;//CDC* pDC = GetDC();// 1. 什么是上下文?// 2. 什么是设备上下文?//pDC->MoveTo(m_start);//pDC->LineTo(m_stop);//ReleaseDC(pDC);InvalidateRect(NULL);m_bStatus = FALSE;CView::OnLButtonUp(nFlags, point);
}void CMFCPaintView::OnMouseMove(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值if (m_bStatus){m_cur = point;InvalidateRect(NULL); // 调用OnDraw,界面重回
// 		CDC* pDC = GetDC();
// 		pDC->MoveTo(m_start);
// 		pDC->LineTo(point);
// 		ReleaseDC(pDC);}CView::OnMouseMove(nFlags, point);
}

InvalidateRect(NULL)是一种触发重绘的方法,它可以使窗口客户区域全部无效,并强制触发WM_PAINT消息,以便应用程序对客户区进行重绘。

具体而言,InvalidateRect(NULL)函数会将整个窗口客户区域标记为无效(即需要重新绘制),并记录下这个无效区域的位置和大小。然后,它会向系统发送WM_PAINT消息,以通知应用程序客户区需要重新绘制。

在应用程序收到WM_PAINT消息后,它会根据无效区域的位置和大小,重新绘制客户区。

需要指出的是,InvalidateRect(NULL)函数通常是在需要强制更新整个客户区时使用的,因为它会将整个客户区标记为无效,即使只有一小部分区域需要更新。如果只需要更新某个特定的区域,则可以使用InvalidateRect()函数的其他重载版本,它们可以指定需要更新的区域。

在OnDraw来实现画直线

    // 当像素超过1时,线型会失效CPen pen(PS_DASHDOT, 1, RGB(255, 0, 0));// 返回一个笔CPen* pOldPen = pDC->SelectObject(&pen);CPoint start = m_start, cur = m_cur;start.y--;if (m_bStatus){cur.y--;pDC->MoveTo(m_start);pDC->LineTo(m_cur);pDC->MoveTo(start);pDC->LineTo(cur);}else{cur = m_cur;cur.y--;pDC->MoveTo(m_start);pDC->LineTo(m_cur);pDC->MoveTo(start);pDC->LineTo(cur);}// 还原原来的笔pDC->SelectObject(pOldPen);

绘制矩形

	if (m_bStatus){// 选择NULL就会用上下文的刷子,不选空就会用指定的刷子else{pDC->FillRect(CRect(m_start, m_ptStop), NULL);}

八.画布

在MFC中,画布(Canvas)是指一个表示绘图区域的设备上下文(Device Context,DC),它提供了绘制图形和文本的基本操作。

画布通常与窗口客户区关联,它对应于屏幕上的一个矩形区域,用于绘制窗口的内容。在MFC中,可以通过调用CWnd类的GetDC函数来获取当前窗口客户区的设备上下文句柄,从而获得画布的访问权。

一旦获取了画布的设备上下文句柄,就可以使用GDI(图形设备接口)函数来绘制各种图形和文本。例如,可以使用LineTo函数在画布上绘制一条直线,使用Rectangle函数绘制矩形,使用TextOut函数绘制文本等。

九.画笔

实例化画笔类CPen,并设置到CDC中,会返回以一个旧的画笔

    CPen pen(PS_DASHDOT, 1, RGB(255, 0, 0));// 返回一个笔CPen* pOldPen = pDC->SelectObject(&pen);

绘制完成后,需要恢复

pDC->SelectObject(pOldBrush);

十.画刷

实例化画刷类CBrush,并设置到CDC中,会返回以一个旧的画刷

    CBrush brush(RGB(255, 0, 0)), brush2(RGB(0, 255, 0));CBrush* pOldBrush = pDC->SelectObject(&brush);

绘制完成后,需要恢复

pDC->SelectObject(pOldBrush);

十一.利用TRACE打印日志

	LOGPEN logpen;pOldPen->GetLogPen(&logpen);TRACE("style = %d color = %08x width = %d\r\n",logpen.lopnStyle, logpen.lopnColor, logpen.lopnWidth);

LOGPEN logpen; 是一个定义变量的语句,它声明了一个名为logpen的变量,并指定了它的数据类型为LOGPEN结构体类型。

在Windows GDI中,LOGPEN结构体用于描述一个逻辑画笔的属性,包括画笔样式、宽度和颜色等信息。LOGPEN结构体的定义如下:

typedef struct tagLOGPEN {UINT    lopnStyle;      // 画笔样式POINT   lopnWidth;      // 画笔宽度(当样式为PS_GEOMETRIC时,表示线段两端的宽度)COLORREF lopnColor;     // 画笔颜色
} LOGPEN;

十二.文本编程

模仿写一个文本编辑器

响应字符消息WM_CHAR

void CMFCPaintView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{// TODO: 在此添加消息处理程序代码和/或调用默认值TRACE("%c\r\n", nChar);CClientDC dc(this);m_strText += (TCHAR)nChar;InvalidateRect(NULL);CView::OnChar(nChar, nRepCnt, nFlags);
}

每当接受一个新字符就触发重绘,在OnDraw进行实现

每次都是要遍历真个字符串,未匹配到换行符就放入到sub中;匹配到换行符,把先前sub中的打印出来,同时调用CSIZE的GetTextExtent()方法,获取此时 | 应该放置的位置并调用全局的方法SetCaretPos(sz.cx + 2, y);重置位置。

    CString sub = _T("");int y = 0;for (int i = 0; i < m_strText.GetLength(); i++){if ((m_strText.GetAt(i) == '\n') || (m_strText.GetAt(i) == '\r')){pDC->TextOut(0, y, sub);CSize sz = pDC->GetTextExtent(sub);sub.Empty();y += sz.cy + 2;continue;}sub += m_strText.GetAt(i);}if (sub.IsEmpty() == false)pDC->TextOut(0, y, sub); //Textout()只能显示单行文本CSize sz = pDC->GetTextExtent(sub);//方式一://CPoint pt; //CPoint 是Point的子类//pt.y = y;//pt.x = sz.cx + 2;//SetCarePos(pt.x, pt.y);// 方式二://SetCarePos(CPoint(sz.cx + 2, y));//方式三:::SetCaretPos(sz.cx + 2, y);

CSize sz = pDC->GetTextExtent(sub); 是一个将字符串绘制到设备上下文(pDC)的语句,并返回绘制的文本区域的大小。

十三.ID号

在MFC(Microsoft Foundation Classes)中,资源的ID号用于唯一标识和引用资源。MFC中的资源可以是窗口、对话框、菜单、图标、位图、字符串等。

资源的ID号具有以下作用:

  1. 标识资源:每个资源在MFC中都有一个唯一的ID号,通过ID号可以标识不同的资源。例如,对话框资源有一个ID号,可以通过该ID号在代码中引用对话框资源。

  2. 引用资源:通过资源的ID号,可以在代码中引用并使用该资源。通过调用MFC提供的函数或宏,可以根据资源的ID号加载、显示、修改或处理相应的资源。

  3. 管理资源:通过ID号,可以方便地管理和组织资源。在代码中,可以使用资源的ID号进行资源的加载、卸载、创建等操作,并且可以使用ID号将不同类型的资源关联起来。

  4. 多语言支持:资源的ID号对于实现多语言支持非常重要。通过为不同语言的资源定义不同的ID号,可以根据当前的语言环境加载相应的资源,并实现多语言界面。

十四.菜单栏

在资源视图->IDR_MAINFRAME中可以编辑菜单栏

主菜单是没有ID的;子菜单可以设置

给菜单添加响应函数,在类视图中找打MFCPaintView,选择类向导,选择消息,选择添加处理程序

方法被添加

查看消息映射表,消息翻译为WM_COMMAND再进行区分。

十五.菜单命令路由

有view和doc,触发了view,但是没有触发doc

去掉view类的菜单响应函数,打开doc类的响应函数。触发view类,不触发doc   view>doc

去掉doc类的菜单响应函数,打开框架类的响应函数,触发doc类,不触发app     doc>框架

去掉app类的菜单响应函数,打开app类的响应函数框架》app

响应菜单命令顺序:View> doc >框架 >app

十六.工具栏

工具栏资源就在资源视图 TOOLBAR中

添加一个工具

选中最后一个空的,手动绘制

需要注意,这个需要绘制两个,填入ID,处理方式与菜单一样。

删除工具,拖着方块移出区域即可。

相关文章:

MFC 简单绘图与文本编辑

目录 一.创建单文档项目 二.消息映射机制 三.WM_PAINT消息触发 四.CVIEW类 五.设备上下文 六.资源类和资源的关系 七.画线&#xff0c;矩形 八.画布 九.画笔 十.画刷 十一.利用TRACE打印日志 十二.文本编程 十三.ID号 十四.菜单栏 十五.菜单命令路由 十六.工具…...

C# 中的 SerialPort

简介 C# 中的 SerialPort 类提供了对串行端口&#xff08;如 COM 端口&#xff09;进行通信的功能。通过 SerialPort 类&#xff0c;你可以打开、关闭端口&#xff0c;读取和写入数据以及设置通信参数等。下面是对 SerialPort 类的一些详细解释&#xff1a; 创建 SerialPort 对…...

2022年06月 Python(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 Python中 print(“八进制{: o}”.format(12)) 正确的输出结果是?( ) A: 八进制:O B: 八进制:O14 C: 八进制14O D: 八进制14 答案:D 字符串的format()格式。 第2题 下列的程…...

YOLO图像识别

YOLO&#xff08;you only look once&#xff09;&#xff0c;指只需要浏览一次就可以识别出图中的物体的类别和位置。 也因为只需要看一次&#xff0c;YOLO被称为Region-free方法&#xff0c;相比于Region-based方法&#xff0c;YOLO不需要提前找到可能存在目标的Region。 与…...

2023NewStarCTF

目录 一、阳光开朗大男孩 二、大怨种 三、2-分析 四、键盘侠 五、滴滴滴 六、Include? 七、medium_sql 八、POP Gadget 九、OtenkiGirl 一、阳光开朗大男孩 1.题目给出了secret.txt和flag.txt两个文件&#xff0c;secret.txt内容如下&#xff1a; 法治自由公正爱国…...

计算机网络的发展及应用

计算机网络是计算机技术和通信技术高度发展并相互结合的产物。一方面&#xff0c;通信系统为计算机之间的数据传送提供最重要的支持&#xff1b;另一方面&#xff0c;由于计算机技术渗透到了通信领域&#xff0c;极大地提高了通信网络的性能。计算机网络的诞生和发展&#xff0…...

K-means(K-均值)算法

K-means&#xff08;k-均值&#xff0c;也记为kmeans&#xff09;是聚类算法中的一种&#xff0c;由于其原理简单&#xff0c;可解释强&#xff0c;实现方便&#xff0c;收敛速度快&#xff0c;在数据挖掘、聚类分析、数据聚类、模式识别、金融风控、数据科学、智能营销和数据运…...

网络安全自学

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防…...

加速mvn下载seatunnel相关jar包

seatunnel安装的时候&#xff0c;居然要使用mvnw来下载jar包&#xff0c;而且是从https://repo.maven.apache.org 下载&#xff0c;速度及其缓慢&#xff0c;改用自己本地的mvn下载。 修改其安装插件相关脚本&#xff0c;复制install-plugin.sh重命名为install-plugin-mvn.sh …...

【函数讲解】botorch中的函数 is_non_dominated():用于计算非支配(non-dominated)前沿

# 获取训练目标值&#xff0c;计算Pareto前沿&#xff08;非支配解集合&#xff09;&#xff0c;然后从样本中提取出Pareto最优解。train_obj self.samples[1]pareto_mask is_non_dominated(train_obj)pareto_y train_obj[pareto_mask] 源码 这里用到了一个函数 is_non_dom…...

LeetCode题94,44,145,二叉树的前中后序遍历,非递归

注意&#xff1a;解题都要用到栈 一、前序遍历 题目要求 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[…...

Python 框架学习 Django篇 (九) 产品发布、服务部署

我们前面编写的所有代码都是在windows上面运行的&#xff0c;因为我们还处于开发阶段 当我们完成具体任务开发后&#xff0c;就需要把我们开发的网站服务发布给真正的用户 通常来说我们会选择一台公有云服务器比如阿里云ecs&#xff0c;现在的web服务通常都是基于liunx操作系统…...

Git 服务器上的 LFS 下载

以llama为例&#xff1a; https://huggingface.co/meta-llama/Llama-2-7b-hf Github # 1. 安装完成后&#xff0c;首先先初始化&#xff1b;如果有反馈&#xff0c;一般表示初始化成功 git lfs install ​ # 2. 如果刚刚下载的那个项目没啥更改&#xff0c;重新下一遍&#x…...

Canvas和SVG:你应该选择哪一个?

如果你是一个Web开发者&#xff0c;你可能已经听说过Canvas和SVG。这两种技术都可以用来创建图形和动画&#xff0c;但它们有什么区别&#xff1f;在这篇文章中&#xff0c;我们将探讨Canvas和SVG的区别以及它们的应用场景&#xff0c;帮助你决定哪种技术更适合你的项目。 什么…...

openGauss学习笔记-122 openGauss 数据库管理-设置密态等值查询-密态支持函数/存储过程

文章目录 openGauss学习笔记-122 openGauss 数据库管理-设置密态等值查询-密态支持函数/存储过程122.1 创建并执行涉及加密列的函数/存储过程 openGauss学习笔记-122 openGauss 数据库管理-设置密态等值查询-密态支持函数/存储过程 密态支持函数/存储过程当前版本只支持sql和P…...

BEVFormer 论文阅读

论文链接 BEVFormer BEVFormer&#xff0c;这是一个将Transformer和时间结构应用于自动驾驶的范式&#xff0c;用于从多相机输入中生成鸟瞰&#xff08;BEV&#xff09;特征利用查询来查找空间/时间&#xff0c;并相应地聚合时空信息&#xff0c;从而为感知任务提供更强的表示…...

Centos批量删除系统重复进程

原创作者&#xff1a;运维工程师 谢晋 Centos批量删除系统重复进程 客户一台CENTOS 7系统负载高&#xff0c;top查看有很多sh的进程&#xff0c;输入命令top -c查看可以看到对应的进程命令是/bin/bash     经分析后发现是因为该脚本执行时间太长&#xff0c;导致后续执…...

VUE组件的生命周期

每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤&#xff0c;比如设置好数据侦听&#xff0c;编译模板&#xff0c;挂载实例到 DOM&#xff0c;以及在数据改变时更新 DOM。在此过程中&#xff0c;它也会运行被称为生命周期钩子的函数&#xff0c;让开发者有机会在特定阶…...

【Git系列】Github指令搜索

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

【OpenCV】用数组给Mat图像赋值,单/双/三通道 Mat赋值

文章目录 5 Mat赋值5.1 Mat(int rows, int cols, int type, const Scalar& s)5.2 数组赋值 或直接赋值5.2.1 3*3 单通道 img5.2.2 3*3 双通道 img5.2.3 3*3 三通道 img5 Mat赋值 5.1 Mat(int rows, int cols, int type, const Scalar& s) Mat m(3, 3, CV_8UC3,Scalar…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

【算法训练营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 …...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

ArcPy扩展模块的使用(3)

管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如&#xff0c;可以更新、修复或替换图层数据源&#xff0c;修改图层的符号系统&#xff0c;甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...