【求教】关于winform的窗口控件同比缩放问题

Haitani 2018-03-28 09:45:46
看到过很多前辈推荐用WPF去做桌面应用同比缩放这块,由于工作需要现在用winform,也看到过不少网友自己写的方法,想综合着自己去写一个比较完备的控制类,然后想请教一下,除了控件的长宽同比缩放,字体变化外,同比缩放还要注意哪些问题?尤其是坐标的变化是怎样的?还有其他注意事项么?麻烦各位有经验的前辈指点一下,谢谢
...全文
619 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Haitani 2018-04-03
  • 打赏
  • 举报
回复
sp1234前辈说的挺对的,无论是winform自带的布局排版方式,还是自己封装的缩放类,比如我自己写的一个ZoomController.cs,都不能很好的适应真正的用户需求,只是玩玩而已,确实还是得考虑放大或缩小一定程度该如何布局显示,甚至规定最小窗口大小,而不能单纯的放大缩小
assky124 2018-04-03
  • 打赏
  • 举报
回复
TableLayout试试,基本布局不会乱
sp1234_maJia 2018-04-03
  • 打赏
  • 举报
回复
引用 5 楼 weixin_41047274 的回复:
[quote=引用 2 楼 sp1234 的回复:] 真正的缩放是底层层面的缩放,而应用层的长宽等等指标通通不需要改变,只要改变的“分辨率、比率”指标就能将底层之上的所有内容重新刷新,这样的理念才能建立在稳定的基础上。
能否举个例子?或者秀个demo [/quote] 这就是 winform 跟 WPF 的区别。winform 是差不多30年前的框架,很难改变其内部。而 WPF 自己就有 ViewBox 控件,是标准的成熟的机制。
  • 打赏
  • 举报
回复
在响应式编程中,设计几个版型,当尺寸改变大于版型的差异时,其实你就要选择不同的版型。这就好像是瘦子穿衣并不是胖子的衣服的等比例缩小,因为像领口、兜、裆、屁股形状等等人身体上的特征,并不是按照胖瘦来等比例变化的。 当尺寸改变没有超过版型差异时,对于数据绑定控件其实内容的多少中往往自动排列。例如原本一行4个内容(第5个折行),可能自动变为5个。 仅当最简单的内部一些特殊情况下(例如只是文本框简单排列),非要让外边框自动变大,才需要上述方式来等比例改变尺寸。而且对于各种尺寸也要有阈值,也不应该无限变大或者无限变小。实际上我觉得这个时候还不如“不变”,就让其它地方多一些空白。
  • 打赏
  • 举报
回复
问题是,这种方式不是响应式编程。只是让控件的外观的大小和位置看上去好看了,但是对于复杂一点点的应用,走样严重。用户不买账。
  • 打赏
  • 举报
回复
其实要响应式,就不能等比例改变控件的大小,而是要让内容自动排版。 如果只是改变控件大小,作为纯编程玩儿一玩儿,可以这样封装一下这个行为 Behavior,例如
public class 放大缩小Behavior
{
    public 放大缩小Behavior(Control ctrl, Control reference)
    {
        this.InitValue = new Rectangle(ctrl.Left, ctrl.Top, ctrl.Width, ctrl.Height);
        this.InitRefValue = new Rectangle(reference.Left, reference.Top, reference.Width, reference.Height);
        this.Target = ctrl;
        this.Reference = reference;
        reference.Resize += Reference_Resize;
    }

    Rectangle InitValue;
    Rectangle InitRefValue;
    Control Target;
    Control Reference;

    private void Reference_Resize(object sender, EventArgs e)
    {
        var p = this.Reference.Width / (double)this.InitRefValue.Width;
        Target.Left = (int)(this.InitValue.Left * p);
        Target.Width = (int)(this.InitValue.Width *p);
        p = this.Reference.Height / (double)this.InitRefValue.Height;
        Target.Top = (int)(this.InitValue.Top * p);
        Target.Height = (int)(this.InitValue.Height * p);
    }
}
这里在初始化的时候把控件的原始尺寸位置记录下来,然后当“参照物”的 Resize 事件发生时,按照比例改变目标控件的大小位置。 那么在一个窗口的初始化事件中写
private void Form1_Load(object sender, EventArgs e)
{
    new 放大缩小Behavior(this.textBox1, this);
    new 放大缩小Behavior(this.listBox1, this);
}
你想让哪一个控件锚上窗体的Resize,就调用一次这个 Behavior 类型,创建一个行为对象实例,行为就会起作用!
  • 打赏
  • 举报
回复
https://bbs.csdn.net/topics/392344412 这写了个半成品,已经有涉及到转中心点坐标等等基本功能了,你要完善自己完善即可。 我写的,open left 版权,随便用吧。
  • 打赏
  • 举报
回复
引用 4 楼 zyy1111111 的回复:
可以使用布局Anchor来实现同比例,选四个就是随着界面的大小同步变换大小
如果 Anchor 的模式是按照窗体百分比来表示距离的(而不是按照像素数来表示的),那才可以。
求知若愚 2018-04-03
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
真正的缩放是底层层面的缩放,而应用层的长宽等等指标通通不需要改变,只要改变的“分辨率、比率”指标就能将底层之上的所有内容重新刷新,这样的理念才能建立在稳定的基础上。
能否举个例子?或者秀个demo
xuzuning 2018-03-28
  • 打赏
  • 举报
回复
具体控件要有具体的控制方案
比如 ComboBox 的高度不随 Height 属性改变,ListBox 的高度与 Height 不成正比
pictureBox 尺寸变化后,图片如何变化
不过都是细节问题,你做了就知道了。就看你有多大容忍度了
  • 打赏
  • 举报
回复
真正的缩放是底层层面的缩放,而应用层的长宽等等指标通通不需要改变,只要改变的“分辨率、比率”指标就能将底层之上的所有内容重新刷新,这样的理念才能建立在稳定的基础上。
cheng2005 2018-03-28
  • 打赏
  • 举报
回复
这种东西没有完美的方案,不然操作系统就直接做这件事了。 要根据你的实际需求具体设计方案。 不要妄想有完美且通用的方案。
zyy1111111 2018-03-28
  • 打赏
  • 举报
回复

可以使用布局Anchor来实现同比例,选四个就是随着界面的大小同步变换大小

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧