aardio 文档

aardio 窗口绘图基础

对于绘图大致了解一些基础的概念就可以。 学习 aardio 并不是一定要深入学习这些内容,大多时候不需要自己绘图。

一. 绘图接口 #

  1. GDI(Graphics Device Interface)

    GDI 是基础的绘图接口。 aardio 标准库 gdi 用于 GDI 绘图操作,win.ui 库默认会导入 gdi 库。 传统的窗口控件默认使用 GDI 绘图。

  2. GDI+(GDI Plus)

    GDI+ 是新版绘图接口。 标准库 gdip 用于 GDI+ 绘图操作。

    win.ui 默认不会导入 gdip 库。 但 plus 控件基于 gdip(GDI+),而高级选项卡基于 plus 控件。 使用了 plus 控件也会自动导入有关的 gdip.bitmap gdip.graphics 等 GDI+ 常用库。

    aardio 程序用得比较多的是 GDI+ 。

    GDI+ 参考手册

二. 图像

  1. GDI 位图

    GDI 位图与图标与其他系统资源一样通过句柄操作,句柄是一个指针类型的值。 使用位图句柄要仔细查看相关函数的文档,了解什么时候需要手动释放位图。 可使用 ::DeleteObject(hBmp) 释放位图(参数 hBmp 为位图句柄)。

  2. com.picture 图像

    com.picture 可用于加载 JPG,GIF,BMP 等图像, 调用 com.picture 对象的 CopyHandle() 函数可以复制位图并返回位图句柄。 调用 com.picture.fromBitmap() 函数可将位图句柄转换为 com.picture 对象。 picturebox 控件使用 com.picture 加载图像并获取位图句柄。 com.picture 对象会在不需要时自动回收,可选用 com.Release() 函数主动释放。

  3. gdip.bitmap 位图对象

    gdip.bitmap 用于创建GDI+ 位图对象。 可用于加载常用图像格式,例如 JPG,GIF,BMP,并且支持 PNG 以及 PNG 透明度。

    调用 gdip.bitmap 对象的 copyHandle() 函数可以复制位图并返回位图句柄。 调用 gdip.bitmap 构造函数可将参数 @1 指定的位图句柄转换为 gdip.bitmap 对象。 调用 gdip.bitmap 构造函数可将参数 @1 指定的 com.picture 对象转换为 gdip.bitmap 对象。

    gdip.bitmap 对象会在不需要时自动回收,可选用对象的成员函数 dispose() 主动释放

三. 颜色格式

  1. 用于 GDI 的 RGB 颜色值

    RGB 颜色值一般用于 GDI 接口(aardio 标准库:gdi),以及标准控件。

    RGB 颜色值可用 6 位 16 进制数值 0xBBGGRR 表示。 BB 表示蓝色(blue)分量,GG 表示绿色(green)分量,RR 表示红色(red)分量。

    例如 0xFF0000 表示蓝色。

    RGB 颜色值在内存存储格式用 aardio 中用单引号包含的编译时转义字符串表示就是 '\xRR\xGG\xBB'。 用 aardio 结构体表示就是 { BYTE r; BYTE g; BYTE b; },存储顺序都是低位在前。

    数值的存储顺序同样是低位在前,也就是小端字节序(这样记:低位在前,小端在前) 但日常书写数值顺序是高位在前,所以 RGB 颜色值写为数值就是 0xBBGGRR。

    在 Windows 的 GDI 头文件中表示此颜色值的定义为 COLORREF 与 RGB 。

    aardio 窗体设计器中的所有设计时属性里的颜色值(例如 bgcolor, forecolor,color 等 )都使用此 0xBBGGRR 格式,这是因为窗体设计器的属性面板使用 GDI 颜色格式。就算是完全由 GDI+ 实现的 plus 控件也是在初始化时将 bgcolor, forecolor, color 自动转换为使用 GDI+ 的颜色格式(0xAARRGGBB)的 background, foreground, argbColor 等控件属性值。

  2. 用于 GDI+ 的 ARGB 颜色值

    ARGB 颜色值用于 GDI+ 接口(aardio 标准库:gdip),以及基于 GDI+ 的 plus 控件。

    ARGB 颜色可用 8 位 16 进制数值 0xAARRGGBB 表示。 AA 表示 Alpha 值,Alpha 值影响的是透明度,其他表示 RGB 分量。

    例如 0xFFFF0000 表示不透明红色。

    ARGB 颜色值在内存存储格式用 aardio 中单引号包围的编译时转义字符串表示就是 '\xBB\xGG\xRR\xAA'。 用 aardio 结构体表示就是 { BYTE b;BYTE g;BYTE r;BYTE a; } 数值的书写顺序是反过来的,所以写为 0xAARRGGBB 。

    在 Windows 的 GDI+ 头文件中对应这种颜色格式的 ARGB 类型被定义为 DWORD 类型的别名 —— 对应 aardio 原生类型中的 INT 类型( aardio 中大写 INT 为无符号 32 位整数 )。

    在用 aardio 调用 .NET 时,.NET 里的 System.Drawing.Color 颜色值在 aardio 中也会被自动转换为 ARGB 格式颜色数值。

    在 aardio 中调用 plus 控件、高级选项卡等基于 GDI+ 的对象的 skin 函数调整样式方案时,参数里的颜色值都使用此 0xAARRGGBB 格式。

  3. 字符串格式

    aardio 提供 gdi.colorParse() 函数可解析网页兼容的、用字符串表示的颜色代码。 支持 #RGB#RRGGBB#RRGGBBAA 三种格式,#号可省略。

    #RGB#RRGGBB 返回 GDI 兼容的 RGB 值。 #RRGGBBAA 返回 GDI+ 兼容的 ARGB 格式颜色值。

    现代浏览器组件( 例如 web.view )可支持 #RRGGBBAA 格式颜色值,IE 浏览器组(指 web.form )不支持 #RRGGBBAA

    也可以用 gdi.colorStringify() 将颜色值转换为字符串格式。

    这种字符串格式的颜色值一般用在网页代码中,aardio 代码中一般都使用速度更快的数值格式颜色值。

示例:

import win.ui;
/*DSG{{*/
var winform = win.form(text="颜色格式";bgcolor=0xFFFFFF)
winform.add(
static={cls="static";bgcolor=0xFF0000;text="Static";left=192;top=98;right=542;bottom=181;align="center";center=1;font=LOGFONT(h=-32);z=1}
plus={cls="plus";bgcolor=0x0000FF;left=192;top=277;right=542;bottom=360;font=LOGFONT(h=-32);z=2};
)
/*}}*/

//-------------- GDI / 传统控件 --------------

//标准控件的背景色设为 RGB 颜色,格式 0xBBGGRR
winform.static.bgcolor = 0xFF0000;//蓝色

//获取 R,G,B 分量,参数为 RGB 颜色值
var r,g,b = gdi.getRgb(0xFF0000);
//函数名 gdi.getRgb 是 get R,G,B 的缩写。

//R,G,B 分量转换为 RGB 颜色数值(0xBBGGRR)
winform.static.bgcolor = gdi.RGB(r,g,b);

//用字符串转换为 RGB 颜色数值
winform.static.bgcolor = gdi.colorParse("#0000FF");

//颜色值转换为字符串
winform.static.text = gdi.colorStringify(0xFF0000,false);

//字体颜色设为白色
winform.static.color = 0xFFFFFF;

//-------------- GDI+ / plus 控件 --------------

//plus 控件的背景色设为 ARGB 颜色,格式 0xAARRGGBB
winform.plus.background = 0xFFFF0000;

//获取 R,G,B,A 分量,参数为 ARGB 颜色值。 
var r,g,b,a = gdi.getRgba(0xFFFF0000)
//函数名 gdi.getRgba 是 get R,G,B,A 的缩写。

//R,G,B 分量转换为 RGB 颜色数值(0xBBGGRR)
winform.plus.background = gdi.ARGB(r,g,b,a);

//用字符串转换为 ARGB 颜色数值
winform.plus.background = gdi.colorParse("#FF0000FF");

//颜色值转换为字符串
winform.plus.text = gdi.colorStringify(0xFFFF0000,true)

winform.show();
win.loopMessage();

Markdown 格式