如何在C#中使无边框(无边框或线条)可调整大小的可移动Windows窗体? [英] How To Make Borderless (No Border or Line) Resizable Movable Windows Forms in C#?

查看:304
本文介绍了如何在C#中使无边框(无边框或线条)可调整大小的可移动Windows窗体?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请帮助我,我想做一个干净的窗体设计,没有边框和线条也必须可调整大小和可移动。

解决方案

无边框形式很简单:

https://msdn.microsoft.com/en-us/library/system.windows.forms.form.formborderstyle%28v=vs.110%29.aspx [ ^ ],

https:// msdn .microsoft.com / zh-CN / library / hw8kes41%28v = vs.110%29.aspx [ ^ ](使用System.Windows.Forms.FormBorderStyle.None)。



现在,如何实现移动和调整大小操作?好吧,没有奇迹这样的事情。通过删除边框,您丢失了非客户端表单区域,因此您必须在窗口的客户区上模拟类似的行为。



这是你可以做的:

你可以在表单上处理鼠标事件,但是你可以更好地添加一些表示标题栏和边框的控件来将这个功能放在它们上面。另外,您可以使用 Control.SetClientSizeCore 调整客户区大小,如我最近的回答中所述:

如何更改表格的厚度边界 [ ^ ]。



无论您使用何种控制,移动或调整大小操作,通过处理事件来做同样的事情 MouseDown MouseUp MouseMove ,或者更好的是,重写Control的虚方法 OnMouseDown OnMouseUp OnMouseMove

https://msdn.microsoft.com/en-us/library/system.windows.forms.control% 28v = vs.110%29.aspx [ ^ ]。



有一些标志,你的窗口成员,如 modeMode resizeMode 或一个字节中的按位组合。在向下事件中,设置移动或调整大小模式。如果要调整大小,您还需要将鼠标捕获到表单: https://msdn.microsoft.com/en-us/library/ms171545%28v=vs.110%29.aspx [ ^ ]。



捕获鼠标非常重要,因为下一步,移动鼠标,可能会将鼠标指针移动到表单区域之外,但您仍需要在表单中处理移动和向上事件。



然后,在鼠标移动事件中,执行调整大小或移动,并在向上事件停止捕获鼠标并返回正常鼠标模式。它需要一些逻辑,所以要耐心和彻底。还有一个细节:您可能想要在屏幕坐标而不是控制坐标中工作,或者在表格坐标(这是另一个控件)中工作,而不是工具控制坐标。具体如下:

https://msdn.microsoft.com/en-us/library/system.windows.forms.control.pointtoscreen%28v=vs.110%29.aspx [ ^ ],

https://msdn.microsoft.com/en-us/library/system.windows.forms.control.pointtoclient%28v=vs.110%29.aspx [ ^ ]。



这就是全部。



-SA

please help me i want to make a clean windows form design with no border and lines on it also it have to be resizable and movable.

解决方案

Borderless form is simple:
https://msdn.microsoft.com/en-us/library/system.windows.forms.form.formborderstyle%28v=vs.110%29.aspx[^],
https://msdn.microsoft.com/en-us/library/hw8kes41%28v=vs.110%29.aspx[^] (use System.Windows.Forms.FormBorderStyle.None).

Now, how to implement move and resize operations? Well, there is no such thing as miracle. By removing borders, you lost non-client form areas, so you have to emulate similar behavior on the client area of the window.

Here is what you can do:
You can handle mouse events on the form itself, but you could better add some controls representing title bar and borders to put this functionality on them. Also, alternatively, you can adjust the client area size by using Control.SetClientSizeCore, as explained in my recent answer:
how can I change the thickness of a form border[^].

No matter what control you use, for move or resize operation, you do the same things by handling the events MouseDown, MouseUp and MouseMove, or, better yet, by overriding the Control's virtual methods OnMouseDown, OnMouseUp and OnMouseMove:
https://msdn.microsoft.com/en-us/library/system.windows.forms.control%28v=vs.110%29.aspx[^].

Have some flags, members of your window, such as modeMode, resizeMode or bitwise combinations in one byte. On "down" event, set move or resize mode. In case of resizing, you will also need to capture mouse to the form: https://msdn.microsoft.com/en-us/library/ms171545%28v=vs.110%29.aspx[^].

Capturing mouse is important because your next step, move of the mouse, may move the mouse pointer outside of the form area, but you still need to handle "move" and "up" events in your form.

Then, on mouse "move" event, perform resize or move, and on "up" event stop capturing mouse and go back to "normal" mouse mode. It will require some logic, so be patient and thorough. One more detail: you may want to work in screen coordinates instead of control coordinates, or in form coordinates (which is another control), instead of tool control coordinates. This is how:
https://msdn.microsoft.com/en-us/library/system.windows.forms.control.pointtoscreen%28v=vs.110%29.aspx[^],
https://msdn.microsoft.com/en-us/library/system.windows.forms.control.pointtoclient%28v=vs.110%29.aspx[^].

That's all.

—SA


这篇关于如何在C#中使无边框(无边框或线条)可调整大小的可移动Windows窗体?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆