递归火山软件开发平台

标题: 火山视窗MFC锚点布局,让自适应布局更简单! [打印本页]

作者: xrea    时间: 2026-9-13 16:12
标题: 火山视窗MFC锚点布局,让自适应布局更简单!
本帖最后由 xrea 于 2026-9-29 20:01 编辑

锚点布局介绍:
  锚点布局是面向火山PC(视窗平台)的界面自适应组件,基于 MFC界面基本类模块扩展实现。将其拖入窗口后,只需为内部子组件选择“锚点”属性(左右、全部锚定等 16 种组合),窗口尺寸变化时子组件即自动调整位置与尺寸:设计器中拉伸实时预览,运行时同样自动生效。组件采用四边距基线算法,杜绝累积漂移;缩小时自带最小尺寸保护,支持嵌套布局与运行时动态调整锚点,并可随时冻结或恢复重排——界面自适应从此无需手写任何布局代码。
锚点布局演示:
(, 下载次数: 512)
锚点布局使用方法:
三步使用
第 1 步:放置锚点布局
在窗口设计器中,从工具箱把「锚点布局」组件拖到窗口上(默认 600×420,可拉伸调整)。它是一个容器,把你希望随窗口缩放的组件都放进它里面。
第 2 步:放入子组件
把按钮、编辑框等组件正常拖到锚点布局内部(和普通容器操作一样),摆好初始位置——这个初始摆放就是布局的“基线”。
第 3 步:设置锚点
选中锚点布局内的某个子组件 → 属性表找到「锚点」属性 → 下拉选择组合(默认“左顶”)。常见搭配见上图速查表:

场景        锚点组合        效果
顶部工具栏/标题栏        左右(5)        宽度跟随,高度不变[url=]Hide[/url]
左侧导航栏        左顶底(11)        高度跟随,宽度不变
中央内容区        全部锚定(15)        四边跟随拉伸
底部状态栏        左右底(13)        宽度跟随,贴底
右下角"确定"按钮        右底(12)        始终贴右下角
Logo/角标        左顶(3,默认)        位置固定不动
验证:设计器里直接拉伸锚点布局,子组件会按锚点实时重排——所见即所得。保存后运行程序,窗口缩放时同样自动生效。

锚点布局安装方法:
将压缩包中的文件夹解压出来替换到路径(你的火山安装目录\plugins\vprj_win\classlib\sys)。
(其实就是替换官方的mfc_ui_base类库)注意替换后打开界面设计器会要求更新,更新下即可
附件:
[hide=d999] (, 下载次数: 81) 例子: (, 下载次数: 34) [/hide]
V0.2发布,相对于基础版本做了以下升级:
1. 对多组件同时存在的情况下流畅度进行了升级。

V0.3发布,相对于基础版本做了以下升级:
1. 锚点布局容器组件支持设置边框和其颜色,用以替代外形框。


作者: 一曲    时间: 2026-9-13 16:18

作者: nurjay    时间: 2026-9-13 16:27
火山有你而更精彩
作者: 秋天的童话    时间: 2026-9-13 18:52
感谢楼主大佬分享,很有用的功能。
作者: storey    时间: 2026-9-13 19:31
优秀。。。
作者: adm    时间: 2026-9-13 20:49
火山有你而更精彩
作者: arlonshen    时间: 2026-9-13 21:34
不错,不然每次都是慢慢去调
作者: 创世魂    时间: 2026-9-13 21:43
牛逼
作者: 888888    时间: 2026-9-13 21:45
谢谢分享
作者: xrea    时间: 2026-9-13 23:02
让MFC再创辉煌:噜阿噜
作者: 乐易论坛    时间: 2026-9-14 00:59
正好需要,太感谢了!
作者: Pomelo    时间: 2026-9-14 02:34
看看
作者: adm    时间: 2026-9-14 04:58
很牛了,就是锚定组件内放上容器组件,然后容器组件内在放上组角锚定就无效了
作者: aronshen    时间: 2026-9-14 08:48
牛!!!!!!!!!
作者: 步天有术22    时间: 2026-9-14 09:03
好东西
作者: xrea    时间: 2026-9-14 09:59
adm 发表于 2026-9-14 04:58
很牛了,就是锚定组件内放上容器组件,然后容器组件内在放上组角锚定就无效了 ...

锚定组件就是容器,可以不用容器组件
作者: 1503123    时间: 2026-9-14 10:18
官方库确实是缺胳膊少腿,看似能用,真正搞项目就不行了.
作者: 泡泡小驻    时间: 2026-9-14 10:39

火山有你而更精彩
作者: leiyanglie    时间: 2026-9-14 12:14
牛逼厉害
作者: dengzf    时间: 2026-9-14 13:13
学习一下
作者: guangye1    时间: 2026-9-14 17:35
锚点布局好名字
作者: zlk    时间: 2026-9-14 17:36
好东西好东西
作者: fengyishen    时间: 2026-9-14 21:55
查看本帖隐藏内容
作者: 高山!&流水    时间: 2026-9-14 22:36
谢谢分享
作者: kingsoft    时间: 2026-9-15 00:04

感谢楼主大佬分享,很有用的功能。
作者: 阿素里戈沃里嘚    时间: 2026-9-15 00:59
将压缩包中的文件夹解压出来替换到路径(你的火山安装目录\plugins\vprj_win\classlib\sys)。
(其实就是替换官方的mfc_ui_base类库)注意替换后打开界面设计器会要求更新,更新下即可
作者: 山梦    时间: 2026-9-15 07:29
感谢楼主大佬分享,很有用的功能。
作者: fan2359    时间: 2026-9-15 21:22

作者: scfalwxk    时间: 2026-9-16 08:21
学习
作者: xrea    时间: 2026-9-16 09:51
V0.2发布,相对于基础版本做了以下升级:
1. 对多组件同时存在的情况下流畅度进行了升级。
作者: xiedangen    时间: 2026-9-16 17:39
666666666666666666666
作者: 一贞力道    时间: 2026-9-17 09:33
布局自适应?
作者: asd0023    时间: 2026-9-17 11:36
1111111111111111
作者: asd0023    时间: 2026-9-17 11:53
--- 开始编译项目"MFC自适应测试"(请不要在中途拔出加密狗):
载入全局翻译词库文件"default_tlib.txt"成功,其中共有 53 个有效词条.
编译生成对应的C++源文件到目录"C:\Users\Administrator\Desktop\新建文件夹\MFC自适应控件测试\_int\MFC自适应测试\debug\x64\project\"成功 [双击可跳转]
正在链接生成目标文件"C:\Users\Administrator\Desktop\新建文件夹\MFC自适应控件测试\_int\MFC自适应测试\debug\x64\linker\MFC自适应测试.exe"
所编译程序位数: 64; 所使用 VS 本地编译器版本: 16; 所使用 Windows SDK 版本: 10.0.22000.0
正在进行本地编译和链接工作(如果是首次编译,由于需要初始化编译环境和相关缓存,速度稍慢是正常的)
错误: 使用所指定的本地编译器编译当前程序失败
错误:
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(291): warning C4311: “类型强制转换”: 从“HMENU”到“UINT”的指针截断
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(291): warning C4302: “类型强制转换”: 从“HMENU”到“UINT”截断
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(565): warning C4311: “类型强制转换”: 从“const HMENU”到“UINT”的指针截断
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(565): warning C4302: “类型强制转换”: 从“const HMENU”到“UINT”截断
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(786): warning C4311: “类型强制转换”: 从“HMENU”到“UINT”的指针截断
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(786): warning C4302: “类型强制转换”: 从“HMENU”到“UINT”截断
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(807): warning C4311: “类型强制转换”: 从“HMENU”到“UINT”的指针截断
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(807): warning C4302: “类型强制转换”: 从“HMENU”到“UINT”截断
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(814): warning C4244: “return”: 从“BOOL_P”转换到“逻辑型”,可能丢失数据
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(833): warning C4311: “类型强制转换”: 从“HMENU”到“UINT”的指针截断
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(833): warning C4302: “类型强制转换”: 从“HMENU”到“UINT”截断
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(925): warning C4311: “类型强制转换”: 从“const HMENU”到“UINT”的指针截断
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(925): warning C4302: “类型强制转换”: 从“const HMENU”到“UINT”截断
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(1016): warning C4311: “类型强制转换”: 从“HMENU”到“UINT”的指针截断
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(1016): warning C4302: “类型强制转换”: 从“HMENU”到“UINT”截断
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(1093): warning C4311: “类型强制转换”: 从“HMENU”到“UINT”的指针截断
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(1093): warning C4302: “类型强制转换”: 从“HMENU”到“UINT”截断
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(1152): warning C4311: “类型强制转换”: 从“HMENU”到“UINT”的指针截断
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(1152): warning C4302: “类型强制转换”: 从“HMENU”到“UINT”截断
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(1173): warning C4311: “类型强制转换”: 从“HMENU”到“UINT”的指针截断
    H:\voldev25\plugins\vprj_win\classlib\sys\base\libs\win_base\cpp\vol_menu.cpp(1173): warning C4302: “类型强制转换”: 从“HMENU”到“UINT”截断
    正在生成代码...
    vol_menu.obj : error LNK2019: 无法解析的外部符号 nsvgParse,函数 "public: __int64 __cdecl CRefVolMenu::SetMenuItemSvgIcon(unsigned __int64,wchar_t const *,int,int)" (?SetMenuItemSvgIcon@CRefVolMenu@@QEAA_J_KPEB_WHH@Z) 中引用了该符号
    vol_menu.obj : error LNK2019: 无法解析的外部符号 nsvgDelete,函数 "public: __int64 __cdecl CRefVolMenu::SetMenuItemSvgIcon(unsigned __int64,wchar_t const *,int,int)" (?SetMenuItemSvgIcon@CRefVolMenu@@QEAA_J_KPEB_WHH@Z) 中引用了该符号
    vol_menu.obj : error LNK2019: 无法解析的外部符号 nsvgCreateRasterizer,函数 "public: __int64 __cdecl CRefVolMenu::SetMenuItemSvgIcon(unsigned __int64,wchar_t const *,int,int)" (?SetMenuItemSvgIcon@CRefVolMenu@@QEAA_J_KPEB_WHH@Z) 中引用了该符号
    vol_menu.obj : error LNK2019: 无法解析的外部符号 nsvgRasterize,函数 "public: __int64 __cdecl CRefVolMenu::SetMenuItemSvgIcon(unsigned __int64,wchar_t const *,int,int)" (?SetMenuItemSvgIcon@CRefVolMenu@@QEAA_J_KPEB_WHH@Z) 中引用了该符号
    vol_menu.obj : error LNK2019: 无法解析的外部符号 nsvgDeleteRasterizer,函数 "public: __int64 __cdecl CRefVolMenu::SetMenuItemSvgIcon(unsigned __int64,wchar_t const *,int,int)" (?SetMenuItemSvgIcon@CRefVolMenu@@QEAA_J_KPEB_WHH@Z) 中引用了该符号
    ..\linker\MFC自适应测试.exe : fatal error LNK1120: 5 个无法解析的外部命令
编译生成目标文件"C:\Users\Administrator\Desktop\新建文件夹\MFC自适应控件测试\_int\MFC自适应测试\debug\x64\linker\MFC自适应测试.exe"失败,耗费时间 19297 毫秒.
--- 项目"MFC自适应测试"编译或链接失败. 编译过程中共遇到了 0 个警告, 2 个错误.

作者: 刘铁    时间: 2026-9-17 12:21
学习中
作者: niuyanbo2021    时间: 2026-9-17 14:44
火山有你而更精彩
作者: q472448760    时间: 2026-9-17 15:24
666666666666666666
作者: lukeigun    时间: 2026-9-17 20:16

作者: kingsoft    时间: 2026-9-17 23:24
asd0023 发表于 2026-9-16 19:53
--- 开始编译项目"MFC自适应测试"(请不要在中途拔出加密狗):
载入全局翻译词库文件"default_tlib.txt"成功, ...

遇到类似问题,最直接的解决方法,再下在一个官方的版本,什么库都不带,直接官方的版本更新UI.dll文件,
然后复制过去。就凑活用了!我也不知道是什么问题!
作者: xrea    时间: 2026-9-17 23:41
asd0023 发表于 2026-9-17 11:53
--- 开始编译项目"MFC自适应测试"(请不要在中途拔出加密狗):
载入全局翻译词库文件"default_tlib.txt"成功, ...

vol_menu.cpp我没修改过,不是我的库原因
作者: m331997552    时间: 2026-9-18 10:55
谢谢分享
作者: kca    时间: 2026-9-18 21:55
6666666666
作者: 摘星揽月    时间: 2026-9-18 21:58
看一下
作者: yyaini0424    时间: 2026-9-18 22:46
感谢楼主大佬分享,很有用的功能。
作者: smk718    时间: 2026-9-19 11:48
牛逼~~~
作者: 2002czm    时间: 2026-9-19 12:17

火山有你而更精彩
作者: cl6843751    时间: 2026-9-19 20:13

火山有你而更精彩
作者: CPUCN    时间: 2026-9-20 09:37
非常好@飞扬工作室 收了吧。
作者: 上等兵    时间: 2026-9-29 19:16
这应该卖给吴总,加到官方升级里,基础功能啊
作者: LSS01    时间: 2026-10-1 14:37
8888888888




欢迎光临 递归火山软件开发平台 (http://bbs.voldp.com/) Powered by Discuz! X3.4