
// 利用 gdi 绘制动态正弦曲线 @Mr_MAO
import win.ui;
/*DSG{{*/
var winform = win.form(text="gdi 绘制动态正弦曲线";right=600;bottom=264)
/*}}*/
var arr = {}; //存储曲线坐标点数组
var x = 0; //角度
var m = 10; //每个点的水平间距
var i = 0.25; //波长系数
winform.setInterval(
function(){
// 让角度在 0 到 2*PI/i 之间循环
var period = (2 * math.pi) / i;
x = (x + 1) % period;
var y = math.sin( x * i) ;
// 移除数组第一个元素(左侧),实现向左滚动
if(#arr > winform.clientRect.right / m + 1){
table.remove(arr);
}
table.push(arr, y);
//强制刷新
winform.redraw();
},60
)
var pt = ::POINTF() ;
winform.onPaint = function(hdc,rcPaint,fErase,width,height){
gdi.doubleBuffer( hdc,width,height,
function( hdc,hMemDc,hMemBitmap ){
//填充背景颜色
var hbr = ::CreateSolidBrush(0x800000); //BLACK-BLUE
::FillRect(hMemDc, ::RECT(0, 0, width, height), hbr);
::DeleteObject(hbr);
//画网格线
gdi.selectPen(
function(hdc,pen){
::SetBkMode(hdc, 1/*_TRANSPARENT*/) //消除虚线的背景色
//1画垂直线
for(x=30; width; 30){
::MoveToEx(hdc, x, 0, pt);
::LineTo(hdc, x, height);
}
//2画水平线
for(y=30; height; 30){
::MoveToEx(hdc, 0, y, pt);
::LineTo(hdc, width, y);
}
},hMemDc,0x13CED1/*color*/,1/*width*/,4/*_PS_DASHDOTDOT*/
)
//定Y轴起点位置
var centerY = height / 2;
var n2 = centerY / 3; //振幅系数 (可随窗体高度变化)
//绘制曲线阴影 (可省略)
var offsetX, offsetY = 3, 3;
gdi.selectPen(
function(hdc,pen){
for(k, v in arr){
var px = (k - 1) * m + offsetX;
var py = v * n2 + centerY + offsetY;
if(k == 1) ::MoveToEx(hMemDc, px, py, pt);
else ::LineTo(hMemDc, px, py);
}
},hMemDc,0x333333/*color*/,6/*width*/,0/*_PS_SOLID*/
)
//画正弦波
gdi.selectPen(
function(hdc,pen){
for(k, v in arr){
var px = (k - 1) * m;
var py = v * n2 + centerY;
if(k == 1) ::MoveToEx(hMemDc, px, py, pt);
else ::LineTo(hMemDc, px, py);
}
},hMemDc,0x0000FF/*color*/,3/*width*/,0/*_PS_SOLID*/
)
// 贴图到目标窗口
::BitBlt(hdc, 0, 0, width, height, hMemDc, 0, 0, 0xCC0020/*_SRCCOPY*/);
}
)
}
winform.show();
win.loopMessage();