基于C/C++的easyx图形库教程

news2024/9/21 4:34:59

文章目录:

一:前言 

二:窗口(宽高 背景颜色 窗口标题 弹出对话框)

三:图形绘制(点 线 矩形 圆 椭圆)

四:文字(颜色 大小 背景 位置 打印 文字居中)

五:事件消息

1.键盘事件消息(按键交互 按键异步交互 双缓冲贴图)

demo1 

demo2

2.鼠标事件消息

2.1  利用MOUSEMSG的方法

2.2  利用ExMessage的方法 

3.定时器事件消息

六:图片/贴图(原样贴图 透明贴图 精灵图 双缓冲贴图)

七:背景音乐


一:前言 

官网:EasyX Graphics Library for C++

参考

官方:EasyX 文档 - 基本说明

51:easyx保姆级教程

第三方:EasyX基础入门、番外篇:入门EasyX图形库

下载

安装easyx环境:EasyX Graphics Library for C++——>右上侧点击下载安装在

安装程序会自动检测您已经安装的 VC 版本,并根据您的选择将对应的 .h 和 .lib 文件安装至 VC 的 include 和 lib 文件夹内

编译器 VS或者VC:编译环境:Visual C++ 6.0,Visual Studio 2008 至 Visual Studio 2022 (x86 & x64)

使用

启动 Visual C++,创建一个空的控制台项目(Win32 Console Application),然后添加一个新的代码文件(.cpp),并引用 graphics.h 头文件

// 引用图形库头文件
#include<easyx.h>        //这个是只包含最新的API(函数接口)
#include<graphics.h>     //这个头文件包含了上面的,还包含了已经不推荐使用的函数	
	
#include <conio.h>

int main()	//画圆的例子
{
	initgraph(640, 480);	// 创建绘图窗口,大小为 640x480 像素
	circle(200, 200, 100);	// 画圆,圆心(200, 200),半径 100
	_getch();				// 按任意键继续
	closegraph();			// 关闭绘图窗口
	return 0;
}

二:窗口(宽高 背景颜色 窗口标题 弹出对话框)

#define _CRT_SECURE_NO_WARNINGS 1    //用来消除由于函数的安全性导致的的报错
// 引用图形库头文件
#include<easyx.h>					//这个是只包含最新的API(函数接口)
#include<graphics.h>				//这个头文件包含了上面的,还包含了已经不推荐使用的函数	
#include<stdio.h>                   //getchar的头文件

void change()
{
	//设置图形窗口
		//窗口定义HWND hand	 函数GetHWnd()获取窗口信息
		HWND hnd = GetHWnd();

		//设置窗口标题内容SetWindowTex(类型变量名,修改内容)
		SetWindowText(hnd,"很高兴认识你");

	//设置提示窗口:MessageBox(类型变量名,提示内容)
    int is_ok = MessageBox(hnd,"我是消息框","要不要关闭我",MB_OKCANCEL);

		if(is_ok == IDOK)
		{
			printf("你点击了OK\n");
		}
		else if(is_ok == IDCANCEL)
		{
			printf("你点击了cancel\n");
		}
}


int main()
{
	/*创建窗口函数:initgraph(宽度,高度)*/
	/*窗口的左上角是坐标原点,x轴向右增大,y轴向下增大,不包括标题栏*/
	initgraph(520, 520);//宽520,高520
	//initgraph(520, 520,SHOWCONSOLE);//宽520,高520

	
	/*设置背景颜色:默认为黑色*/
	setbkcolor(WHITE);
	/*清除系统之前默认的黑色背景*/
	cleardevice();

	change();//调用

	/*缓冲函数getchar()让窗口得以持续显示*/
	getchar();

	/*关闭窗口函数:closegraph()*/
	closegraph();
	return 0;
}

三:图形绘制(点 线 矩形 圆 椭圆)

#define _CRT_SECURE_NO_WARNINGS 1    //用来消除由于函数的安全性导致的的报错
// 引用图形库头文件
#include<easyx.h>					//这个是只包含最新的API(函数接口)
#include<graphics.h>				//这个头文件包含了上面的,还包含了已经不推荐使用的函数	
#include<stdio.h>                   //getchar的头文件
int main()
{
	/*创建窗口函数:initgraph(宽度,高度)*/
	/*窗口的左上角是坐标原点,x轴向右增大,y轴向下增大,不包括标题栏*/
	initgraph(520, 520);//宽520,高520

	
	/*设置背景颜色:默认为黑色*/
	setbkcolor(WHITE);
	/*清除系统之前默认的黑色背景*/
	cleardevice();

	//设置线条的函数setlinecolor(颜色):线条颜色默认为白色
	setlinecolor(BLACK);
		//画圆形
			//画一个圆(圆心的横坐标,圆心的纵坐标,圆的半径)
			circle(50, 50, 50);

			//填充背景颜色setfillcolor(颜色):默认为白色
			setfillcolor(BLUE);
				//有边框实心圆fillcircle(圆心的横坐标,圆心的纵坐标,圆的半径)
				fillcircle(50, 150, 50);//有边框

				//无边框的实心圆solidcircle(圆心的横坐标,圆心的纵坐标,圆的半径)
				solidcircle(50, 250, 50);//无边框

		//点:putpixel(x,y,color);
			putpixel(100,100,BLUE);

		//线
			//line(x1,y1,x2,y2); //起始坐标,终止坐标
			//可以使用getwidth() gethight()获取窗口的宽度和高度
			line(10,10,80,80);
			//设置线条颜色setlinecolor()
			setlinecolor(BLUE);
			//样式setlinestyle(样式,宽度);
				/*样式
				#define	PS SOLID			0
				#define	PS DASH				1
				#define	PS DOT				2
				#define	PS DASHDOT			3
				#define	PS DASHDOTDOT		4
				#define	PS NULL				5
				#define	PS INSIDEFRAME		6
				#define	PS USERSTYLE		7	
				#define	PS ALTERNATE		8
				#define PS STYLE MASK		0x0000000F*/
			setlinestyle(8,8);

		//正矩形
			//左上角坐标,右下角坐标---->无填充矩形rectangle(x1,y1,x2,y2);   
			rectangle(150,150,250,250); 
			
			//颜色填充setfillcolor(); 
			setfillcolor(BROWN); 
				//填充矩形
				//fillrectangle();  

				//无边框填充矩形solidrectangle(); 
				//solidrectangle();    

		//圆角矩形
			//roundrect(x1,y1,x2,y2,宽度,高度);
			roundrect(200,200,300,300,10,10);
			//fillroundrect()和solidroundrect()

		//椭圆ellipse(x1,y1,x2,y2);矩形左上角和右下角坐标,椭圆就是该矩形的内切
			ellipse(150,150,250,450);
			//fillellipse()和solidellipse()


	/*缓冲函数getchar()让窗口得以持续显示*/
	getchar();

	/*关闭窗口函数:closegraph()*/
	closegraph();
	return 0;
}

四:文字(颜色 大小 背景 位置 打印 文字居中)

#define _CRT_SECURE_NO_WARNINGS 1    //用来消除由于函数的安全性导致的的报错
// 引用图形库头文件
#include<easyx.h>					//这个是只包含最新的API(函数接口)
#include<graphics.h>				//这个头文件包含了上面的,还包含了已经不推荐使用的函数	
#include<stdio.h>                   //getchar的头文件
int main()
{
	/*创建窗口函数:initgraph(宽度,高度)*/
	/*窗口的左上角是坐标原点,x轴向右增大,y轴向下增大,不包括标题栏*/
	initgraph(520, 520);//宽520,高520

	
	/*设置背景颜色:默认为黑色*/
	setbkcolor(WHITE);
	/*清除系统之前默认的黑色背景*/
	cleardevice();



	//设置文字颜色settextcolor(颜色):文字的颜色默认为白色
	settextcolor(RED);//文字格式为红色

	//设置文字大小settextstyle(高度,宽度 如果为0则自动匹配,字符的形式比如楷体宋体)
	settextstyle(20, 0, "楷体");//文字的大小,紧凑程度,字体的样式

	//设置当前字体的颜色setcolor(颜色)
	setcolor(GREEN);

	//设置字体的背景setbkmode(颜色):背景默认为白色会掩盖其他物体
	setbkmode(TRANSPARENT);		//透明

	//显示位置:fillrectangle(矩形左部 x 坐标,矩形顶部 y 坐标,矩形右部 x 坐标,矩形底部 y 坐标)
	;

	//打印文字outtextxy(文字的横坐标,文字的纵坐标,文字的内容)
	outtextxy(100, 100, "文字在图形的居中显示1");

	//文字在图形的居中显示
		//initgraph(520, 520)	fillrectangle(100, 100, 500, 500)
		//求字体的宽度与高度
		char arr[] = "文字在图形的居中显示1";

		int width = textwidth(arr);
		int height = textheight(arr);


		//求所加坐标的值
			//所加x坐标的值
			int x = (520 - width) / 2;
			//所加y坐标的值
			int y = (520 - height) / 2;

		outtextxy(x, y, "文字在图形的居中显示2");
	

	/*缓冲函数getchar()让窗口得以持续显示*/
	getchar();

	/*关闭窗口函数:closegraph()*/
	closegraph();
	return 0;
}

五:事件消息

1.键盘事件消息(按键交互 按键异步交互 双缓冲贴图)

demo1 

#define _CRT_SECURE_NO_WARNINGS 1    //用来消除由于函数的安全性导致的的报错
// 引用图形库头文件
#include<easyx.h>					//这个是只包含最新的API(函数接口)
#include<graphics.h>				//这个头文件包含了上面的,还包含了已经不推荐使用的函数	
#include<stdio.h>                   //getchar的头文件
#include<conio.h>					//键盘

int main()
{
	/*创建窗口函数:initgraph(宽度,高度)*/
	/*窗口的左上角是坐标原点,x轴向右增大,y轴向下增大,不包括标题栏*/
	initgraph(520, 520,SHOWCONSOLE);//宽520,高520,这里的第三个参数为显示控制台窗口

	
	/*设置背景颜色:默认为黑色*/
	setbkcolor(WHITE);


	int x = 200, y = 300;

	//这个函数用于开始批量绘图:执行后,任何绘图操作都将暂时不输出
	void BeginBatchDraw();

	while (1)
	{
		/*清除系统之前默认的黑色背景*/
		cleardevice();
		//填充红色背景
		setfillcolor(RED);
		//无边框实心圆
		solidcircle(x, y, 50);

		//停止闪烁:这个函数用于执行未完成的绘制任务。比EndBatchDraw更稳定
		FlushBatchDraw();
	
	//第一种 按键交互:键盘响应ascll码值
			//获取键盘信息_kbhit()			头文件:conio.h
			/*if (_kbhit())
			{
				//输出键盘信息:_getch()		头文件:conio.h
				char key = _getch();

				printf("%d %c\n", key, key);//可以获取键的ASCII值
				switch (key)
				{
				case 72://上键的ASCII值
					y -= 5;
					break;
				case 80://下键的ASCII值
					y += 5;
					break;
				case 75://左键的ASCII值
					x -= 5;
					break;
				case 77://右键的ASCII值
					x += 5;
					break;
				}
			}*/

	//第二种 键盘异步交互:方法调用(更加丝滑)
			if (GetAsyncKeyState(VK_UP))
			{
				y--;
			}
			if (GetAsyncKeyState(VK_DOWN))
			{
				y++;
			}
			if (GetAsyncKeyState(VK_LEFT))
			{
				x--;
			}
			if (GetAsyncKeyState(VK_RIGHT))
			{
				x++;
			}
	}
	
	

	/*缓冲函数getchar()让窗口得以持续显示*/
	getchar();

	/*关闭窗口函数:closegraph()*/
	closegraph();
	return 0;
}

demo2

#define _CRT_SECURE_NO_WARNINGS 1    //用来消除由于函数的安全性导致的的报错
// 引用图形库头文件
#include<easyx.h>					//这个是只包含最新的API(函数接口)
#include<graphics.h>				//这个头文件包含了上面的,还包含了已经不推荐使用的函数	
#include<stdio.h>                   //getchar的头文件
#include<time.h> 
#include<conio.h>					//阻塞函数getch()不需要回车确认输入
 
//球定义
struct Ball
{
	int x;
	int y;
	int r;
	//增量
	int dx;
	int dy;
};
struct Ball ball={400,400,15,5,-4};
struct Ball myball={500,500,15,5,5};

//画球
void DrawBall(struct Ball ball){
	setfillcolor(RED);
	solidcircle(ball.x,ball.y,ball.r);
}
//定时器:去控制自动移动东西			#include<time.h> 
//			时间间隔	id
int Timer(int duration,int id){
	//开始时间
	static int startTime[10];
	//结束时间
	int endTime=clock();			//clock()统计程序运行到当前代码的时间

	if (endTime-startTime[id]>duration)
	{
		startTime[id]=endTime;
		return 1;
	}
	return 0;
}
//移动球(自己动)
void MoveBall(){
	//相撞		左壁			右壁
	if(ball.x-ball.r<=0||ball.x+ball.r>=800){
		ball.dx=-ball.dx;	//反射:增量发生变化
	}
	//相撞		上壁			下壁
	if(ball.y-ball.r<=0||ball.y+ball.r>=800){
		ball.dy=-ball.dy;
	}


	ball.x +=ball.dx;
	ball.y -=ball.dy;
}
//按键交互:移动球(按键控制)会发生阻塞
void KeyDown(){
	//获取用户按键
	int userKey=_getch();
	switch (userKey)
	{
		case 'w':
		case 'W':
		case 72:
			myball.y -=5;
			break;
		case 's':
		case 'S':
		case 80:
			myball.y +=5;
			break;
		case 'a':
		case 'A':
		case 75:
			myball.x -=5;
			break;
		case 'd':
		case 'D':
		case 77:
			myball.x +=5;
			break;
	}
}
//键盘异步交互:不会发生阻塞
void KeyDown2(){
	if (GetAsyncKeyState(VK_UP))
	{
		myball.y -=5;
	}
	if (GetAsyncKeyState(VK_DOWN))
	{
		myball.y +=5;
	}
	if (GetAsyncKeyState(VK_LEFT))
	{
		myball.x -=5;
	}
	if (GetAsyncKeyState(VK_RIGHT))
	{
		myball.x +=5;
	}
}


int main()
{
	/*创建窗口函数:initgraph(宽度,高度)*/
	/*窗口的左上角是坐标原点,x轴向右增大,y轴向下增大,不包括标题栏*/
	initgraph(800, 800);
	/*设置背景颜色:默认为黑色*/
	setbkcolor(WHITE);
	/*清除系统之前默认的黑色背景*/
	cleardevice();
 
	//开始双缓冲贴图:解决一闪一闪的问题
	BeginBatchDraw();
		//控制移动
		while (1)
		{
			//刷新
			cleardevice();
			//先画球
			DrawBall(ball);
			DrawBall(myball);
			if(Timer(20,0))
				//球自己移动球
				MoveBall();
	
			//鼠标控制球移动
			//if (_kbhit())	//判断阻塞:判断存在按键再去处理
			//{
			//	KeyDown();
			//}

			//if(Timer(20,1))
				//键盘异步交互
				KeyDown2();
		
			//Sleep(20);		//休眠一下	也是阻塞函数

			//显示每一帧
			FlushBatchDraw();
		}
	//结束双缓冲贴图
	EndBatchDraw();




	/*缓冲函数getchar()让窗口得以持续显示*/
	 getchar();
	/*关闭窗口函数:closegraph()*/
	closegraph();
	return 0;
}

2.鼠标事件消息

2.1  利用MOUSEMSG的方法

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>
#include<conio.h>

int main()
{
	initgraph(520, 520,SHOWCONSOLE);
	setbkcolor(BLACK);
	cleardevice();
	while (1)
	{
		//判断有无鼠标信息
		if (MouseHit())
		{
			//读取鼠标信息
				//鼠标信息的类型:MOUSEMSG
				//定义变量(举例):MOUSEMSG msg;
				//读取鼠标信息的函数:GetMouseMsg()
				MOUSEMSG msg = GetMouseMsg();

			//消息处理
			switch (msg.uMsg)								//获取当前鼠标消息
			{

			 case WM_LBUTTONDOWN:							//鼠标左键
				outtextxy(200, 200, "鼠标左键");			
				printf("左键坐标(%d,%d)", msg.x, msg.y);			//msg.x获取鼠标的横坐标	msg.y获取鼠标的纵坐标
				break;
			 case WM_RBUTTONDOWN:							//鼠标右键
				outtextxy(100, 100, "鼠标右键");		
				printf("右键坐标(%d,%d)", msg.x, msg.y);
				break;
			case WM_MBUTTONDOWN:							//中键按下
				printf("中键按下\n");
				break; 
			case WM_MOUSEWHEEL:								//滚轮滑动
				printf("%d滚轮滑动\n",msg.wheel);   
                 //获取滚轮滑动方向,正朝屏幕,负朝自己
				break;
			case WM_MOUSEMOVE:								//鼠标移动
				printf("鼠标移动\n");
				break;
			}
		}
	}
	getchar();
	closegraph();
	return 0;
}

/*MOUSEMSG结构体
	struct MOUSEMSG	
	{		
		UINT uMsg;				获取当前鼠标消息
		bool mkCtrl :l;			Ctrl 键是否按下
		bool mkShift :l;		Shift 键是否按下
		bool mkLButton :l;		鼠标左键是否按下
		bool mkMButton :l;		鼠标中键是否按下
		bool mkRButton :l;		鼠标右键是否按下
		short x;				当前鼠标 x 坐标
		short y;				当前鼠标 坐标
		short wheel;			鼠标滚轮滚动值 (120 的倍数)
	}*/

2.2  利用ExMessage的方法 

#define _CRT_SECURE_NO_WARNINGS 1    //用来消除由于函数的安全性导致的的报错
// 引用图形库头文件
#include<easyx.h>					//这个是只包含最新的API(函数接口)
#include<graphics.h>				//这个头文件包含了上面的,还包含了已经不推荐使用的函数	
#include<stdio.h>                   //getchar的头文件
 
 

int main()
{
	initgraph(800, 600,SHOWCONSOLE);
	//setbkcolor(WHITE);
	cleardevice();
 
	//定义ExMessage类型的变量去存储鼠标消息
		ExMessage msg;		 	  

	while (true)
	{
		//获取鼠标消息peekmessage(&变量)
		while (peekmessage(&msg))
		{
			//讨论鼠标消息
			switch (msg.message)	//区分鼠标消息的类型:msg.message
			{
			//鼠标的当前坐标:msg.x  msg.y
			case WM_LBUTTONDOWN:
				circle(msg.x,msg.y,10);
				break;
			case WM_RBUTTONDOWN:
				rectangle(msg.x-5,msg.y-5,msg.x+5,msg.y+5);
				break;
			}
		}
	}


	getchar();
	closegraph();
	return 0;
}

3.定时器事件消息

#include<time.h> 


//定时器:去控制自动移动东西			#include<time.h> 
//			时间间隔	id
int Timer(int duration,int id){
	//开始时间
	static int startTime[10];
	//结束时间
	int endTime=clock();			//clock()统计程序运行到当前代码的时间

	if (endTime-startTime[id]>duration)
	{
		startTime[id]=endTime;
		return 1;
	}
	return 0;
}


int main()
{
	/*创建窗口函数:initgraph(宽度,高度)*/
	/*窗口的左上角是坐标原点,x轴向右增大,y轴向下增大,不包括标题栏*/
	initgraph(800, 800);
	/*设置背景颜色:默认为黑色*/
	setbkcolor(WHITE);
	/*清除系统之前默认的黑色背景*/
	cleardevice();

    //调用
    if(Timer(20,0))
		//球自己移动球
		MoveBall();//这是一个你自己写的方法

	/*缓冲函数getchar()让窗口得以持续显示*/
	 getchar();
	/*关闭窗口函数:closegraph()*/
	closegraph();
	return 0;
}

六:图片/贴图(原样贴图 透明贴图 精灵图 双缓冲贴图)

图片需要和程序放在一个路径之下 

#define _CRT_SECURE_NO_WARNINGS 1    //用来消除由于函数的安全性导致的的报错
// 引用图形库头文件
#include<easyx.h>					//这个是只包含最新的API(函数接口)
#include<graphics.h>				//这个头文件包含了上面的,还包含了已经不推荐使用的函数	
#include<stdio.h>                   //getchar的头文件
 
 

int main()
{
	initgraph(800, 600,SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();
 
	//原样贴图
		//定义图片变量去表示图片
		IMAGE mage;
		//读取加载图片:loadimage(图片地址,"图片路径 相对 绝对",int nwidth缩放的宽度,int nheight缩放的高度)
		loadimage(&mage, "./images/bk.png",800,600);
		//显示图片:putimage(图片的横坐标,图片的纵坐标,图片地址)
		putimage(0, 0, &mage);
	
	//透明贴图(去掉一张图片原本的背景):通过图像的颜色二进制运算达到去背景效果
		//要处理扣图片:黑白背景
		IMAGE test[2];
		//掩码图加载
		loadimage(test+0,"./images/1.png",800,600);
		//背景图加载
		loadimage(test+0,"./images/2.png",800,600);
		//贴图
		putimage(100,100,test+0,SRCAND);		//贴掩码图
		putimage(100,100,test+1,SRCPAINT);		//贴背景图

    //双缓冲贴图:解决一闪一闪的问题
        //在BeginBatchDraw();    和     EndBatchDraw();写代码
        //键盘事件消息demo2中有举例

	getchar();
	closegraph();
	return 0;
}

精灵图(drawImg报错)后面修改

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
#include<mmsystem.h>				//包含多媒体接口,一定放在graphics.h下面
#pragma comment(lib,"winmm.lib")	//预处理指令接口连接库
#include<easyx.h>					//这个是只包含最新的API(函数接口)
#include<graphics.h>				//这个头文件包含了上面的,还包含了已经不推荐使用的函数	
#include<stdio.h>                   //getchar的头文件
#include<time.h> 

 
int main()
{
	initgraph(500, 500,SHOWCONSOLE);
	setbkcolor(WHITE);
 	cleardevice();

	//精灵动画:一排有很多照片实现动画
	IMAGE img_sheet;
	loadimage(&img_sheet,"./images/wugui.jpg");

	const int frameDelay=1000/60;
	int frameStart=0;
	int frameTime=0;
	int imgsize=32;		//每帧的尺寸
	int frames=7;		//精灵的个数
	int speed=200;		//速度毫秒
	int index=0;		//下标:贴那一张图片

	while (true)
	{
		frameStart=clock();
		BeginBatchDraw();
		cleardevice();
		drawImg(250,250,imgsize,imgsize,&img_sheet,index * imgsize,0);
		
		EndBatchDraw();

		index=(clock()/speed)%frames;

		frameTime = clock() - frameStart;
		if (frameDelay-frameTime>0) //16 -10 = 6 >0
		{
			Sleep(frameDelay-frameTime);
		}

	getchar();
	closegraph();
	return 0;
}

七:背景音乐

#define _CRT_SECURE_NO_WARNINGS 1
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
#include<mmsystem.h>				//包含多媒体接口,一定放在graphics.h下面
#pragma comment(lib,"winmm.lib")	//预处理指令接口连接库
 
 
void BGM()
{
   //读取音乐:文件为.mp3为后缀才可播放,要把音乐拷贝到项目所在文件夹里
		//打开音乐	//0,0,0为默认输出控制台
			mciSendString("open ./images/ha.wav alias bgm", 0, 0, 0);	
			//mciSendString("open ./images/ha.wav", 0, 0, 0);		

		//播放音乐	重复播放repeat
			mciSendString("play bgm repeat", 0, 0, 0);
			//mciSendString("play ./images/ha.wav", 0, 0, 0);

		//设置音量大小	0~1000
			mciSendString("setaudio bgm volume to 10",NULL,0,NULL);	

		//专门用来播放音效					表示路径是文件名  异步
			PlaySound("./images/ha.wav",NULL,SND_FILENAME|SND_ASYNC);

		if (0)
		{
			mciSendString("test./images/ha.wav",0, 0, 0);
		}
} 
 
int main()
{
	initgraph(500, 500,SHOWCONSOLE);
	setbkcolor(WHITE);
 	cleardevice();


	BGM();//调用


	getchar();
	closegraph();
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1527818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态规划(算法竞赛、蓝桥杯)--单调队列优化绿色通道

1、B站视频链接&#xff1a;E45 单调队列优化DP 绿色通道_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N5e410; int n,tim,w[N],f[N],q[N];bool check(int m){int h1,t0;for(int i1; i<n; i){while(h<t && f[q[t]]>f[i-…

鸿蒙Harmony应用开发—ArkTS声明式开发(绘制组件:Line)

直线绘制组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Line(value?: {width?: string | number, height?: string | number}) 从API version 9开始&#xff0c;该接…

巧用眼精星一键批量识别营业执照为结构化Excel

在现代社会&#xff0c;数字化办公已成为企业管理的重要方式之一。而在处理营业执照等票证文件时&#xff0c;如何高效准确地进行识别和管理也显得尤为重要。眼精星票据识别系统作为一款优秀的OCR识别软件&#xff0c;为用户提供了便捷快速的解决方案。接下来&#xff0c;我们将…

Java安全基础 关键概念过关

Java安全基础 关键概念汇总 文章目录 Java安全基础 关键概念汇总前置知识1.构造器this以及包的使用2.继承3.重写/ 重载 / super4.多态5.区分和equals方法6.toString的使用7.Object的概念8.static,final,代码块static代码块final 9.动态代理10.类的动态加载1)类加载器含义&#…

SpringBoot2.7集成Swagger3

Swagger2已经在17年停止维护了&#xff0c;取而代之的是 Swagger3&#xff08;基于openApi3&#xff09;&#xff0c;所以新项目要尽量使用Swagger3. Open API OpenApi是业界真正的 api 文档标准&#xff0c;其是由 Swagger 来维护的&#xff0c;并被linux列为api标准&#x…

组建公司办公网络

一 认识网络传输介质的分类 网络传输介质主要分为有线传输介质和无线传输介质两大类&#xff0c;它们在网络建设和数据传输中扮演着至关重要的角色。下面是这两类传输介质的详细分类&#xff1a; 有线传输介质 双绞线&#xff08;Twisted Pair&#xff09;&#xff1a;这是最…

作业:基于udp的tftp文件传输实例

#include <head.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <errno.h>#define PORT 69 //服务器绑定的端口号 #define IP "192.168.1.107" //服务器的IP地址int do_download(i…

从WAF到WAAP的研究

对于需要保护Web应用程序和API的企业来说&#xff0c;从WAF到WAAP的转变已成为一种必然趋势。采用WAAP平台可以更为全面和高效地保护Web应用程序和API的安全&#xff0c;同时避免了高昂的维护成本和攻击绕过WAF的风险。 网络安全领域的发展趋势是从WAF到WAAP的转变。WAF作为传…

关系数据库标准语言SQL

1.SQL概述 1.1基本表&#xff08;Base table&#xff09; 实际存储在数据库中的表SQL中一个关系就对应一个基本表基本表可以有若干个索引基本表的集合组成关系模式&#xff0c;即全局概念模式&#xff08;数据的整体逻辑结构&#xff09; 1.2 存储文件 存储文件和相关索引组…

android 顺滑滑动嵌套布局

1. 背景 最近项目中用到了上面的布局&#xff0c;于是使用了scrollviewrecycleview&#xff0c;为了自适应高度&#xff0c;重写了recycleview&#xff0c;实现了高度自适应&#xff1a; public class CustomRecyclerView extends RecyclerView {public CustomRecyclerView(Non…

【氮化镓】利用Ga2O3缓冲层改善SiC衬底AlN/GaN/AlGaN HEMT器件性能

Micro and Nanostructures 189 (2024) 207815文献于阅读总结。 本文是关于使用SiC衬底AlN/GaN/AlGaN高电子迁移率晶体管&#xff08;HEMT&#xff09;的研究&#xff0c;特别是探讨了不同缓冲层对器件性能的影响&#xff0c;以应用于高速射频&#xff08;RF&#xff09;应用。…

MySQL—基本操作

1.创建数据库 ①CREATE DATABASE schooldb; --不进行检查和设置默认字符集 ②CREATE DATABASE IF NOT EXISTS schooldb CHARSET utf8; --进行检查和设置默认字符集 CREATE DATABASE 创建数据库 IF NOT EXISTS 意为当前数据库不存在 CHARSET 意为设置数据库字符集…

文物管理系统|基于SSM框架+ Mysql+Java+ B/S结构的文物管理系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

GitLab/Github从头开始配置秘钥

1、下载git安装包 CNPM Binaries Mirrorhttps://registry.npmmirror.com/binary.html?pathgit-for-windows/ 拉到页面最底部选择 点进文件夹下载32位或者64位的版本&#xff0c;我的是64位就选择64的版本进行安装 2、傻瓜式安装 3、在相应的文件夹右键选择 UserName为你的用…

青海200MW光伏项目 35kV开关站图像监控及安全警示系统

一、背景 随着我国新能源产业的快速发展&#xff0c;光伏发电作为清洁能源的重要组成部分&#xff0c;得到了国家政策的大力扶持。青海作为我国光伏资源丰富地区&#xff0c;吸引了众多光伏项目的投资建设。在此背景下&#xff0c;为提高光伏发电项目的运行效率和安全性能&…

深度学习实战模拟——softmax回归(图像识别并分类)

目录 1、数据集&#xff1a; 2、完整代码 1、数据集&#xff1a; 1.1 Fashion-MNIST是一个服装分类数据集&#xff0c;由10个类别的图像组成&#xff0c;分别为t-shirt&#xff08;T恤&#xff09;、trouser&#xff08;裤子&#xff09;、pullover&#xff08;套衫&#xf…

苹果计划与谷歌合作使用Gemini AI技术,提升iPhone功能,同时探索与OpenAI合作可能性

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

鸿蒙Harmony应用开发—ArkTS声明式开发(绘制组件:Shape)

绘制组件的父组件&#xff0c;父组件中会描述所有绘制组件均支持的通用属性。 1、绘制组件使用Shape作为父组件&#xff0c;实现类似SVG的效果。 2、绘制组件单独使用&#xff0c;用于在页面上绘制指定的图形。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有…

录视频的软件推荐,助力视频内容创作

随着网络技术的发展和在线教育的兴起&#xff0c;录制视频教程的需求日益增加。无论是制作教学课程、分享办公技巧&#xff0c;还是录制游戏过程&#xff0c;一款好用的录屏软件都至关重要。本文将深入介绍三款录视频的软件&#xff0c;帮助读者了解它们的特点和操作步骤&#…

【测试开发学习历程】MySQL条件查询与通配符 + MySQL函数运算(上)

前言&#xff1a; 18日08&#xff1a;56&#xff0c;总要先写完明天的博客&#xff0c;才能安心准备今天或者明天的学习。 半夜爬起来写博客真的好辛苦&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 回归…