开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 1336|回复: 34
收起左侧

[易语言纯源码] 自动缩放界面组件

[复制链接]
结帖率:0% (0/1)
发表于 2024-9-27 19:06:24 | 显示全部楼层 |阅读模式   上海市上海市
分享源码
界面截图:
是否带模块: 纯源码
备注说明: -
本帖最后由 zxxiaopi 于 2024-9-27 19:09 编辑

最近听说Cursor很好用,这几天捣鼓了下,发现真不错!用这AI在delphi里写了dll,vsstudio里也写了,都可以被易调用,相当好用啊!
这里来个例子,C#的类库dll,测试了几个易组件没问题,理论应该都可以。
下面是C#源码,需要安装.net4.0,没办法,c#类库就这德性
[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace AutoScalingDLL
{
    public class AutoScaler
    {
        [DllImport("user32.dll")]
        private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);

        [DllImport("user32.dll")]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);

        [DllImport("user32.dll")]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

        [DllImport("kernel32.dll")]
        private static extern uint GetCurrentThreadId();

        [DllImport("user32.dll")]
        private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

        [DllImport("user32.dll")]
        private static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

        private const int WH_CALLWNDPROC = 4;
        private const int WM_SIZE = 0x0005;

        private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);

        [StructLayout(LayoutKind.Sequential)]
        private struct CWPSTRUCT
        {
            public IntPtr lParam;
            public IntPtr wParam;
            public int message;
            public IntPtr hwnd;
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }

        private static IntPtr _hookHandle = IntPtr.Zero;
        private static HookProc _hookProc;
        private static IntPtr _mainWindowHandle;
        private static Dictionary<IntPtr, ControlInfo> _controls = new Dictionary<IntPtr, ControlInfo>();
        private static RECT _originalWindowRect;

        private class ControlInfo
        {
            public float LeftRatio;
            public float TopRatio;
            public float WidthRatio;
            public float HeightRatio;
        }

        [DllExport("InitializeAutoScaling", CallingConvention = CallingConvention.StdCall)]
        public static bool InitializeAutoScaling(IntPtr hWnd)
        {
            if (_hookHandle != IntPtr.Zero)
            {
                return false; // Already initialized
            }

            _mainWindowHandle = hWnd;
            GetWindowRect(_mainWindowHandle, out _originalWindowRect);

            _hookProc = new HookProc(WindowProc);
            _hookHandle = SetWindowsHookEx(WH_CALLWNDPROC, _hookProc, IntPtr.Zero, GetCurrentThreadId());

            return _hookHandle != IntPtr.Zero;
        }

        [DllExport("AddControlToAutoScale", CallingConvention = CallingConvention.StdCall)]
        public static bool AddControlToAutoScale(IntPtr hWnd)
        {
            if (_hookHandle == IntPtr.Zero || _controls.ContainsKey(hWnd))
            {
                return false;
            }

            RECT controlRect;
            GetWindowRect(hWnd, out controlRect);

            int windowWidth = _originalWindowRect.Right - _originalWindowRect.Left;
            int windowHeight = _originalWindowRect.Bottom - _originalWindowRect.Top;

            ControlInfo info = new ControlInfo
            {
                LeftRatio = (float)(controlRect.Left - _originalWindowRect.Left) / windowWidth,
                TopRatio = (float)(controlRect.Top - _originalWindowRect.Top) / windowHeight,
                WidthRatio = (float)(controlRect.Right - controlRect.Left) / windowWidth,
                HeightRatio = (float)(controlRect.Bottom - controlRect.Top) / windowHeight
            };

            _controls.Add(hWnd, info);
            return true;
        }

        private static IntPtr WindowProc(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode >= 0)
            {
                CWPSTRUCT cwp = (CWPSTRUCT)Marshal.PtrToStructure(lParam, typeof(CWPSTRUCT));

                if (cwp.message == WM_SIZE && cwp.hwnd == _mainWindowHandle)
                {
                    RECT newRect;
                    GetWindowRect(_mainWindowHandle, out newRect);

                    int newWidth = newRect.Right - newRect.Left;
                    int newHeight = newRect.Bottom - newRect.Top;

                    foreach (var kvp in _controls)
                    {
                        IntPtr controlHandle = kvp.Key;
                        ControlInfo info = kvp.Value;

                        int newLeft = (int)(info.LeftRatio * newWidth);
                        int newTop = (int)(info.TopRatio * newHeight);
                        int newControlWidth = (int)(info.WidthRatio * newWidth);
                        int newControlHeight = (int)(info.HeightRatio * newHeight);

                        MoveWindow(controlHandle, newLeft, newTop, newControlWidth, newControlHeight, true);
                    }
                }
            }

            return CallNextHookEx(_hookHandle, nCode, wParam, lParam);
        }

        [DllExport("FinalizeAutoScaling", CallingConvention = CallingConvention.StdCall)]
        public static void FinalizeAutoScaling()
        {
            if (_hookHandle != IntPtr.Zero)
            {
                UnhookWindowsHookEx(_hookHandle);
                _hookHandle = IntPtr.Zero;
            }
            _controls.Clear();
        }
    }
}


下面是易例子源码
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
调试输出 (初始化自动缩放 (取窗口句柄 ()))
添加自动缩放组件 (编辑框1.取窗口句柄 ())
添加自动缩放组件 (按钮1.取窗口句柄 ())
添加自动缩放组件 (图片框1.取窗口句柄 ())
子程序名返回值类型公开备 注
__启动窗口_可否被关闭逻辑型 
释放自动缩放 ()


i支持库列表   支持库注释   
spec特殊功能支持库
  
DLL命令名返回值类型公开备 注
初始化自动缩放逻辑型 
DLL库文件名:
AutoScalingDLL.dll
在DLL库中对应命令名:
InitializeAutoScaling
参数名类 型传址数组备 注
hWnd整数型
DLL命令名返回值类型公开备 注
添加自动缩放组件逻辑型 
DLL库文件名:
AutoScalingDLL.dll
在DLL库中对应命令名:
AddControlToAutoScale
参数名类 型传址数组备 注
hWnd整数型
DLL命令名返回值类型公开备 注
释放自动缩放 
DLL库文件名:
AutoScalingDLL.dll
在DLL库中对应命令名:
FinalizeAutoScaling
参数名类 型传址数组备 注




AutoScalingDLL.rar

3.28 KB, 下载次数: 38, 下载积分: 精币 -2 枚

编译好的x86的dll

评分

参与人数 3精币 +3 收起 理由
wa690602724 + 1 感谢分享,很给力!~
kyo9766 + 1 感谢分享,很给力!~
多多帅吧 + 1 感谢发布原创作品,精易因你更精彩!

查看全部评分


结帖率:0% (0/1)
发表于 2024-10-30 10:18:20 | 显示全部楼层   广东省肇庆市
感谢分享,需要.net环境就不是太好.用Delphi搞一个呢..
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 19 天

发表于 2024-10-7 18:30:34 | 显示全部楼层   广东省汕头市
感谢大神分享
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)
发表于 2024-10-3 11:23:53 | 显示全部楼层   广东省深圳市
先收藏一下
回复 支持 反对

使用道具 举报

签到天数: 14 天

发表于 2024-9-30 17:37:28 | 显示全部楼层   广西壮族自治区南宁市

感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)

签到天数: 19 天

发表于 2024-9-29 13:23:48 | 显示全部楼层   山东省青岛市

互相讨论,共同进步,感谢分享
回复 支持 反对

使用道具 举报

签到天数: 25 天

发表于 2024-9-29 10:35:11 | 显示全部楼层   江苏省苏州市
作为一个萌新虽然看不懂,但是还是要多支持!
回复 支持 反对

使用道具 举报

结帖率:98% (46/47)

签到天数: 27 天

发表于 2024-9-29 07:27:57 | 显示全部楼层   山东省青岛市
感谢发布原创作品,精易因你更精彩!6666666666666
回复 支持 反对

使用道具 举报

结帖率:98% (103/105)

签到天数: 27 天

发表于 2024-9-29 07:23:20 | 显示全部楼层   山东省青岛市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)

签到天数: 5 天

发表于 2024-9-28 19:44:37 | 显示全部楼层   广东省珠海市

感谢分享原创作品。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表