操作系统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;
}