让winform中的button控件可以旋转
By
o3o_o3o_o3o
at 2021-08-13 • 1人收藏 • 1356人看过
我们可以根据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-14
#2
第二个问题已经解决。
winform.plus.onDrawContent函数里有graphics,可以直接用graphics来完成控件旋转的效果。
感谢来自站主的自定义漂亮进度条的方法。
文件:
代码:
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();下一步就是编写一个库了!
登录后方可回帖
这个东西有几个缺点:
旋转控件的文本没有居中。
旋转控件有的时候“不好使”(注意鼠标光标):
不好意思露了半张脸……