滚动文本示例

光庆 8月前 1543

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=379;bottom=74)
winform.add(
plus={cls="plus";left=15;top=15;right=370;bottom=60;bgcolor=0xFFFFFF;font=LOGFONT(h=-21;name='黑体');z=1}
)
/*}}*/

winform.show();

var text = "我是滚动文本"
var w,x = winform.plus.measureString(text).width,0;
var brush = gdip.solidBrush(0xFFFF0000);
var format = gdip.stringformat();
format.lineAlign = 1/*_StringAlignmentCenter*/ ;

winform.plus.onDrawContent = function(graphics,rc,txtColor,rcContent,foregroundColor,font){
	graphics.clear(0xFFF0E68C);
	graphics.textRenderingHint = 4/*_TextRenderingHintAntiAlias*/;
	graphics.drawString(text,font,::RECTF(x,2,w,rc.bottom),format,brush);
	x -= 1;
	if x<-w x=rc.right;
}

winform.plus.setInterval( 
	function(){
		winform.plus.redraw()
	},10 
)

win.loopMessage();

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=554;bottom=74)
winform.add(
plus={cls="plus";left=15;top=15;right=540;bottom=60;bgcolor=0xFFFFFF;font=LOGFONT(h=-21;name='黑体');z=1}
)
/*}}*/

winform.show();

var text = {"习近平出席新疆维吾尔自治区成立70周年庆祝大会",
			"特朗普要求联合国调查“险恶”破坏事件",
			"美国迎来一位最特殊客人 世界哭笑不得",
			"中欧北极航线刚开通 波兰就后悔了",
			"给“第一夫人”送名牌包后 邪教女魔头被抓",
			"欧洲开始对美国武器说“不”",
			index = 1;
			ypos = 0;}
var brush = gdip.solidBrush(0xFFFF0000);
var format = gdip.stringformat();
format.lineAlign = 1/*_StringAlignmentCenter*/ ;

winform.plus.onDrawContent = function(graphics,rc,txtColor,rcContent,foregroundColor,font){
	var next = text.index+1;
	if next>#text next=1;
    graphics.clear(0xFFF0E68C);
    graphics.textRenderingHint = 4/*_TextRenderingHintAntiAlias*/;
    rc.offset(0,text.ypos);
    graphics.drawString(text[text.index],font,::RECTF(rc),format,brush);
    rc.offset(0,rc.height);
    graphics.drawString(text[next],font,::RECTF(rc),format,brush);
}

winform.plus.setInterval( 
    function(){
        text.ypos--;
        if text.ypos<-winform.plus.height {
        	text.ypos=0;
        	text.index++;
        	if text.index>#text text.index=1;
        	win.delay(2000)
        }
        winform.plus.redraw()
    },10
)

win.loopMessage();


最新回复 (7)
  • mfk 8月前
    0 2

  • mfk 8月前
    0 3
    大神精品。 再每行指令上加上注释 对新手更友好了。
  • demo 8月前
    0 4
    能上下定时多条文本滚动吗?新闻那样
  • Mr_MAO 8月前
    1 5

    厉害!学习了!

    照虎画猫,来一个static控件版的跑马灯效果↓

    //横向滚动
    import win.ui;
    /*DSG{{*/
    var winform = win.form(text="滚动 static控件 文本示例1";right=455;bottom=95)
    winform.add(
    static={cls="static";left=48;top=32;right=400;bottom=64;clip=1;color=0x0000FF;db=1;dl=1;dr=1;dt=1;nWrap=1;transparent=1;z=1}
    )
    /*}}*/
    
    import color;
    var colorBack = color.rgb(255,255,0);
    var colorText = color.rgb(255,0,0);
    
    var text = "我是滚动文本" 
    
    var sz = ::SIZE();
    ::Gdi32.GetTextExtentPoint32(::GetDC(winform.hwnd), text, #text/2, sz) 
    var textW = sz.cx;  //计算文本的宽度(像素)
    
    var x = 0;
    winform.static.onDrawItem = function(drawItem){  
        var hdc = drawItem.hDC;
        var rc =  drawItem.rcItem;
        var width = rc.width;
        var height = rc.height;
        gdi.doubleBuffer( hdc,width,height,
            function( hdc,hMemDc,hMemBitmap ){
                gdi.fillRect(hMemDc, colorBack, rc) 
                ::SetTextColor(hMemDc, colorText);
                ::SetBkMode(hMemDc, 1/*_TRANSPARENT*/) 
                var font = ::LOGFONT(h=-18; name='微软雅黑';weight=700;underline=0x0);
                gdi.drawText(hMemDc, font, text, rc.offset(rc.right+x,0), 0x20|0|4)
                ::BitBlt(hdc, 0, 0, width, height, hMemDc, 0, 0, 0xCC0020/*_SRCCOPY*/);
            }
        )
        x--;
        if(x<-(rc.width+textW)) x = 0;
    }
    
    winform.static.setInterval( 
        function(){
            winform.static.redraw()
        },10
    )
    
    winform.static.modifyStyle(,0xD/*_SS_OWNERDRAW*/)
    winform.show();
    win.loopMessage();


    庆大有更新了竖向滚动的例子,也跟着学一下↓

    //竖向滚动
    import win.ui;
    /*DSG{{*/
    var winform = win.form(text="滚动 static控件 文本示例2";right=552;bottom=95;clipch=1)
    winform.add(
    static={cls="static";left=48;top=32;right=511;bottom=64;border=1;clip=1;nWrap=1;transparent=1;z=1}
    )
    /*}}*/
    
    import color;
    var colorBack = color.rgb(255,255,0);
    var colorText = color.rgb(255,0,0);
    
    var texts = {"习近平出席新疆维吾尔自治区成立70周年庆祝大会",
                "特朗普要求联合国调查“险恶”破坏事件",
                "美国迎来一位最特殊客人 世界哭笑不得",
                "中欧北极航线刚开通 波兰就后悔了",
                "给“第一夫人”送名牌包后 邪教女魔头被抓",
                "欧洲开始对美国武器说“不”",
                index = 1;
                ypos = 0;
    }
    
    winform.static.onDrawItem = function(drawItem){  
        var hdc = drawItem.hDC;
        var rc =  drawItem.rcItem;
        var width = rc.width;
        var height = rc.height;
        
        var next = texts.index+1;
        if(next>#texts) next=1;
        gdi.doubleBuffer( hdc,width,height,
            function( hdc,hMemDc,hMemBitmap ){
                gdi.fillRect(hMemDc, colorBack, rc)  
        		var font = ::LOGFONT(h=-18; name='微软雅黑';weight=700;underline=0x1);
        		::SetTextColor(hMemDc, colorText);
        		::SetBkMode(hMemDc, 1/*_TRANSPARENT*/) 
        		gdi.drawText(hMemDc, font, texts[texts.index], rc.offset(10,texts.ypos), 0x20|0|4)
        		gdi.drawText(hMemDc, font, texts[texts.index], rc.offset(0,rc.height), 0x20|0|4)
                ::BitBlt(hdc, 0, 0, width, height, hMemDc, 0, 0, 0xCC0020/*_SRCCOPY*/);
            }
        )
    }
    
    winform.static.setInterval( 
        function(){
            texts.ypos--;
            if(texts.ypos<-winform.static.height){
                texts.ypos=0;
                texts.index++;
                if(texts.index>#texts) texts.index=1;
                win.delay(2000)
            }
            winform.static.redraw()
        },10
    )
    
    
    winform.static.modifyStyle(,0xD/*_SS_OWNERDRAW*/)
    
    winform.show();
    win.loopMessage();
  • 光庆 8月前
    0 6
    demo 能上下定时多条文本滚动吗?新闻那样
    已完成
  • demo 8月前
    0 7
    简直无法用言语表达,厉害
  • nanyi 5小时前
    0 8


    滚动文本加强版

    1. 滚动速度控制;

    2. 滚动次数控制;

    3. 超出画布尺寸文本才滚动,否则则居中显示;

    4. 文本间距控制;

    import win.ui;
    /*DSG{{*/
    var winform = win.form(text="aardio form";right=404;bottom=210)
    winform.add(
    plus={cls="plus";left=10;top=8;right=394;bottom=200;bgcolor=0xFFFFFF;font=LOGFONT(h=-120;name='HarmonyOS Sans SC Black';weight=900);z=1}
    )
    /*}}*/
    
    winform.show();
    
    // ===================== 可调参数 =====================
    
    // 要显示的文本
    var text = "君不见黄河之水天上来,奔流到海不复回。";
    
    // 滚动次数:
    // 0 = 无限滚动
    // 1 = 滚动 1 次后停止
    // 2 = 滚动 2 次后停止
    var scrollMaxCount = 2;
    
    // 每帧移动像素,越大越快
    var scrollStep = 10;
    
    // 刷新间隔,单位 ms
    // 纯界面预览可以 10~20
    // 后面如果要实时发到屏幕,建议 60~120
    var scrollInterval = 60;
    
    // 两段文字之间的间隔
    var scrollGap = 100;
    
    // 第一次开始滚动前停顿时间,单位 ms
    // 例如 1500 = 1.5 秒,2000 = 2 秒
    var scrollStartDelay = 1500;
    
    // 每一轮滚完回到开头后停顿时间,单位 ms
    // 如果只想第一次停顿,设为 0
    var scrollLoopDelay = 0;
    
    // ====================================================
    
    var textWidth = 0;
    var offsetX = 0;
    var scrollCount = 0;
    var needScroll = false;
    var scrollEnabled = true;
    var measured = false;
    var pauseUntilTick = 0;
    
    var brush = gdip.solidBrush(0xFFFFD800);
    
    // 使用 typographic 格式,测量和绘制更接近真实字宽
    var format = gdip.stringFormat.genericTypographic();
    
    // 左对齐
    format.align = 0/*_StringAlignmentNear*/;
    
    // 垂直居中
    format.lineAlign = 1/*_StringAlignmentCenter*/;
    
    // 0x1000 = _StringFormatFlagsNoWrap,不换行
    // 0x4000 = _StringFormatFlagsMeasureTrailingSpaces,测量尾随空格
    format.flags = 0x1000/*NoWrap*/ | 0x4000/*MeasureTrailingSpaces*/;
    
    function resetScroll(){
        textWidth = 0;
        offsetX = 0;
        scrollCount = 0;
        needScroll = false;
        scrollEnabled = true;
        measured = false;
        pauseUntilTick = 0;
    }
    
    function measureTextOnce(graphics,rc,font){
        if(measured) return;
    
        var bound = graphics.measureString(
            text,
            font,
            ::RECTF(0,0,5000,rc.bottom),
            format
        );
    
        if(bound){
            textWidth = math.ceil(bound.width);
        }
        else {
            textWidth = 0;
        }
    
        needScroll = textWidth > rc.right;
        scrollEnabled = needScroll;
        measured = true;
    
        // 文本超宽时,第一次先停顿一段时间,让用户看清开头。
        if(needScroll && scrollStartDelay > 0){
            pauseUntilTick = time.tick() + scrollStartDelay;
        }
    }
    
    winform.plus.onDrawContent = function(graphics,rc,txtColor,rcContent,foregroundColor,font){
        graphics.clear(0xFF000000);
        graphics.textRenderingHint = 4/*_TextRenderingHintAntiAlias*/;
    
        measureTextOnce(graphics,rc,font);
    
        if(!needScroll){
            // 文本没有超过画布:居中显示,不滚动
            format.align = 1/*_StringAlignmentCenter*/;
    
            graphics.drawString(
                text,
                font,
                ::RECTF(0,0,rc.right,rc.bottom),
                format,
                brush
            );
        }
        else {
            // 文本超过画布:强制不换行,横向滚动
            format.align = 0/*_StringAlignmentNear*/;
    
            graphics.drawString(
                text,
                font,
                ::RECTF(offsetX,0,textWidth + 8,rc.bottom),
                format,
                brush
            );
    
            // 画第二份文本,形成连续循环
            if(scrollEnabled){
                graphics.drawString(
                    text,
                    font,
                    ::RECTF(offsetX + textWidth + scrollGap,0,textWidth + 8,rc.bottom),
                    format,
                    brush
                );
            }
        }
    }
    
    winform.plus.setInterval(
        function(){
            // 第一次还没测量时,先触发一次重绘
            if(!measured){
                winform.plus.redraw();
                return;
            }
    
            if(!needScroll || !scrollEnabled){
                return;
            }
    
            // 到达 pauseUntilTick 之前只保持画面,不移动 offsetX。
            if(pauseUntilTick){
                if(time.tick() < pauseUntilTick){
                    return;
                }
                pauseUntilTick = 0;
            }
    
            offsetX -= scrollStep;
    
            // 一轮滚动完成:第一份文本完全移出左侧,并且间隔也滚完。
            if(offsetX <= -textWidth - scrollGap){
                scrollCount++;
    
                if(scrollMaxCount > 0 && scrollCount >= scrollMaxCount){
                    // 达到指定滚动次数:停止,并回到开头
                    scrollEnabled = false;
                    offsetX = 0;
                }
                else {
                    // 下一轮从开头重新开始
                    offsetX = 0;
    
                    // 如果需要每轮开头也停顿,就设置 scrollLoopDelay。
                    if(scrollLoopDelay > 0){
                        pauseUntilTick = time.tick() + scrollLoopDelay;
                    }
                }
            }
    
            winform.plus.redraw();
        },
        scrollInterval
    )
    
    winform.plus.redraw();
    
    win.loopMessage();


返回