Warning: file_get_contents(https://whois.pconline.com.cn/jsLabel.jsp?ip=127.0.0.1) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.1 503 Service Temporarily Unavailable in D:\wwwroot\huidong\wwwroot\function.inc.php on line 884
一码搞懂:EasyX 中显存、COLORREF 如何存储,是否支持透明度? - huidong

huidong

首页 | 会员登录 | 关于争取 2022 寒假做出汇东网 Ver3.0.0 !
搜索文章


我写了一段代码测试 EasyX 的透明度支持

#include <easyx.h>
#include <stdio.h>

int main()
{
    initgraph(640, 480, EX_SHOWCONSOLE);

    printf("测试 EasyX 对透明度的支持 2022.9.23 by huidong 【当前 EasyX 版本:%ls】\n", GetEasyXVer());
    printf("\n");
    printf("绘制步骤\t\t\t显存值\t\t使用 getpixel 得到的 COLORREF 值\n");
    printf("\t\t\t\t0xaarrggbb\t0xaabbggrr\n");
    printf("--------\t\t\t------\t\t------\n");

    DWORD* pBuf = GetImageBuffer();
    printf("默认 IMAGE 背景\t\t\t0x%08X\t0x%08X\n", pBuf[0], getpixel(0, 0));

    setbkcolor(BLUE);
    cleardevice();
    printf("清空为蓝色背景\t\t\t0x%08X\t0x%08X\n", pBuf[0], getpixel(0, 0));

    setbkcolor(0xffaa0000);
    cleardevice();
    printf("清空为不透明蓝色背景\t\t0x%08X\t0x%08X\n", pBuf[0], getpixel(0, 0));

    setfillcolor(BLUE);
    solidrectangle(0, 0, 100, 100);
    printf("绘制蓝色填充矩形\t\t0x%08X\t0x%08X\n", pBuf[0], getpixel(0, 0));

    setfillcolor(0xffaa0000);
    solidrectangle(0, 0, 100, 100);
    printf("绘制不透明蓝色填充矩形\t\t0x%08X\t0x%08X(由此可知,使用非零透明度会导致绘制失败)\n", pBuf[0], getpixel(0, 0));

    printf("\n");
    printf(" _【备注】______________________________________________\n");
    printf("| \n");
    printf("| 以上数据为 (0, 0) 处的色值\n");
    printf("| “蓝色”指宏定义的 BLUE(即 (COLORREF)0x00aa0000,透明度为 0)\n");
    printf("| “不透明蓝色”指 (COLORREF)0xffaa0000\n");
    printf("|_______________________________________________________\n");

    printf("\n");
    printf(" _【总结】______________________________________________\n");
    printf("| \n");
    printf("| EasyX 绘图时不考虑透明度(Alpha)值,颜色宏(如 BLUE,RED)的透明度都是 0(完全透明)。\n");
    printf("| 若手动设置透明度为非零值,大部分绘图函数可能绘制失败(cleardevice 除外),且 getpixel 获取到的色值的透明度一定是 0。\n");
    printf("|_______________________________________________________\n");

    printf("\n");
    printf(" _【说明】______________________________________________\n");
    printf("| \n");
    printf("| 显存中的色值:    0xaarrggbb\n");
    printf("| COLORREF 中的色值:    0xaabbggrr(RGB 反转存储)\n");
    printf("| 使用 EasyX 函数设置颜色时传入的是 COLORREF 值。\n");
    printf("|_______________________________________________________\n");

    closegraph();
    return 0;
}


运行结果:


测试 EasyX 对透明度的支持 2022.9.23 by huidong 【当前 EasyX 版本:20220901】

绘制步骤                                显存值                使用 getpixel 得到的 COLORREF 值
                                            0xaarrggbb         0xaabbggrr
--------                                ------                   ------
默认 IMAGE 背景                   0x00000000      0x00000000
清空为蓝色背景                      0x000000AA      0x00AA0000
清空为不透明蓝色背景            0xFF0000AA      0x00AA0000
绘制蓝色填充矩形                  0x000000AA      0x00AA0000
绘制不透明蓝色填充矩形        0x00000000      0x00000000(由此可知,使用非零透明度会导致绘制失败)

 _【备注】______________________________________________
|
| 以上数据为 (0, 0) 处的色值
| “蓝色”指宏定义的 BLUE(即 (COLORREF)0x00aa0000,透明度为 0)
| “不透明蓝色”指 (COLORREF)0xffaa0000
|_______________________________________________________

 _【总结】______________________________________________
|
| EasyX 绘图时不考虑透明度(Alpha)值,颜色宏(如 BLUE,RED)的透明度都是 0(完全透明)。
| 若手动设置透明度为非零值,大部分绘图函数可能绘制失败(cleardevice 除外),且 getpixel 获取到的色值的透明度一定是 0。
|_______________________________________________________

 _【说明】______________________________________________
|
| 显存中的色值:        0xaarrggbb
| COLORREF 中的色值:   0xaabbggrr(RGB 反转存储)
| 使用 EasyX 函数设置颜色时传入的是 COLORREF 值。
|_______________________________________________________



返回首页


Copyright (C) 2018-2024 huidong