zouhuidong / HiEasyX

HiEasyX 是基于 EasyX 的扩展库,支持创建多窗口、透明抗锯齿绘图、系统 UI 组件等等。
MIT License
114 stars 21 forks source link

关于无法使用Canvas加载文件图像并绘制的问题 #12

Closed Friman04 closed 1 year ago

Friman04 commented 1 year ago

大一新生,刚学C语言没多久,没学过C++

`/***

define _CRT_SECURE_NO_WARNINGS

include

include

include

define MAX_LEN 4096

include

include

include "HiEasyX.h"

//#include

ifdef UNICODE //设置多字节字符集

undef UNICODE

endif

// 窗体大小

define ASPECT_RATIO 1.778 // 宽高比

define WINDOW_HEI 720 // 窗体高度大小

define WINDOW_WID WINDOW_HEI*ASPECT_RATIO // 窗体宽度大小

define PHI 0.618

define EX_LEFT (PHI - 0.5) / 2

define MID_LEFT (1 - PHI) / 2

// 字体居中

define TOP_LEFT 1

define TOP 2

define TOP_RIGHT 3

define LEFT 4

define CENTER 5

define RIGHT 6

define BOTTOM_LEFT 7

define BOTTOM 8

define BOTTOM_RIGHT 9

char token; // 未使用

typedef struct { char id[16]; char pwd[20]; int value1; int value2; int sex; }user;

typedef struct {int x, y;}intPair;

// 函数区

/**

/**

/**

/**

/**

//--------------------------------------------------------------------------------------------------------------------------------- // 出问题的函数 //---------------------------------------------------------------------------------------------------------------------------------

void home() {

hiex::Canvas canvas_main;
//hiex::Scene scene_btn;
//hiex::Layer layer_btn;
//hiex::ImageBlock btn;
hiex::Window wnd(WINDOW_WID, WINDOW_HEI);
wnd.BindCanvas(&canvas_main);
hiex::AutoExit();
HWND hwnd = wnd.GetHandle();

while (1)
{
    /*绘制GUI框架*/

    char root[] = "data";
    struct _finddata_t file;
    intptr_t hFile;
    char buf[MAX_LEN];

    if (_chdir(root)){printf("打开文件夹失败: %s\n", root);}         ///<-------注释掉这行即正常绘制图片

    hFile = _findfirst("*.txt", &file);
    if (hFile == -1)
        printf("没有找到文件!\n");
    while (_findnext(hFile, &file) == 0)
    {
        sprintf_s(buf, MAX_LEN, "%s\\%s", root, file.name);
        printf("%s\n", buf);
    }

    /*
    edit.PreSetStyle(true, false, true);
    edit.Create(hwnd, WINDOW_WID * EX_LEFT, WINDOW_WID * EX_LEFT, WINDOW_WID * (MID_LEFT - EX_LEFT), WINDOW_HEI - WINDOW_WID * EX_LEFT,
        L"Welcome to HiEasyX !\r\n"
        L"\r\n"
        L"Here you will experience the overall upgrade of EasyX.\r\n"
        L"Let's start HiEasyX from the simple sample.\r\n"
        L"\r\n"
        L"What's new in HiEasyX\r\n"
        L"\r\n"
        L">> You could create multi-window application with HiEasyX easily.\r\n"
        L">> You could use HiCanvas, which is a C++ canvas wrapper of EasyX, in the similar way of EasyX.\r\n"
        L">> The best support of Windows system controls integrated in HiEasyX is avalible.\r\n"
        L">> The most easy method to create a tray.\r\n"
        L"etc.\r\n"
    );
    edit.SetFont(26, 0, L"微软雅黑");
    */

    // 背景1
    canvas_main.Clear(true, WHITE);  //设置背景颜色

    // 线条
    canvas_main.SetLineStyle(PS_SOLID, 2);
    canvas_main.SetLineColor(0xEEEEEE);
    canvas_main.Line(WINDOW_WID * MID_LEFT, WINDOW_WID * EX_LEFT, WINDOW_WID * MID_LEFT, WINDOW_HEI); // 分隔资源管理器和绘图区

    // 背景2
    canvas_main.SetFillColor(0x662015);
    canvas_main.FillRectangle(0, 0, WINDOW_WID * EX_LEFT, WINDOW_HEI); // 左侧深蓝色背景
    canvas_main.SetFillColor(0xEFE1CF);
    canvas_main.FillRectangle(0, 0, WINDOW_WID, WINDOW_WID * EX_LEFT); // 顶侧浅蓝色背景

    //logo
    canvas_main.Load_Image_Alpha(L"sprites/logo_light.png", 0, 0, false, WINDOW_WID * EX_LEFT - 1, WINDOW_WID * EX_LEFT - 1, 255U, true);

    // 文字
    textAlign(canvas_main, L"工业数据分析与文件信息管理系统", 36, 0, L"微软雅黑", WINDOW_WID * EX_LEFT, 0, WINDOW_WID * (1 - EX_LEFT), WINDOW_WID * EX_LEFT); // 标题
    textAlign(canvas_main, L"Created by Friman " _SYS_VER_STR_, 16, 0, L"Arial", 0, 0, WINDOW_WID, WINDOW_HEI, BOTTOM_RIGHT, GRAY); // 信息

    // 按钮绘制

    imageAlign_alpha(canvas_main, L"sprites/login.png", 32, 32, WINDOW_WID * (1 - EX_LEFT * 3 / 4), WINDOW_WID * EX_LEFT / 4, WINDOW_WID * EX_LEFT / 2, WINDOW_WID * EX_LEFT / 2);
    REDRAW_WINDOW();
    //按钮控件逻辑

    ExMessage m_msg;
    while (1)
    {   

        m_msg = getmessage(EX_MOUSE);

        if (m_msg.x > WINDOW_WID * (1 - EX_LEFT * 3 / 4) && m_msg.y > WINDOW_WID * EX_LEFT / 4 && m_msg.x < WINDOW_WID * (1 - EX_LEFT / 4) && m_msg.y < WINDOW_WID * EX_LEFT * 3 / 4) // 如果鼠标在这个区间内
        {
            switch (m_msg.message)
            {
                case WM_LBUTTONDOWN:
                {
                    canvas_main.SetFillColor(YELLOW);
                    canvas_main.FillRoundRect(WINDOW_WID * (1 - EX_LEFT * 3 / 4), WINDOW_WID * EX_LEFT / 4, WINDOW_WID * (1 - EX_LEFT / 4), WINDOW_WID * EX_LEFT * 3 / 4, 20, 20);
                    imageAlign_alpha(canvas_main, L"sprites/login.png", 32, 32, WINDOW_WID * (1 - EX_LEFT * 3 / 4), WINDOW_WID * EX_LEFT / 4, WINDOW_WID * EX_LEFT / 2, WINDOW_WID * EX_LEFT / 2);
                    REDRAW_WINDOW();
                    break;
                }
                case WM_LBUTTONUP:
                {
                    textAlign(canvas_main, _T("TEST"), 36, 0, _T("微软雅黑"), 0, 0, WINDOW_WID, WINDOW_WID); //do somthing
                    canvas_main.SetFillColor(BLUE);
                    canvas_main.FillRoundRect(WINDOW_WID * (1 - EX_LEFT * 3 / 4), WINDOW_WID * EX_LEFT / 4, WINDOW_WID * (1 - EX_LEFT / 4), WINDOW_WID * EX_LEFT * 3 / 4, 20, 20);
                    imageAlign_alpha(canvas_main, L"sprites/login.png", 32, 32, WINDOW_WID * (1 - EX_LEFT * 3 / 4), WINDOW_WID * EX_LEFT / 4, WINDOW_WID * EX_LEFT / 2, WINDOW_WID * EX_LEFT / 2);
                    REDRAW_WINDOW();
                    break;
                }
                default:
                {
                    // 鼠标指针经过按钮
                    canvas_main.SetFillColor(LIGHTBLUE);
                    canvas_main.FillRoundRect(WINDOW_WID * (1 - EX_LEFT * 3 / 4), WINDOW_WID * EX_LEFT / 4, WINDOW_WID * (1 - EX_LEFT / 4), WINDOW_WID * EX_LEFT * 3 / 4, 20, 20);
                    imageAlign_alpha(canvas_main, L"sprites/login.png", 32, 32, WINDOW_WID * (1 - EX_LEFT * 3 / 4), WINDOW_WID * EX_LEFT / 4, WINDOW_WID * EX_LEFT / 2, WINDOW_WID * EX_LEFT / 2);
                    REDRAW_WINDOW();
                    break;
                }
            }
        }
        else
        {
            // 默认状态
            canvas_main.ClearRoundRect(WINDOW_WID * (1 - EX_LEFT * 3 / 4), WINDOW_WID * EX_LEFT / 4, WINDOW_WID * (1 - EX_LEFT / 4), WINDOW_WID * EX_LEFT * 3 / 4, 20, 20);
            imageAlign_alpha(canvas_main, L"sprites/login.png", 32, 32, WINDOW_WID * (1 - EX_LEFT * 3 / 4), WINDOW_WID * EX_LEFT / 4, WINDOW_WID * EX_LEFT / 2, WINDOW_WID * EX_LEFT / 2);
            REDRAW_WINDOW();
        }
    }

    hiex::init_end(hwnd);
    break;
}

}

int main() {

home();

getchar();
return 0;

}` 左上角图片不显示 image 左上角t图片显示 image

zouhuidong commented 1 year ago

你给了两张效果图片,我的理解是:第一张是代码实际的运行效果,第二张是你期望的运行效果,对吗?我暂且这么理解。

你问的问题是有关图片加载的问题,但是你却只给代码,不给图片资源,这让我很困扰。我不知道你的图片路径是否正确,也不知道图片是否带有透明度。

以下是我只根据代码进行的推断。 你的代码中有一行:

//logo
canvas_main.Load_Image_Alpha(L"sprites/logo_light.png", 0, 0, false, WINDOW_WID * EX_LEFT - 1, WINDOW_WID * EX_LEFT - 1, 255U, true);

在此处,你调用 Canvas::Load_Image_Alpha 时,设置了参数 bUseSrcColor(也就是最后一个参数)为 true,试试设为 false? 或者,将上面那行代码改为:

// 尝试先把图片加载到 IMAGE 中,再输出到画布
// 如果还是不行,可以打断点看看 imgLogo 到底是否读入了图片
// 若 imgLogo 的宽高为 0,则说明读入失败
IMAGE imgLogo;
loadimage(&imgLogo, L"sprites/logo_light.png");
canvas_main.PutImageIn_Alpha(0, 0, &imgLogo);

如果问题还没有解决,希望你可以把项目打包发出来(打包时记得删去 .vs,debug,release,x64 等无关文件夹),否则,只有源代码,我无法运行你的程序。

zouhuidong commented 1 year ago

我给你写了一个能正确加载图片的示例,以下的压缩包中含有完整的项目,可以直接编译运行。

你可以先对比看看,为什么你的代码不能加载出图片。

HiEasyX-main.zip