首页 Winform创建不规则窗体

Winform创建不规则窗体

°只为大大 2017-09-20 C# winform 4216 0

背景图片的不规则窗体

Formctor方法中添加以下代码

FormBorderStyle = FormBorderStyle.None;//设置窗体样式为无,没有关闭缩小等按钮
TransparencyKey = Color.FromArgb(240, 240, 240);//要透明的颜色,这个可以运行之后看看那块还未透明再用取色器设置对应的颜色
BackgroundImage = Resources._11;//设置窗体背景图片

经过上面已经可以创建不规则窗体了,但是窗体的大小貌似在ctor中设置没有反应,所以我就放在了Shown方法中

private void MainFrm_Shown(object sender, EventArgs e)
{
    Size = new Size(Resources._11.Width, Resources._11.Height);//设置窗体背景图片的大小
}

Formctor方法中添加以下代码

Shown += MainFrm_Shown;

此时窗体大小和图片大小应该是一致的,但是因为我们设置了FormBorderStyle = FormBorderStyle.None;,所以导致此时的窗体不能移动,那么添加如下方法

protected override void WndProc(ref Message message)
{
    base.WndProc(ref message);
    if (message.Msg != 0x84) return;
    switch (message.Result.ToInt32())
    {
        case 1:
            message.Result = new IntPtr(2);
            break;
    }
}

是不是就prefect了呢


自定义形状的不规则窗体

Formctor方法中添加以下代码

BackColor = Color.Aqua;//设置窗体背景颜色
Paint += OvalFrm_Paint;//重绘窗体

并添加以下代码实现,该方法

private void OvalFrm_Paint(object sender, PaintEventArgs e)
{
    GraphicsPath MyPath = new GraphicsPath();//创建一个路径对象
    MyPath.AddEllipse(20, 30, this.Width - 30, this.Height - 40); //将椭圆添加到路径对象中
    Region = new Region(MyPath);//使用椭圆构造一个区域,并将此区域作为程序窗体区域
}

此时运行就会看见一个椭圆形的窗体,如需定义其他形状,直接修改路径对象GraphicsPath的连接方式即可


文字窗体

Formctor方法中添加以下代码

BackColor = Color.Brown;//设置字体颜色
Paint += TextFrm_Paint;//重绘窗体

再导入win api

[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern IntPtr CreateFont(int h, int w, int e, int o, int fw, int I, int u, int s, int c, int op, int cp, int q, int paf, string f);
[System.Runtime.InteropServices.DllImport("user32")]
private static extern IntPtr GetDC(IntPtr hwnd);
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern IntPtr BeginPath(IntPtr hdc);
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern IntPtr EndPath(IntPtr hdc);
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern IntPtr PathToRegion(IntPtr hdc);
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern int SetBkMode(IntPtr hdc, int nBkMode);
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern IntPtr SelectObject(IntPtr hdc, IntPtr hObject);
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern int TextOut(IntPtr hdc, int x, int y, string lpString, int nCount);
[System.Runtime.InteropServices.DllImport("user32")]
private static extern IntPtr SetWindowRgn(IntPtr hwnd, IntPtr hRgn, bool bRedraw);

实现TextFrm_Paint方法

private void TextFrm_Paint(object sender, PaintEventArgs e)
{
    IntPtr myFont = CreateFont(160, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体_GB2312"); //创建新字体
    IntPtr myDc = GetDC(Handle); //取得设备句柄
    SetBkMode(myDc, 1); //设置背景模式
    BeginPath(myDc); //开始记录轮廓路径
    IntPtr myOldFont = SelectObject(myDc, myFont); //设置文字输出字体
    TextOut(myDc, 0, 20, "国家", 4); //输出文字
    SelectObject(myDc, myOldFont);//恢复原始字体对象
    EndPath(myDc);//结束记录轮廓路径绘制
    IntPtr myRgn = PathToRegion(myDc);//创建文字区域
    SetWindowRgn(this.Handle, myRgn, true);//使用文字区域创建程序窗体
}

源码 : https://git.kerwin.cn/Shares/Irregular.git

除另有声明外,本文章Winform创建不规则窗体采用 知识共享(Creative Commons) 署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 进行许可。

评论
目录