none
如何在调整窗体大小过程中,让窗体的宽度和高度始终保持固定比例? RRS feed

  • 问题

  • 系统属性,性能选项,视觉效果,有一个“拖动时显示窗口内容”项。


    这个选项不勾选时,按下鼠标左键调整窗口尺寸,会显示一个黑框,鼠标左键弹起之后黑框才消失并且正式变更窗口尺寸。


    而勾选之后使用鼠标调整窗口大小,窗口内容将会根据不同尺寸而平滑地实时变化。


    我想实现这个效果:用鼠标调整窗口尺寸,从鼠标左键按下的那一刻起到鼠标左键弹起结束,窗口宽度高度始终保持固定比例。如果未勾选“拖动时显示窗口内容”项,调整窗口尺寸时显示的黑框在鼠标移动过程中始终保持宽高比例,如果勾选了“拖动时显示窗口内容”项,调整窗口尺寸过程中窗口始终保持宽高比例并且不闪烁。

    我设想要实现这个效果可以通过约束鼠标位置坐标来实现,比如鼠标从右下角调整窗口大小时,约束鼠标移动轨迹只能在一个线段上,如下图示例:


    但是显然这种方法不适用于单独调整宽度或者高度时的情况,而且不够“底层”。

    求方法。

    • 已编辑 henrypam 2017年3月11日 4:08 补充
    2017年3月4日 15:08

全部回复

  • Hi,

    感谢你在MSDN论坛发帖。

    你有尝试过ResizeEnd 和ResizeBegin 这两个事件去重新绘制窗体吗?

    如果方便,你可以提供一个重现问题的demo吗? 这样方便我们测试

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年3月7日 6:31
    版主
  • 你好,谢谢回复。

    我目前需要在WinForm中实现这个功能:在调整窗体尺寸“过程中”,让窗体的宽度和高度保持一定比例。

    即:从按下鼠标左键开始调整窗体尺寸到鼠标左键弹起结束调整尺寸这段过程中,窗体的宽度和高度始终保持一定比例,并且调整的整个过程窗体显示是平滑过渡的(不闪烁不变黑)。

    我目前尝试在 Form.SizeChanged 事件中重新修改窗体尺寸,但这种方法太低级了,而且调整过程中窗体会闪烁,不知道有没有底层一点的方法,可以在 Form.SizeChanged 事件被触发之前,窗体尺寸就已经是符合比例要求的。

    public static void Main()
    {
    	Application.EnableVisualStyles();
    	Form form1 = new Form();
    	form1.Text = "testResize";
    	form1.Size = new Size(300, 150);
    	form1.SizeChanged += (object sender, EventArgs e) =>
    	{
    		if (form1.Size.Width != form1.Size.Height * 2) {
    			form1.Size = new Size(form1.Size.Height * 2, form1.Size.Height);
    		}
    	};
    	Application.Run(form1);
    }

    我没有尝试过窗体重绘。。Form.ResizeBegin 和 Form.ResizeEnd 事件我也不清楚具体应该如何使用。。

    还望不吝赐教~~,谢谢!

    2017年3月8日 11:24
  • 你可以先这个么在form里面注册:

     this.ResizeBegin += new System.EventHandler(this.Form1_ResizeBegin);
     this.ResizeEnd += new System.EventHandler(this.Form1_ResizeEnd);

    然后在实现这些函数。

      private void Form1_ResizeBegin(object sender, EventArgs e)
            {
               。。。。
            }
    
     private void Form1_ResizeEnd(object sender, EventArgs e)
            {
                。。。。
    
            }


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年3月9日 9:15
    版主
  • 您好,您说的这个方法好像无法实现我需要的效果呢。

    刚刚把问题重新补充了说明了一下,麻烦再帮我看看有没有解决方法。

    2017年3月11日 4:11
  • Hi,

    有没有尝试获取鼠标在右下方的事件,然后执行缩放在右下方到左上方这段线段。

    我没有看到windows form提供这样的事件,你自己需要根据鼠标的位置来判断了。

    对于单方面横向移动,这样就不会收到影响.

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年3月14日 8:42
    版主