界面上画虚线框,判断与之相交的控件,并改变名称

By admin at 2019-07-17 • 0人收藏 • 1616人看过

这个代码是很早时候写在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();


登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



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

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

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...