让winform中的button控件可以旋转

By o3o_o3o_o3o at 2021-08-13 • 1人收藏 • 455人看过

我们可以根据winform.setPos()函数做出窗口的移动效果,就像分享一个有趣的火柴人

那我们可不可以让窗口(控件)做出旋转的效果?

代码:

import win.ui;
/*DSG{{*/
mainForm = win.form(text="旋转控件";right=959;bottom=591)
mainForm.add(
button={cls="button";text="旋转";left=563;top=237;right=687;bottom=307;z=1}
)
/*}}*/

import gdip;

mainForm.add( 
	btndefault = { 
		cls="button";bottom=20;right=20;left=10;top=10;z=1;text="";id=123;autoResize=false;
	}; 
	btnhover = { 
		cls="button";bottom=2;right=2;left=1;top=1;z=2;text="";id=234;autoResize=false;
	};
	btnactive = { 
		cls="button";bottom=2;right=2;left=1;top=1;z=3;text="";id=234;autoResize=false;
	};
)

var graphics = gdip.graphics(  mainForm )
var pen1 = gdip.pen( 0xFFADADAD, 1, 2/*_GdipUnitPixel*/ );
var pen2 = gdip.pen( 0xFF3995DE, 1, 2/*_GdipUnitPixel*/ );
var pen3 = gdip.pen( 0xFF3879AF, 1, 2/*_GdipUnitPixel*/ );
var brush1 = gdip.solidBrush(0xFFE1E1E1);
var brush2 = gdip.solidBrush(0xFFE5F1FB);
var brush3 = gdip.solidBrush(0xFFCCE4F7);
var brush4 = gdip.solidBrush(0xFF000000);
var family = gdip.family("宋体");
var strformat = gdip.stringformat ( );
strformat.align = 0/*_GdipStringAlignmentNear*/;
var curFont = family.createFont(  20,0/*_FontStyleRegular*/, 2/*_GdipUnitPixel*/)
graphics.smoothingMode = 4/*_GdipSmoothingModeAntiAlias*/ ;
graphics.textRenderingHint = 3/*_GdipTextRenderingHintAntiAliasGridFit*/;
var str = "控件"; 
rclayout = gdip.RECTF(100,100,100,100);
mainForm.btndefault.oncommand = function(id,event){
	graphics.drawRectangle(pen1,100,100,100,100)
	graphics.fillRectangle(brush1,101,101,99,99)
	graphics.drawString(str,curFont,rclayout,strformat,brush4);
}
mainForm.btnhover.oncommand = function(id,event){
	graphics.drawRectangle(pen2,100,100,100,100)
	graphics.fillRectangle(brush2,101,101,99,99)
	graphics.drawString(str,curFont,rclayout,strformat,brush4);
}
mainForm.btnactive.oncommand = function(id,event){  
	graphics.drawRectangle(pen3,100,100,100,100)
	graphics.fillRectangle(brush3,101,101,99,99)
	graphics.drawString(str,curFont,rclayout,strformat,brush4);
	win.msgboxTimeout("旋转控件设置成功","Aardio",500)//oncommand
}
mainForm.btndefault.hide = true
mainForm.btnhover.hide = true
mainForm.btnactive.hide = true

import mouse.hook;

var hook = mouse.hook();

hook.proc = function(msg,x,y,mouseData,injected,flags,timeStamp,extraInfo){
	if( injected ) return;	
	var Fx,Fy = mainForm.getPos(); 
    if(((x-Fx-10>=100)&&(x-Fx-10<=200))&&((y-Fy-37>=100)&&(y-Fy-37<=200))){
		select(msg) {
			case 0x201/*_WM_LBUTTONDOWN*/ {
				mainForm.btnactive.oncommand()
			}
			else {
				mainForm.btnhover.oncommand()
			}
		}
	}
	else {
		mainForm.btndefault.oncommand()
	}
}

mainForm.onClose = function(hwnd,message,wParam,lParam){
    hook.close()
}
import color;
rc = ::RECT(100,100,200,200)
mainForm.button.oncommand = function(id,event){
    graphics.clear(0xFFF0F0F0)
	graphics.rotateRect(rc,30)
	mainForm.btndefault.oncommand()//实际上就是刷新一下画板
	for(hwnd,ctrl in mainForm.eachControlEx() ){
		ctrl.redraw()//把所有控件都刷新一下,避免被画板盖上。
	}
}

mainForm.show(true);
return win.loopMessage();

这个控件我还会持续更新,然后会编写成一个扩展库。大家有什么建议或者什么问题都可以写在评论里并发表。我会慢慢努力的。

3 个回复 | 最后更新于 2021-08-14
2021-08-13   #1

这个东西有几个缺点:

  1. 旋转控件的文本没有居中。

  2. 旋转控件有的时候“不好使”(注意鼠标光标):

不好意思露了半张脸……

2021-08-14   #2

第二个问题已经解决。

winform.plus.onDrawContent函数里有graphics,可以直接用graphics来完成控件旋转的效果。


感谢来自站主的自定义漂亮进度条的方法


文件:

旋转控件.rar

代码:

main.aardio:

import win.ui;
/*DSG{{*/
var mainForm = win.form(text="aardio form";right=488;bottom=397)
mainForm.add(
button={cls="button";text="Button";left=310;top=308;right=403;bottom=360;z=2};
plus={cls="plus";left=51;top=42;right=351;bottom=342;notify=1;z=1}
)
/*}}*/
 
import gdip;
 
var winform = mainForm.loadForm("/res/1.aau");
 
mainForm.button.oncommand = function(id,event){
    winform.angle += 20
}
 
mainForm.wndproc = function(hwnd,message,wParam,lParam){ 
    winform.setPos(mainForm.getPos())
}
 
winform.plus.oncommand = function( id,event ){
    win.msgboxTimeout("旋转控件设置成功!","Aardio",500)
    win.setForeground(mainForm.hwnd)
}
 
winform.plus.onDrawString = function(graphics,text,font,rectf,strformat,brush){
    var brush4 = gdip.solidBrush(0xFF000000);
    var family = gdip.family("宋体");
    var strformat = gdip.stringformat ( );
    strformat.align = 0/*_GdipStringAlignmentNear*/;
    var font = family.createFont(  20,1, 2/*_GdipUnitPixel*/)
    graphics.smoothingMode = 4/*_GdipSmoothingModeAntiAlias*/ ;
    graphics.textRenderingHint = 3/*_GdipTextRenderingHintAntiAliasGridFit*/;
    text = "控件"; 
    rectf = gdip.RECTF(winform.plus.width/2-50,winform.plus.height/2-50,100,100);
    graphics.drawString(text,font,rectf,strformat,brush);
}
 
mainForm.show();
win.loopMessage();

1.aau:

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=488;bottom=397)
winform.add(
button={cls="button";text="Button";left=418;top=328;right=467;bottom=371;z=2};
plus={cls="plus";left=51;top=42;right=351;bottom=342;notify=1;z=1}
)
/*}}*/
import gdip;
import win.ui.layered;
win.ui.layered(winform)
var pen1 = gdip.pen( 0xFFADADAD, 2, 2/*_GdipUnitPixel*/ );
var pen2 = gdip.pen( 0xFF3995DE, 2, 2/*_GdipUnitPixel*/ );
var pen3 = gdip.pen( 0xFF3879AF, 2, 2/*_GdipUnitPixel*/ );
var brush1 = gdip.solidBrush(0xFFE1E1E1);
var brush2 = gdip.solidBrush(0xFFE5F1FB);
var brush3 = gdip.solidBrush(0xFFCCE4F7);
winform.plus.setPos(0,0,400,400)
a = 0;
winform.angle = 0
 winform.plus.onDrawContent = function(graphics,rc,color){
    graphics.rotateRect(rc,winform.angle);
    if(a == 0){
        graphics.drawRectangle(pen1,winform.plus.width/2-50,winform.plus.height/2-50,100,100)
        graphics.fillRectangle(brush1,winform.plus.width/2+1-50,winform.plus.height/2+1-50,100-1,100-1)
    }
    elseif(a == 1) {
        graphics.drawRectangle(pen2,winform.plus.width/2-50,winform.plus.height/2-50,100,100)
        graphics.fillRectangle(brush2,winform.plus.width/2+1-50,winform.plus.height/2+1-50,100-1,100-1)
    }
    elseif(a == 2) {
        graphics.drawRectangle(pen3,winform.plus.width/2-50,winform.plus.height/2-50,100,100)
        graphics.fillRectangle(brush3,winform.plus.width/2+1-50,winform.plus.height/2+1-50,100-1,100-1)
    }
}
winform.plus.onMouseMove = function(wParam,lParam){
    if( wParam & 0x1/*_MK_LBUTTON*/ ){
        a = 2;
    }
    else {
        a = 1;
    }
}
winform.plus.onMouseHover = function(wParam,lParam){
    a = 1;
}
winform.plus.onMouseDown = function(wParam,lParam){
    a = 2;
}
winform.plus.onMouseUp = function(wParam,lParam){
    a = 1;
}
winform.plus.onMouseLeave = function(wParam,lParam){
    a = 0;
}

winform.plus.startAnimation(1,0)

winform.show();
win.loopMessage();
return winform;


2021-08-14   #3

第一个问题已经解决,运用了一些数学上的计算实现了文本居中:

main.aardio的代码更改:

import win.ui;
/*DSG{{*/
var mainForm = win.form(text="aardio form";right=488;bottom=397)
mainForm.add(
button={cls="button";text="Button";left=310;top=308;right=403;bottom=360;z=2};
plus={cls="plus";left=51;top=42;right=351;bottom=342;notify=1;z=1}
)
/*}}*/

import gdip;

var winform = mainForm.loadForm("/res/1.aau");

mainForm.wndproc = function(hwnd,message,wParam,lParam){ 
	winform.setPos(mainForm.getPos())
}

mainForm.button.oncommand = function(id,event){
	winform.angle += 20
}

winform.plus.oncommand = function( id,event ){
	win.msgboxTimeout("旋转控件设置成功!","Aardio",500)
	win.setForeground(mainForm.hwnd)
}

winform.plus.onDrawString = function(graphics,text,font,rectf,strformat,brush){
    var brush4 = gdip.solidBrush(0xFF000000);
	var family = gdip.family("宋体");
	var strformat = gdip.stringformat ( );
	strformat.align = 0/*_GdipStringAlignmentNear*/;
	txtheight = 20
	var font = family.createFont(  txtheight,1, 2/*_GdipUnitPixel*/)
	graphics.smoothingMode = 4/*_GdipSmoothingModeAntiAlias*/ ;
	graphics.textRenderingHint = 3/*_GdipTextRenderingHintAntiAliasGridFit*/;
	str = "这次的文本终于居中了,并且实现了文本的自动换行。";
	var txtwidth = 0;
	i = 0;
	abs = "1"
	while(abs != ""){
    	i = i+1;
		abs = string.charAt(str,i)
	}
	i = i-1;
	for(j=1;i;1){
		strr = string.slice(str,j,j,true)
		byte = string.bytes(strr,1)
		if(byte >= 2){
			txtwidth += txtheight;
		}
		else {
			txtwidth += txtheight/2;
		}
	}
	if(txtwidth >= 100){
	    int,float = math.modf(txtwidth/100)
	    if(float){
	        int = int+1;
	    }
	    txtheight = int*(txtheight+(int-1)*0.5/*增加行距*/);
	    txtwidth = 100+10;
	}
	rectf = gdip.RECTF(winform.plus.width/2-txtwidth/2,winform.plus.height/2-txtheight/2,txtwidth,txtheight);
	text = str;
    graphics.drawString(text,font,rectf,strformat,brush);
}

mainForm.show();
win.loopMessage();

下一步就是编写一个库了!

登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前在学aardio+halcon机器视觉.
AARDIO语言QQ群:70517368
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
C大Aardio论坛:Aar爱好者论坛
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
赞助商:才仁机械




Loading...