aardio 文档
aardio 范例: OnPaint 自绘示例
import win.ui;
/*DSG{{*/
var winform = win.form(text="OnPaint 自绘示例";right=400;bottom=300)
winform.add()
/*}}*/
/*
GDI 自绘。
onPaint 处理 _WM_PAINT 消息并且自动调用 ::BeginPaint 与 ::EndPaint 。
定义 onPaint 时如果 winform.onEraseBkgnd 为 null 则默认设为 `lambda () 0` 。
除 plus 控件以外所有窗体与控件对象都支持 onPaint 事件,
定义 onPaint 会阻止默认其他绘图操作。
*/
winform.onPaint = function(hdc, rcPaint, fErase, width, height){
//双缓冲优化(说人话就是先在内存画好,再输出到设备)
gdi.doubleBuffer( hdc,width,height,
function( hdc,hMemDc,hMemBitmap ){
// 绘制蓝色矩形(GDI 颜色格式为 0xBBGGRR,所以蓝色是 0xFF0000)
var rect = ::RECT(20, 20, 200, 100);
gdi.fillRect(hMemDc,0xFF0000,rect);
// 绘制文本
var font = ::LOGFONT(name="Tahoma";point=12;color=0x00FF00 )
gdi.textOut(hMemDc,font,"Hello, OnPaint!",30,50)
::BitBlt(hdc, 0, 0, width, height, hMemDc, 0, 0, 0xCC0020/*_SRCCOPY*/);
}
)
//忽略返回值
};
// GDI+ 自绘,plus 控件提供了更多的 GDI+ 自绘事件,但 plus 控件不支持 onPaint 事件
import gdip;
winform.onPaint = function(hdc, rcPaint, fErase, width, height){
var dpiScaleX = winform.dpiScale(1);
// 直接使用传入的 hdc 创建 GDI+ 绘图对象
var graphics = gdip.graphics(hdc);
// 使用双缓冲
var bmp = gdip.bitmap(width, height);
var mGraphics = bmp.getGraphics();
// 绘制蓝色矩形,参数使用 0xAARRGGBB 格式颜色值
var brush = gdip.solidBrush(0xFF0000FF)
mGraphics.fillRoundRect(brush,::RECT(0,0,width, height),8);
brush.delete();
// 字体
var font = gdip.font("Tahoma", 28 * dpiScaleX);
var brushText = gdip.solidBrush(0xFFFFFFFF);
// 对齐格式
var format = gdip.stringformat();
format.align = 1;
format.lineAlign = 1;
// 输出文本
mGraphics.drawString("Hello, OnPaint!",font,::RECTF(0,0,width, height), format, brushText)
// 释放对象
brushText.delete();
format.delete();
font.delete();
mGraphics.delete();
// 输出到设备
graphics.drawImage(bmp)
graphics.delete()
};
winform.show();
win.loopMessage();
Markdown 格式