利用gdi绘制动态正弦曲线

Mr_MAO 1天前 104

// 利用 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();
最新回复 (2)
  • nanyi 1天前
    0 2
    效果不错
  • 光庆 1天前
    0 3

返回