如何创建一个有边框但没有标题栏的表单? (如 Windows 7 上的音量控制)
Posted
技术标签:
【中文标题】如何创建一个有边框但没有标题栏的表单? (如 Windows 7 上的音量控制)【英文标题】:How to create a form with a border, but no title bar? (like volume control on Windows 7) 【发布时间】:2011-04-05 09:04:06 【问题描述】:在 Windows 7 中,音量混合器窗口具有特定的样式,具有厚实的透明边框,但没有标题栏。如何在 winforms 窗口中重新创建该窗口样式?
我尝试将 Text 设置为 string.Empty,并将 ControlBox 设置为 false,这会删除标题栏,但随后边框也会消失:
【问题讨论】:
【参考方案1】:form.Text = string.Empty;
form.ControlBox = false;
form.FormBorderStyle = FormBorderStyle.SizableToolWindow;
对于固定大小的窗口,您仍应使用FormBorderStyle.SizableToolWindow
,但您可以覆盖表单的WndProc
以忽略非客户端命中测试(用于切换到调整大小的光标):
protected override void WndProc(ref Message message)
const int WM_NCHITTEST = 0x0084;
if (message.Msg == WM_NCHITTEST)
return;
base.WndProc(ref message);
如果您想真正强制执行大小,您还可以在表单上将MinimumSize
设置为等于MaximumSize
。
【讨论】:
不,这会完全移除边框 @oɔɯǝɹ: form.FormBorderStyle = FormBorderStyle.SizableToolWindow 对我来说似乎工作正常。 @oɔɯǝɹ:FixedToolWindow
确实删除了 3D 边框。请参阅我的更新答案,以获取完整的 3D 边框的固定大小行为。
我试图通过FixedSingle
实现这一目标。这个答案对我来说的解决方案是将表单文本设置为空。【参考方案2】:
因为“此编辑旨在针对帖子的作者,作为编辑毫无意义。它应该被写成评论或答案。”我对 Chris 的回答进行了编辑,作为新的回答。
他的答案的代码与描述的一样 - 除了它还可以防止任何客户区鼠标事件发生。您需要返回 1(如在 HTCLIENT 中)来解决此问题。
protected override void WndProc(ref Message message)
const int WM_NCHITTEST = 0x0084;
const int HTCLIENT = 0x01;
if (message.Msg == WM_NCHITTEST)
message.Result = new IntPtr(HTCLIENT);
return;
base.WndProc(ref message);
【讨论】:
【参考方案3】:form.FormBorderStyle = FormBorderStyle.Fixed3D;
【讨论】:
虽然此代码可能有助于解决问题,但提供有关它为什么和/或如何回答问题的额外上下文将显着提高其长期价值。请编辑您的答案以添加一些解释。以上是关于如何创建一个有边框但没有标题栏的表单? (如 Windows 7 上的音量控制)的主要内容,如果未能解决你的问题,请参考以下文章