Mac OS X Windows Forms 主题






4.78/5 (25投票s)
将 Mac OS 窗口主题应用于您的应用程序。
下载 Mac_Theme_for_WinForms.zip - 2.56 MB
引言
一些程序员可能希望为他们的窗体应用一些主题或皮肤,使其看起来酷炫、精致且引人注目。我为所有人创建了一个 Mac OS X 开源主题库,本文将介绍其用法。
背景
我是一个忠实的 Apple Mac OS X 粉丝。不幸的是,我买不起 Mac,所以我希望在我的 Windows 窗体应用程序中拥有 Mac OS X 应用程序的外观和感觉。我创建了一个库,以便可以在任何 WinForms 中使用它。我的这个想法并不修改窗体的非客户区,而是创建一个新的预先设计的 Mac 主题无边框窗体,并将您的目标窗体作为其子控件。
如何创建
该主题完全由一个无边框窗体组成,其中包含大量启用了双缓冲的面板,每个面板都经过特殊定位,用作标题栏、控件按钮、调整大小手柄以及您要应用主题的窗体的容器。
此窗体包括几个事件,如调整大小、移动、最大化、最小化和关闭。目标窗体(应用主题的窗体)已转换为控件,并将归 Form Container(panel|bodypanel
)所有。
这个 Mac 主题窗体的行为与常规 Windows 边框完全相同。以下是一些使此自定义主题与常规 Windows 边框相似的控件。
标题栏
-> 这是通过居中的标签控件显示窗体文本属性的地方。这部分包含标题和控件按钮(关闭、最大化/还原和最小化按钮)。您可以通过拖动此部分来移动窗口,或者通过双击来最大化/还原窗口。
控件按钮
-> 包括关闭、最大化/还原和最小化按钮。就像常规的 Windows 边框一样,您可以使用这些按钮来关闭窗体、最大化、还原和最小化窗口。
边框
-> 这是窗体的边缘,我们可以在此处执行调整大小操作。
标题
-> 显示窗体的文本属性。
客户端区域
-> 这是应用程序的主要图形用户界面所在的位置。
构成 Mac 主题的控件
以下是 mactheme
Form 类中包含的控件。
控件名称 | 描述 |
mactheme | 这是包含以下所有控件的主要无边框窗体。 |
bodypanel | 此面板包含您应用主题的窗体。(窗体已转换为低级控件,并归此控件所有) |
bottompnl | 负责调整大小的黑色 1px 底部边框。 |
bottompnl2 | 底部边框调整大小手柄扩展。 |
rightpnl | 负责调整大小的黑色 1px 右边框。 |
rightpnl2 | 右边框调整大小手柄扩展。 |
leftpnl | 负责调整大小的黑色 1px 左边框。 |
leftpnl2 | 左边框调整大小手柄扩展。 |
toppnl | 负责调整大小的黑色 1px 顶部边框。 |
titleCaption | 显示您应用了主题的窗体的 Text 属性。 |
controlboxToolTip | 启用控件按钮通过工具提示显示其描述。 |
cmdClose | 关闭窗体。 |
cmdMaxRes | 最大化/还原窗体。 |
cmdMin | 最小化窗体。 |
swresize | 右下角调整大小手柄。 |
nwresize | 左下角调整大小手柄。 |
panelmod1 | (我忘了重命名它,抱歉) 标题栏。 |
这些控件中的每一个都有事件处理程序,以便它们能够正常工作。调整大小和移动功能使用非托管代码(SendMessage
和 ReleaseCapture
)。
下面的图片显示了一个演示窗体。(右侧=普通 Windows 主题|FormBorderStyle: Sizable; TopLevel: True;)和(左侧=Mac 主题|FormBorderStyle:none; TopLevel:False; ParentForm:mactheme)
使用代码
此库可以生成三种类型的 Mac 主题窗体。
1. 厚边框 | 可调整大小(顶部边角不可调整大小)
2. 厚边框;禁用调整大小 | 对话框窗口
3. 细边框 | 可调整大小(边角不可调整大小)
包含的命名空间
using System; using System.Collections.Generic; using System.Windows.Forms; using System.Text; using System.Drawing; using System.IO; using System.Runtime.InteropServices;
以下是应用主题的函数。[建议在窗体的 Load 事件中编写]
using xthemecore_macos;
A] 选择要应用主题的窗体。为窗体创建 Load 事件。
B] 创建实例:
ThemeManager mgr = new ThemeManager();
C] 应用主题 [每个窗体只能应用一个]
1. 厚边框 | 可调整大小
mgr.ApplyFormThemeSizable(name_of_form);
2. 厚边框;禁用调整大小 | 对话框窗口
mgr.ApplyFormThemeSingleSizable(name_of_form);
3. 细边框 | 可调整大小(如果对话框没有所有者,可以在 parentForm 参数上留空 null
。)
请记住:
-> 当为一个窗体内的窗体分配所有者(该窗体具有此 Mac 主题)时,不要键入 this
,而是键入 this
.ParentForm
,因为一旦应用 Mac 主题,您的窗体就会变成子控件。
mgr.ApplyFormThemeDialog(name_of_form, name_of_owner);
包含的一些代码片段
您可以使用以下代码将窗体转换为低级控件...
Form parentForm = new Form(); this.TopLevel = false; this.FormBorderStyle = FormBorderStyle.None; parentForm.Controls.Add(this); parentForm.Show();
此库使用一些 Windows API 进行移动和调整大小操作。
internal const int WM_NCLBUTTONDOWN =161; internal const int HT_CAPTION = 0x2; internal const int HTBOTTOM = 15; internal const int HTBOTTOMLEFT = 16; internal const int HTBOTTOMRIGHT = 17; internal const int HTRIGHT = 11; internal const int HTLEFT = 10; internal const int HTTOP = 12;
[DllImport("user32.dll")] public static extern int SendMessage(IntPtr hWnd, uint Msg, long lParam, long wParam); [DllImport("user32.dll")] public static extern bool ReleaseCapture();
我使用了启用了双缓冲的面板以防止闪烁。
public class panelmod : Panel { public panelmod() { //sets the DoubleBuffered property of the panel to true. this.DoubleBuffered = true; } }
一些小问题
a] 您可能会发现调整大小很困难,尤其是在细边框主题上。
b] 必须清楚地说明窗体所有权。请记住,Mac 主题窗体将是您应用了主题的窗体的所有者。
------------------
此内容仅用于趣味/教育目的,并非 intended 用于任何项目。不提供支持。
历史
这是本文的原始版本。
- 2010.04.06 - 初始版本
- 2024.09.01 - 发布到公共领域(取代源代码中的任何许可证)