
// 利用 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; //波长系数
var pt = ::POINTF();
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
)
//v43.1新版onPaint()默认支持双缓冲绘图
winform.onPaint = function(hdc,rcPaint,fErase,width,height){
//填充背景颜色
gdi.selectBrush(
function(hdc,pen,brush){
::FillRect(hdc,::RECT(0, 0, width, height),brush);
},hdc,0x800000
)
//画网格线
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);
}
},hdc,0x13CED1/*color*/,1/*width*/,4/*_PS_DASHDOTDOT*/
)
//定Y轴起点位置
var centerY = height / 2;
//振幅系数 (可随窗体高度变化)
var n2 = centerY / 3;
//画曲线阴影 (可省略)
var offsetX, offsetY = 3, 0;
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(hdc, px, py, pt);
else ::LineTo(hdc, px, py);
}
},hdc,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(hdc, px, py, pt);
else ::LineTo(hdc, px, py);
}
},hdc,0x0000FF/*color*/,3/*width*/,0/*_PS_SOLID*/
)
}
winform.show();
win.loopMessage();