多个图片加载的问题及添加一个每个界面都能显示的界面(改用另一个函数已解决)

0

操作系统win11,vs2022
两个问题,一个是多个图片加载的问题,另一个是加一个在每个界面都能显示的界面充当物品栏
因为我刚接触easyx库,不会的很多所以希望能给出代码或者详细讲解

IMAGE page[52];
string filename;
for (int i = 1; i <= 52; i++)
{
filename = "pp(" + to_string(i) + ").png";
const char* file = filename.c_str();
loadimage(&page[i], file);
addPage(&page[i]);
}
不知道为啥我写了这个之后出了字符串转换报错E304,再把字符集改为使用多字节字符集之后其他的代码报错了
或者说这个代码哪有问题吗

上面这段代码逐个加载图片添加界面,但是变成黑色的了,后来改为下面这一段同学的电脑能用,但是我的还是黑色的界面不知道为什么
wchar_t filename[50];
IMAGE* Bpage;
for (int i = 0; i < 3; i++)
{
    swprintf_s(filename, L"pp (%d)", i + 1);
    Bpage = new IMAGE{ width,height };
    loadimage(Bpage, filename, width, height);
    addPage(Bpage);
}
delete Bpage;
 

 #include <cmath>
#include <vector>
#include <iostream>
#include <functional>
#include <string>
using namespace std;

//图形库
#include<graphics.h>
#include <conio.h>
#include<stdio.h>
#include<easyx.h>

//按钮类
class Button
{
private:
	int x, y, width, height; //按钮位置和大小
	float scale; //缩放比例
	bool isMouseOver;//判断鼠标是否悬停按钮
	wstring text; //按钮文本
	function<void()> onClick;	//点击触发的函数
public:
	//构造函数
	Button(int x, int y, int width, int height, const wstring& text, const function<void()>& onClick) : x(x), y(y), width(width), height(height), text(text), onClick(onClick), scale(1.0f), isMouseOver(false) {}
	//检查鼠标是否在按钮上方
	void checkMouseOver(int mouseX, int mouseY)
	{
		isMouseOver = (mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + height);
		if (isMouseOver) scale = 0.9f;
		else scale = 1.0f;		//悬停缩放,不悬不变
	}
	//检查鼠标点击是否在按钮内
	bool checkClick(int mouseX, int mouseY)
	{
		if (mouseX >= x && mouseX <= x + width && mouseY >= y && mouseY <= y + height)
		{
			onClick();
			isMouseOver = false;
			scale = 1.0f;
			return true;
		}
		return false;
	}
	//按钮图标绘制
	void draw()
	{
		int scaleWidth = width * scale;
		int scaleHeight = height * scale;
		int scaledX = x + (width - scaleWidth) / 2;
		int scaledY = y + (height - scaleHeight) / 2;
		if (isMouseOver)  //鼠标悬停与不悬停的按钮图标绘制状态
		{
			setlinecolor(RGB(41, 36, 33));
			setfillcolor(RGB(128, 138, 135));
		}
		else
		{
			setlinecolor(BLACK);
			setfillcolor(RGB(11, 23, 70));
		}
		fillrectangle(scaledX, scaledY, scaledX + scaleWidth, scaledY + scaleHeight);
		settextcolor(WHITE);
		setbkmode(TRANSPARENT);
		settextstyle(20 * scale, 0, _T("微软雅黑"));  //设置按钮文本颜色大小字体
		int textX = scaledX + (scaleWidth - textwidth(text.c_str())) / 2;
		int textY = scaledY + (scaleHeight - textheight(text.c_str())) / 2;
		outtextxy(textX, textY, text.c_str());
	}
};

//图形用户界面
class FuncModule
{
private:
	int width, height, currentIndex;//长宽及当前页面索引
	vector<IMAGE*> pages; //存储所有页面的图片指针
	vector<vector<Button*>> buttons;
	//存储每个页面上的按钮,buttons是一个放有很多vector<Button*>类型的容器对象,相当于buttons里面有很多指向不同页的button,而该页的button里又有很多小but指向不同按钮
	//添加一个页面
	void addPage(IMAGE* page)
	{
		pages.push_back(page); //push_back将元素添加到容器末尾
		buttons.push_back({});
	}
	//在指定页面上添加一个按钮
	void addButton(int index, Button* button)
	{
		if (index >= 0 && index < buttons.size())
		{
			buttons[index].push_back(button);
			//index是指定页面,button是要添加的按钮
		}
	}
	//设置当前页面索引
	void setCurrentIndex(int index)
	{
		if (index >= 0 && index < pages.size())
		{
			currentIndex = index;
		}
	}
	//处理鼠标点击事件
	void mouseClick(int mouseX, int mouseY)
	{
		if (currentIndex >= 0 && currentIndex <= buttons.size())
			for (Button* button : buttons[currentIndex]) //遍历for(a:array)
			{
				if (button->checkClick(mouseX, mouseY))
					break;
				//循环遍历当前页面所有的按钮,等待鼠标点击的消息出现后退出
			}
	}
	//处理鼠标移动事件
	void mouseMove(int mouseX, int mouseY)
	{
		if (currentIndex >= 0 && currentIndex <= buttons.size())
			for (Button* button : buttons[currentIndex])
			{
				button->checkMouseOver(mouseX, mouseY);
			}
	}
	//绘制当前页面内容
	void draw()
	{
		if (currentIndex >= 0 && currentIndex <= pages.size())
		{
			putimage(0, 0, pages[currentIndex]); // 在窗口中绘制当前页面的图片
			if (currentIndex >= 0 && currentIndex < buttons.size())
			{
				for (Button* button : buttons[currentIndex]) { button->draw(); }//绘制当前页面的所有按钮
			}
		}
	}
public:
	//构造函数和析构函数
	FuncModule(int width, int height) :width(width), height(height), currentIndex(-1) {}
	~FuncModule() {}
	
	/*添加一个有按钮有背景的页面,函数重载,根据页面按钮样式要求选择使用
	   ScenarioName: 所放背景图片的图名,以  L“xxx.xxx”   的格式
	   index: 本页面的标号,按钮要添加到本页面
	   buttonIndex:  本次添加按钮将要跳转的页面, buttonindex后面跟的数字表示这是第几个按钮的跳转关系	*/
	void addButtonPage(const wstring& ScenarioName, int index, int x, int y, const wstring& text, int buttonIndex);
	void addButtonPage(const wstring& ScenarioName, int index, int x1, int y1, const wstring& text1, int buttonIndex1, int x2, int y2, const wstring& text2, int buttonIndex2);
	void addButtonPage(const wstring& ScenarioName, int index, int x1, int y1, const wstring& text1, int buttonIndex1, int x2, int y2, const wstring& text2, int buttonIndex2, int x3, int y3, const wstring& text3, int buttonIndex3);
	

	//初始化控件,创建图形环境,设置页面和按钮
	void init()
	{
		initgraph(width, height);			//创立窗口
		/*
		//创建页面1
		IMAGE* page1 = new IMAGE(width, height);
		loadimage(page1, _T("./test.jpg"), width, height);
		addPage(page1); //添加页面1
		//在页面1创建按钮1
		Button* button1_1 = new Button(300, 100, 200, 50, L"开始", [&]() {setCurrentIndex(1); });
		//点击按钮1时切换页面2。[&]() {setCurrentIndex(1); }是lambda表达式--作用:点击触发函数
		addButton(0, button1_1);//按钮1添加到页面1
		//页面1创建按钮2
		Button* button1_2 = new Button(300, 200, 200, 50, L"测试", [&]() {setCurrentIndex(2); });
		//点击按钮2切换页面3
		addButton(0, button1_2);
		Button* button1_3 = new Button(300, 300, 200, 50, L"验证", [&]() {setCurrentIndex(3); });
		addButton(0, button1_3);
		*/
		addButtonPage(L"./test.jpg", 0, 300, 200, L"开始", 3, 300, 300, L"测试1", 2, 300, 400, L"测试2", 1);


		//创建页面2
		IMAGE* page2 = new IMAGE(width, height);
		setfillcolor(RGB(255, 192, 203)); //设置页面2背景色
		solidrectangle(0, 0, width, height);
		getimage(page2, 0, 0, width, height);//绘制页面2的背景矩形并将其内容保存到图片中
		addPage(page2);
		//页面2创建按钮1
		Button* button2_1 = new Button(350, 200, 100, 50, L"返回", [&]() {setCurrentIndex(0); });
		addButton(1, button2_1); //按钮1添加到页面2

		//创建页面3
		IMAGE* page3 = new IMAGE(width, height);
		setfillcolor(RGB(245, 222, 179));
		solidrectangle(0, 0, width, height);
		getimage(page3, 0, 0, width, height);
		addPage(page3);
		Button* button3_1 = new Button(350, 200, 100, 50, L"返回", [&]() {setCurrentIndex(0); });
		addButton(2, button3_1); //按钮1添加到页面3

		//创建页面4
		addButtonPage(L"./test.jpg", 3, 400, 200, L"返回!", 0);



		setCurrentIndex(0); //设置初始显示页面为页面1
	}

	//运行,进入消息循环
	void run()
	{
		ExMessage msg;	//定义消息
		BeginBatchDraw();//开始批量绘制,执行后任何绘图操作都暂时不输出到绘图窗口
		//直到执行FlushBatchDraw()或 EndBatchDraw()才将之前的绘图输出,以保证画面流畅度
		while (true)
		{
			if (peekmessage(&msg))
			{
				int mouseX = msg.x;
				int mouseY = msg.y; //获取鼠标x,y坐标
				switch (msg.message)
				{
				case WM_LBUTTONDOWN: //鼠标左键按下
					mouseClick(mouseX, mouseY);
					break;
				case WM_MOUSEMOVE:	//处理鼠标移动,如果在按钮上方按钮会有变化
					mouseMove(mouseX, mouseY);
					break;
				}
			}
			draw(); //在窗口绘制当前页面
			FlushBatchDraw(); //缓冲区内容显示在屏幕上
			Sleep(10); //让当前线程暂停执行一段时间,延时操作
		}
		EndBatchDraw(); //结束批量绘制
	}
	void close()
	{
		closegraph();
	}
};

//添加一个按钮的页面;   x,y为按钮要安放在图片中的位置
void FuncModule::addButtonPage(const wstring& ScenarioName, int index, int x, int y, const wstring& text, int buttonIndex)
{
	IMAGE* page1 = new IMAGE(width, height);
	loadimage(page1, ScenarioName.c_str(), width, height);
	addPage(page1);
	Button* button1 = new Button(x, y, 200, 50, text, [&, buttonIndex]() {setCurrentIndex(buttonIndex); 	});
	addButton(index, button1);
}
//添加两个按钮的页面
//x1,y1,x2,y2: 分别为两个按钮的位置
void FuncModule::addButtonPage(const wstring& ScenarioName, int index, int x1, int y1, const wstring& text1, int buttonIndex1, int x2, int y2, const wstring& text2, int buttonIndex2)
{
	IMAGE* page1 = new IMAGE(width, height);
	loadimage(page1, ScenarioName.c_str(), width, height);
	addPage(page1);
	Button* button1 = new Button(x1, y1, 200, 50, text1, [&, buttonIndex1]() {setCurrentIndex(buttonIndex1); });
	Button* button2 = new Button(x2, y2, 200, 50, text2, [&, buttonIndex2]() {setCurrentIndex(buttonIndex2); });
	addButton(index, button1);
	addButton(index, button2);
}
//添加三个按钮的页面
//x1,y1,x2,y2,x3,y3: 分别为三个按钮的位置
void FuncModule::addButtonPage(const wstring& ScenarioName, int index, int x1, int y1, const wstring& text1, int buttonIndex1, int x2, int y2, const wstring& text2, int buttonIndex2, int x3, int y3, const wstring& text3, int buttonIndex3)
{
	IMAGE* page1 = new IMAGE(width, height);
	loadimage(page1, ScenarioName.c_str(), width, height);
	addPage(page1);
	Button* button1 = new Button(x1, y1, 200, 50, text1, [&, buttonIndex1]() {setCurrentIndex(buttonIndex1); });
	Button* button2 = new Button(x2, y2, 200, 50, text2, [&, buttonIndex2]() {setCurrentIndex(buttonIndex2); });
	Button* button3 = new Button(x3, y3, 200, 50, text3, [&, buttonIndex3]() {setCurrentIndex(buttonIndex3); });
	addButton(index, button1);
	addButton(index, button2);
	addButton(index, button3);
}




int main()
{
	FuncModule widget(800, 600);
	widget.init();
	widget.run();
	_getch();
	widget.close();
	return 0;
}
 
ava
伽冥花呦🌸

2023-12-18

0

看看你的pp(xxx).png文件在哪里,是否和main.cpp文件(或者其他起到主源文件的文件,名字由你决定)在同一级

ava
Jason Leon

2023-12-18

照片文件我放在同一个文件里也不显示,但是我同学的电脑可以,不知道什么原因 -  伽冥花呦🌸  2023-12-18
技术讨论社区