easyx-vs制作界面报错,能修改一下程序吗?能得到最后界面的那种

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <conio.h>
#include <malloc.h>
#include <windows.h>
#include <time.h>
#include<easyx.h>
#include<graphics.h>
#include<conio.h>
#include <corecrt_math.h>
class coordination {
    char draw = '*';
public:
    int x = 0;
    int y = 0;

    void disp() { outtextxy(x, y, this->draw); }

    //构造函数
    coordination() {};
    coordination(int x, int y) {
        this->x = x;
        this->y = y;
    }
    //析构函数
    ~coordination() {};
};
void loadimage(
    IMAGE* pDstImg,        // 保存图像的 IMAGE 对象指针
    LPCTSTR pImgFile,        // 图片文件名
    int nWidth = 0,        // 图片的拉伸宽度
    int nHeight = 0,        // 图片的拉伸高度
    bool bResize = false    // 是否调整 IMAGE 的大小以适应图片
);




typedef struct family
{
    char type[20];
    float Getsum;
    char place[20];// 消费地点
    int month;      //月 
    int data;        //日期


}family;
family fam[80];
int menu_select() // 显示该系统所具备的功能
{
    int c;
    do {
        system("cls");// 清屏
        printf("\t\t             欢迎来到家庭支出管理系统 \n");
        printf("\t\t** ** ** ** **  极端简朴的菜单系统  ** ** ** **\n");
        printf("\t\t              |1. 输入消费信息 |\n");
        printf("\t\t              |2. 显示消费情况 |\n");
        printf("\t\t              |3. 消费情况分析 |\n");
        printf("\t\t              |4. 退出系统     |\n");
        printf("\t\t** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **\n");
        printf("\t\t** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **\n\n");
        printf("\t\t\t   请对应选择所需选项 (1-4):");
        scanf_s("%d", &c);
    } while (c < 1 || c>4); // 修改 c>8
    return c;
}
void password() //密码登录部分
{
    char d[6];
    char m[6];
    m[0] = '1', m[1] = '2', m[2] = '3', m[3] = '4', m[4] = '5', m[5] = '6'; // 数组比较
    printf("请输入六位数密码\n"); //输入密码
    for (int n = 0;;) {
        printf("请输入密码\n");
        for (int i = 0;i < 6;i++)
        {
            d[i] = getchar();
            if (d[i] >= '0' || d[i] <= '9' || d[i] >= 'a' || d[i] <= 'z' || d[i] >= 'A' || d[i] <= 'Z')
                putchar('*');

        }
        if (d[0] == m[0] && d[1] == m[1] && d[2] == m[2] && d[3] == m[3] && d[4] == m[4] && d[5] == m[5])
        {
            printf("\n\t\t    密码正确请进行验证\n");break;
        }
        if (d[0] != m[0] || d[1] != m[1] || d[2] != m[2] || d[3] != m[3] || d[4] != m[4] || d[5] != m[5])
            //当密码错误时如下
            printf("\n 密码错误请重新输入");
        if (n > 3)
        {
            printf(" 系统即将关闭撒哟阿拉\n");
            system("pause");
            exit(0);
        }
        n++;
    }
}
void verification_code()  //验证码部分
{
    int p[1] = { 0 };
    int q[1] = {};
    for (int k = 0;;)
    {
        srand(time(NULL));
        printf("验证码为\n");
        p[0] = rand() % 1000; // 产生0-1000的随机数
        printf("%d", p[0]);
        printf(" 请输入验证码");
        scanf_s("%d", &q[0]);
        if (q[0] != p[0])
            printf(" 验证码错误请重新输入");
        else
        {
            printf("\n 欢迎使用\n");
            system("pause");
            break;
        }
        if (k > 3)
        {
            printf("系统即将关闭sayounana!\n");
            system("pause");
            exit(0);
        }

        k++;
    }
}
int Inputitems(family sum[], int n) // 输入消费信息
{
    int i = 0;
    char sign = 'y';//, x[10];
    while (sign != 'n' && sign != 'N')
    {
        printf("\t\t\t    种类 :");
        scanf_s("%s", sum[n + i].type, 20);//printf("\t\t\t%s", sum[n + i].type); // 修改
        printf("\t\t\t    支出(大于0):");
        scanf_s("%f", &sum[n + i].Getsum);//printf("\t\t\t%f", &sum[n + i].Getsum);// 修改
        printf("\t\t\t    地点 :");
        scanf_s("%s", sum[n + i].place, 20);//printf("\t\t\t%s", sum[n + i].place);// 修改
        printf("\t\t\t    月(0~12):");
        scanf_s("%d", &sum[n + i].month);//printf("\t\t\t%d", &sum[n + i].time);// 修改
        printf("\t\t\t    日(0~31):");
        scanf_s("%d", &sum[n + i].data);//printf("\t\t\t%d", &sum[n + i].time);// 修改
        if (sum[n + i].data < 1 || sum[n + i].data>31)
            return false;
        if (sum[n + i].month < 1 || sum[n + i].month>12)
            return false;

        getchar();//修改 用getchar吸收回车符即可,gets(x);
        printf("\t\t\t   需要再次输入吗?(y/n)");
        scanf_s("%c", &sign); // 修改,不需要 \t\t
        i++;
    }
    return(n + i);
}
void Showitems(family sum[], int n)//输出某月份的消费信息
{
    int i = 0, month;
    //FILE* fp;
    printf("请选择月份:");
    scanf_s("%d", &month);
    printf("\t--------------------------------------------------------------\n");
    printf("\t\t种类       支出       地点       月       日\n");
    printf("\t---------------------------------------------------------------\n");
    for (i = 0;i < n;i++)
    {
        if (sum[i].month == month)
            printf("\t\t%-8s %-12f %-8s %-10d %-10d\n", sum[i].type, sum[i].Getsum, sum[i].place, sum[i].month, sum[i].data);
    }
}
void paixu(family sum[], int n) //类别显示函数
{
    int i, j;
    family temp;
    for (i = 0;i < n - 1;i++)
    {
        for (j = 0;j < n - 1 - i;j++)
        {
            if (strcmp(sum[i].type, sum[j].type) == 1)
            {
                temp = sum[j];
                sum[j] = sum[j + 1];
                sum[j + 1] = temp;
            }
            else
            {
                if (strcmp(sum[i].type, sum[j].type) == 0)
                {
                    if (sum[i].Getsum > sum[j].Getsum)
                    {
                        temp = sum[j];
                        sum[j] = sum[j + 1];
                        sum[j + 1] = temp;
                    }
                }
            }
        }
        for (i = 1;i < n + 1;i++)
        {
            if (sum[i - 1].Getsum != 0)
                printf("\t\t\t%-8s %-12f%-8s %-10d %-10d\n", sum[i - 1].type, sum[i - 1].Getsum, sum[i - 1].place, sum[i - 1].month, sum[i - 1].data);
        }
        if (i > 1 && i % 10 == 0)
        {
            printf("\t\t\t-------\n");
            printf("\t\t\t");
            system("pause");
            printf("\t\t\t----\n");
        }
    }
    printf("\t\t\t");
    system("pause");
}

void Analyseitems(family sum[], int n) // 求各种消费类型的金额占总金额的百分比并求收支比例
{
    float total = 0, a = 0, income;
    int i = 0, j = 0, month;
    char type[100][20] = { 0 }; //保存某个月份的所有消费类型
    float tt[100] = { 0 }; //保存消费类型对应的金额
    int nt = 0;
    //FILE* fp;
    printf("请选择月份:");
    scanf_s("%d", &month);
    for (i = 0;i < n;i++)
    {
        if (sum[i].month == month)
        {
            total += sum[i].Getsum;
            for (j = 0;j < nt;j++)
            {
                if (strcmp(type[j], sum[i].type) == 0)
                {
                    tt[j] += sum[i].Getsum;
                    break;
                }
            }
            if (j == nt)
            {
                strcpy(type[nt], sum[i].type);
                tt[nt] = sum[i].Getsum;
                nt++;
            }
        }
    }
    //计算消费类型金额占比
    for (i = 0;i < nt;i++)
        printf("\t\t\t   项目 %-8s   占总比 %-10f%\n", type[i], tt[i] / total);
    printf("消费总额为 %f\n", total);
    printf("请输入本月收入: ");
    scanf_s("%f", &income);
    printf("\t\t\t  本月收支比为 %-10f\n", total / income);
}
void save(family sum[], int n)
{
    FILE* fp = fopen("消费记录.txt", "w");
    for (int i = 0;i < n;i++)
    {
        fprintf(fp, "%s%f%s%d%d\n", sum[i].type, sum[i].Getsum, sum[i].place, sum[i].month, sum[i].data);
    }
    fclose(fp);
}
int readFile(family fm[], int n)
{
    FILE* fp = fopen("消费记录.txt", "r");
    if (fp == 0) {
        printf("文件打开失败\n");
        return 0;
    }
    while (!feof(fp)) {
        if (fscanf(fp, "%s%f%s%d%d", fm[n].type, &fm[n].Getsum, fm[n].place, &fm[n].month, &fm[n].data) == 5)
            n++;
    }
    fclose(fp);
    return n;
}
IMAGE mage;
int main() {

    /*initgraph(600, 400);
    setaspectratio(1, -1);//Y 轴向上为正,设置后,我们还需要修改坐标原点--------------------
    setorigin(300, 200);//修改坐标原点-------------------------------------------------

    setbkcolor(RED);
    settextstyle(20, 0, _T("宋体"));
    cleardevice();


    settextcolor(YELLOW);
    coordination c1 = coordination(100, 300);
    coordination c2 = coordination(300, 300);
    coordination c3 = coordination(400, 300);
    coordination c4 = coordination(100, 100);
    coordination c5 = coordination(130, 200);

    c1.disp();
    c2.disp();
    c3.disp();
    c4.disp();
    c5.disp();

    while (1);

   IMAGE p;                 //定义一个IMAGE类型变量

    loadimage(&p, "图片名");   //从文件中读取一张图片保存到p中
    putimage(int x, int y, &p);//将p中的图像输出在界面上
    initgraph(1000, 625);//---------------------------------

    IMAGE m;
    loadimage(&m, L"Pokemon.jpg");//注意后缀-----------------
    putimage(0, 0, &m);//-----------------------------------


    while (1);
    return 0;




    int a;             //定义一个整型变量

    scanf("%d", &a);    //从控制台读取一个10进制的数据保存在a中

    printf("%d", a);    //将a输出在控制台。*/

    initgraph(2000, 2000, SHOWCONSOLE);
    setbkcolor(WHITE);
    cleardevice();
    IMAGE mage;
    loadimage(&mage, "2.jpg");
    putimage(0, 0, &mage);
    getchar();
    closegraph();




    password();
    getchar();
    verification_code();
    system("cls");
    int n = 0, a = 0;
    int op;
    char c;
    n = readFile(fam, n);
    while (1)
    {
        op = menu_select();
        switch (op) {
        case 1:
            printf("\t\t\t   请输入相应消费情况:\n");
            n = Inputitems(fam, n);
            paixu(fam, n);
            printf("\t\t 需要保存数据吗?y/n!!\n");
            rewind(stdin);
            scanf_s("%c", &c, 1);
            if (c == 'y' || c == 'Y')
                save(fam, n);
            printf("\t\t\t");
            system("pause");
            break;
        case 2:
            printf("\t\t\t 消费情况\n");
            Showitems(fam, n)
                ;
            system("pause");
            break;
        case 3:
            printf("\t\t\t 消费金额分析\n");
            Analyseitems(fam, n);
            system("pause");
            break;
        case 4:
            printf("\t\t\t 你真的要离开我吗?Y/N\n");
            getchar();
            scanf_s("%c", &c);
            if (c == 'y' || c == 'Y') {
                printf("真的要走吗?Y/N\n");
                printf("算了,你滚吧!不需要你选择了\n");
                system("pause");
                exit(0);
            }
            if (c == 'n' || c == 'N') {
                printf("哼,那还不回去初始界面?\n");
                printf("返回初始界面?Y/N\n");
                printf("肯定是返回,我帮你返回了。\n");
                system("pause");
                return 0;
            }
            break;
        }

    }
    return 0;
}


loadimage()函数跟easyX中的重名了,而且你只声明了,没有实现这个函数!!!
修改方法:
(1)把loadimage改名为loadimage_self,并且修改main函数中的调用。
(2)增加loadimage_self函数的实现

img

void loadimage_self(
    IMAGE* pDstImg,        // 保存图像的 IMAGE 对象指针
    LPCTSTR pImgFile,        // 图片文件名
    int nWidth = 0,        // 图片的拉伸宽度
    int nHeight = 0,        // 图片的拉伸高度
    bool bResize = false    // 是否调整 IMAGE 的大小以适应图片
)
{
    //这里添加实现
}

main函数中的修改

img

该回答引用ChatGPT4与博主@晓码自在合作编写:

在使用EasyX制作界面时报错,报错信息为:

error LNK2019: 无法解析的外部符号 _InitGraph@0,该符号在函数 "int __cdecl main(void)" (?main@@YAHXZ) 中被引用

这是链接时的错误,表示main函数中调用了InitGraph函数,但是链接器无法找到InitGraph函数的定义。

出现这个错误的原因通常有两种:

  1. 没有包含EasyX.h头文件:EasyX.h头文件中定义了InitGraph等EasyX库中的函数,如果没有包含该头文件,链接器当然找不到函数定义。
  2. 没有链接EasyX库:即使包含了EasyX.h头文件,如果没有链接EasyX库,链接器也无法找到函数定义。

解决方案也很简单,分两步:

  1. 包含EasyX.h头文件:
c
#include <EasyX.h> 

  1. 链接EasyX库:
  • 对于Dev-C++来说,需要在工程设置中增加libeasyx.a静态库;
  • 对于Visual Studio来说,需要在项目属性中链接easyx.lib。

一般来说,一个简单的EasyX程序框架如下:

c
#include <EasyX.h>

int main() 
{     
    // 初始化图形环境
    InitGraph(640, 480);  
    
    // 绘制代码...
    
    // 关闭图形环境
    closegraph();  
    
    return 0;
}

添加了这两个步骤之后,程序应该就可以正常编译和链接,并运行使用EasyX绘制界面的代码了。

  • 这篇博客: 可视化界面的C/C++推箱子(要装EasyX库)中的 VS中使用EasyX库的效果 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在这里插入图片描述这是c++用EasyX库写出来的推箱子,至于关卡,我设置了3关,关卡可以选择,音乐默认是关的。开始游戏,退出游戏,关卡选择,音乐开关等图标按钮是通过鼠标左键双击来执行的。由于代码比较长,所以我放到GitHub上。GitHub链接

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632