让winform中的button控件可以旋转

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

我们可以根据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();

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

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...