65.9K
CodeProject 正在变化。 阅读更多。
Home

Mac OS X Windows Forms 主题

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.78/5 (25投票s)

2010 年 4 月 26 日

公共领域

5分钟阅读

viewsIcon

135603

downloadIcon

14007

将 Mac OS 窗口主题应用于您的应用程序。

下载 Mac_Theme_for_WinForms.zip - 2.56 MB

引言

一些程序员可能希望为他们的窗体应用一些主题或皮肤,使其看起来酷炫、精致且引人注目。我为所有人创建了一个 Mac OS X 开源主题库,本文将介绍其用法。

背景

我是一个忠实的 Apple Mac OS X 粉丝。不幸的是,我买不起 Mac,所以我希望在我的 Windows 窗体应用程序中拥有 Mac OS X 应用程序的外观和感觉。我创建了一个库,以便可以在任何 WinForms 中使用它。我的这个想法并不修改窗体的非客户区,而是创建一个新的预先设计的 Mac 主题无边框窗体,并将您的目标窗体作为其子控件。

 

如何创建

该主题完全由一个无边框窗体组成,其中包含大量启用了双缓冲的面板,每个面板都经过特殊定位,用作标题栏、控件按钮、调整大小手柄以及您要应用主题的窗体的容器。

macformtheme/macthemestruct.png

 

此窗体包括几个事件,如调整大小、移动、最大化、最小化和关闭。目标窗体(应用主题的窗体)已转换为控件,并将归 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 (我忘了重命名它,抱歉) 标题栏。

 

 

 

这些控件中的每一个都有事件处理程序,以便它们能够正常工作。调整大小和移动功能使用非托管代码(SendMessageReleaseCapture)。

 

下面的图片显示了一个演示窗体。(右侧=普通 Windows 主题|FormBorderStyle: Sizable; TopLevel: True;)和(左侧=Mac 主题|FormBorderStyle:none; TopLevel:False; ParentForm:mactheme)

macformtheme/macthemecomp.png

 

使用代码

此库可以生成三种类型的 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 - 发布到公共领域(取代源代码中的任何许可证)
© . All rights reserved.