[C#]绘制自定义窗体

去windows除边框

初始窗口样式:

将窗口FormBorderStyle属性设为None,就可以去除四周边框

此时窗口将成为什么也没有的一个白板。

标题栏

标题栏

拖一个panel控件到窗体上,设置背景图片,作为标题栏。

窗口图标和主题

用一个PictureBox作为Logo,导入图片,并将BackColor属性设为Transparent。

用一个Label作为窗口主题,不妨就把Text值设为窗口,BackColor属性设为Transparent。

最小化、关闭按钮

(1)设置按钮样式

首先,拖两个PictureBox控件到标题栏;

然后分别为两个PictureBox的Image设置最小化、关闭按钮的图片;

将BackColor的属性设为Transparent。

此时,窗口的效果如下:

注:刚开始,我使用的是Button控件作为最小化、关闭按钮。但是不知为什么,有时候按钮周围会出现边框,且无法消除,所以改用PictureBox代替。

有兴趣的朋友可以试一试这个方法:

将Button的Text值清除;为Button的Image导入一个对应图片(如果要和背景色对应上,最好是透明图片);将Button的BackColor属性设为Transparent;将FlatStyle属性设为Flat,

MouseDownBackColor和MouseOverBackColor属性都设为Transparent,并将BorderSize设为0.

标题栏的相关事件

基本样式似乎差不多了,但是因为我们隐去了windows默认窗体的标题栏,所以不能拖拽窗口,也不能最小化、关闭窗口。

那么,好吧,我们自己来动手写。

拖拽窗体

为标题栏,也就是我们前面添加的Panel控件添加MouseDown和MouseMove两个事件。

然后根据鼠标的位置动态刷新窗体的位置。

代码如下:

private Point offset;
private void panelTitleBar_MouseDown(object sender, MouseEventArgs e)
{
    if (MouseButtons.Left != e.Button) return;
    Point cur = this.PointToScreen(e.Location);
    offset = new Point(cur.X - this.Left, cur.Y - this.Top);
}
 
private void panelTitleBar_MouseMove(object sender, MouseEventArgs e)
{
    if (MouseButtons.Left != e.Button) return;
    Point cur = MousePosition;
    this.Location = new Point(cur.X - offset.X, cur.Y - offset.Y);
}

最小化窗口

为最小化按钮,也就是我们添加的PictureBox添加点击事件。

一行代码搞定,设置窗体状态。

private void pictureBoxMinimize_Click(object sender, EventArgs e)
{
    this.WindowState = FormWindowState.Minimized;
}

关闭窗口

为关闭按钮,添加点击事件。

关闭窗口,释放资源。

private void pictureBoxClose_Click(object sender, EventArgs e)
{
    this.Close();
    this.Dispose();
}

至此,一个简陋的窗体需要的基本功能就完成了。

绘制边框

前面的窗体因为去除了windows窗体的自带边框,所以整个窗体没有边框,显示的时候会有些奇怪,尤其是桌面背景色为白色的时候。

可以使用下面的方法绘制窗体边框

在窗体加载事件中需要将FormBorderStyle属性设为FormBorderStyle.FixedSingle。

#region 窗口边框
// 重绘窗口边框
// 加载窗口时必须使用以下语句才能生效
// this.FormBorderStyle = FormBorderStyle.FixedSingle;
protected override CreateParams CreateParams
{
    get
    {
        const int WS_CAPTION = 0xC00000;
        const int WS_BORDER = 0x800000;
        CreateParams CP = base.CreateParams;
        CP.Style &= ~WS_CAPTION | WS_BORDER;
        return CP;
    }
}
#endregion
 
private void Form1_Load(object sender, EventArgs e)
{
    this.FormBorderStyle = FormBorderStyle.FixedSingle;
}

运行后,效果如下:

绘制阴影

第一种方式

缺点:如果不是windows默认窗体,则只有右下角有阴影效果。

引用System.Runtime.InteropServices;

private void Form1_Load(object sender, EventArgs e)
{
    SetClassLong(this.Handle, GCL_STYLE, GetClassLong(this.Handle, GCL_STYLE) | CS_DropSHADOW);
}

private const int CS_DropSHADOW = 0x20000;
private const int GCL_STYLE = (-26);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int SetClassLong(IntPtr hwnd, int nIndex, int dwNewLong);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int GetClassLong(IntPtr hwnd, int nIndex);

效果图

第二种方式:

感谢乔克斯的方法,原址:http://bbs.cskin.net/thread-61-1-1.html

添加引用SkinForm.dll,然后using CCWin

最后让Form对象继承SkinMain类即可。

using System;
using System.Drawing;
using System.Windows.Forms;

using System.Runtime.InteropServices;
using CCWin;

namespace WinformTest
{
    public partial class PrivateForm : SkinMain
    {
        public PrivateForm()
        {
            InitializeComponent();
        }

private void Form1_Load(object sender, EventArgs e)
        {
            //SetClassLong(this.Handle, GCL_STYLE, GetClassLong(this.Handle, GCL_STYLE) | CS_DropSHADOW);
        }

... ...
    }
}

效果如下:

至此,一个简易的自定义窗口就实现了,还像个样子吧。

参考资料

http://www.sufeinet.com/thread-9411-1-1.html

http://bbs.cskin.net/thread-61-1-1.html

时间: 2025-01-06 18:20:00

[C#]绘制自定义窗体的相关文章

WP、Win10开发或者WPF开发时绘制自定义窗体~例如:一个手机

WP and Win10 效果:(数字是参考值,和UI无关) <Page x:Class="_05.AllControls._BorderUsePage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using

paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制

源地址:http://blog.csdn.net/attilax/article/details/12343625 paip.提升用户体验---c++ qt自定义窗体(1)---标题栏的绘制 效果图: 作者Attilax ,  EMAIL:[email protected] 来源:attilax的专栏地址:http://blog.csdn.net/attilax 第一步:去掉系统默认标题栏 1 第2步:添加自定义标题栏以及最小化,最大化.关闭按钮...还有左边的窗体小图标.. 2 第3步:添加标

WPF设计の自定义窗体

原文:WPF设计の自定义窗体 效果图如下: 实现思路: 1.继承Window类 2.为自定义的CustomWindow类设计窗体样式(使用Blend很方便!) 3.为窗体增加最大最小化和关闭按钮,并实现鼠标拖拽改变窗体大小(使用Derek Bartram的WindowResizer.dll库) 代码说明: 1.继承Window类 创建CustomWindow类,继承自System.Window 代码 public class CustomWindow : Window{    public Cu

自定义窗体的最大化,最小化,关闭功能

namespace 自定义窗体的最大化_最小化和关闭按钮 { partial class Form1 { /// <summary> /// 必需的设计器变量. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// 清理所有正在使用的资源. /// </summary> /// <param name="disp

WPF 创建自定义窗体

在前面的一篇博客"WPF 自定义Metro Style窗体",展示了如何创建一个类似于Metro Style的Window,并在程序中使用.但是这个窗体不能够自由的改变大小.今天的博客中将展示如何创建一个可以通过拖拽来改变大小的Metro Style窗体. 实现思路,在Windows ControlTemplate中增加8个背景透明Rectangle,分别放置于Left, Right, Top, TopLeft, TopRight, Bottom, BottomLeft, Bottom

Unity 编辑器扩展自定义窗体

这次看见Unity还可以自定义弹出窗体,让我很好奇.于是就去网上找文章看了看. 如果想自定义窗体需要把类放入Editor文件夹下面. 代码如下: using UnityEngine; using UnityEditor; public class MyEditor : EditorWindow { [MenuItem("GameObject/window")] static void AddWindow() { Rect wr = new Rect(0, 0, 500, 500); M

添加资源图片,获取图片实例并绘制到窗体

项目右键属性——资源——添加资源展开——添加现有文件 paint方法中: private void Form1_Paint(object sender, PaintEventArgs e) { using (Graphics g = e.Graphics) { g.DrawImage((Image)zhbImgConvert.Properties.Resources.ResourceManager.GetObject("_001"), 10, 70); } } 添加资源图片,获取图片实

完全自定义窗体风格的实现

完全自定义窗体风格的实现 最小化到任务栏postmessage(Self.Handle,WM_SYSCOMMAND,SC_MINIMIZE,0); 最大化或还原procedure Tf_MainForm.RzToolButton1Click(Sender: TObject);var  abd: TAppBarData;begin  inherited;  if WindowState=wsnormal then begin    WindowState := wsMaximized;  // B

Qt绘制异形窗体

异形窗体即不规则窗体,一般采用png图片,一般绘制异形窗体分两步: 1.设置遮罩区 2.绘制图片   使用png图片的透明部分作为遮罩区,然后绘制图片,这样我们就看到一个只绘制了非透明部分的图形,废话少说,以实现绘制一只蝴蝶(蝴蝶为半透明)为例,效果如下: 头文件: 1: #include <QWidget> 2: class TransDialog : public QWidget 3: { 4: Q_OBJECT 5: public: 6: explicit TransDialog(QWi