界面上画虚线框,判断与之相交的控件,并改变名称
By
admin
at 2019-07-17 • 0人收藏 • 1688人看过
这个代码是很早时候写在stm32cube这个网站里的, 最近缅怀下之前写的东西, 觉得这个还是蛮有意义的, 转到这里,希望对界面设计能有点启发作用
.
import win.ui;
import mouse;
/*DSG{{*/
mainForm = win.form(text="aardio form";right=759;bottom=469)
mainForm.add(
button={cls="button";text="button";left=142;top=78;right=275;bottom=123;z=1};
button2={cls="button";text="button2";left=158;top=200;right=301;bottom=251;z=2};
button3={cls="button";text="button3";left=396;top=119;right=542;bottom=177;z=3};
button4={cls="button";text="button4";left=391;top=234;right=537;bottom=292;z=4};
button5={cls="button";text="button5";left=245;top=330;right=391;bottom=388;z=5}
)
/*}}*/
//定义变量x,y,m,n用于记录框选区域坐标,j,k用于临时记录鼠标坐标用于比较,w,h用于记录区域宽和高,flag是鼠标左键按下标志
var x,y,m,n,j,k,w,h;
var flag=false;
mainForm.wndproc = function(hwnd,message,wParam,lParam){
select( message ) {
case 0x201/*_WM_LBUTTONDOWN*/{
flag=true;
//获取鼠标左键按下的窗口坐标
var xx,yy = mouse.getPos();
x,y = win.toClient(hwnd,xx,yy)
m,n = x,y;
}
case 0x202/*_WM_LBUTTONUP*/{
flag=false;
//这个函数如果数值不变再次被调用,那么会删除刚才的虚线框
//实现抬起鼠标删除虚线框功能
::DrawFocusRect(::GetDC(hwnd),::RECT(x,y,m,n));
mainForm.redraw();//强制刷新整个客户区
//遍历所有控件
for(name,ctrl in mainForm.eachControl("button") ){
//如果控件的区域与鼠标拖拽的虚线框相交
if(ctrl.getRect().intersectsWith(::RECT(x,y,m,n)))
{
//为了更好的观察,改变文本内容
ctrl.text = "选中了"
//将选中的控件用虚线框环绕
::DrawFocusRect(::GetDC(hwnd),ctrl.getRect());
}
}
}
case 0x200/*_WM_MOUSEMOVE*/{
if(flag){
//擦除上次画出的虚线框
::DrawFocusRect(::GetDC(hwnd),::RECT(x,y,m,n));
var xxx,yyy = mouse.getPos();
j,k=win.toClient(hwnd,xxx,yyy)
//处理反向拖动
if(j<x+(m-x)/2)
x=j;
else
m=j;
if(k<y+(n-y)/2)
y=k;
else
n=k;
//画出新的虚线框
::DrawFocusRect(::GetDC(hwnd),::RECT(x,y,m,n));
sleep(1);
}
}
}
}
mainForm.enableDpiScaling();
mainForm.show();
return win.loopMessage();登录后方可回帖