界面上画虚线框,判断与之相交的控件,并改变名称
By
admin
at 2019-07-17 • 0人收藏 • 1599人看过
这个代码是很早时候写在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();
登录后方可回帖