创建圆角或者圆形窗体

本实例使用API函数CreateRoundRectRgn和SetWindowRgn来创建圆角或者圆形窗体。

 

窗口代码如下:

'用户昵称: 留下些什么
'个人简介: 一个会做软件的货代
'CSDN网址:https://blog.csdn.net/zezese
'电子邮箱:31319180@qq.com

Option Explicit

Private Const WM_NCLBUTTONDOWN As Long = &HA1
Private Const HTCAPTION As Long = 2

Private Declare Sub ReleaseCapture Lib "user32" ()
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal x1 As Long, ByVal y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
Private Declare Function GetWindowRect Lib "user32.dll" (ByVal hwnd As Long, ByRef lpRect As RECT) As Long

Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type


Private Sub Command1_Click()
    Unload Me
End Sub

Private Sub Form_DblClick()
    Unload Me
End Sub

Private Sub Form_Load()
    'Me.BorderStyle = 0 设计时 设置为 无边框窗体
    
    '调整直径,窗体大小,可以实现方形圆角窗体 或者 圆形窗体 (窗体边长=直径)
    
    Const diameter As Long = 400 '直径,单位像素
    
    Me.Height = diameter * VB.Screen.TwipsPerPixelY
    Me.Width = diameter * VB.Screen.TwipsPerPixelX
    
    Dim FormWidthInPixels As Long, FormHeightInPixels As Long
    
    Dim rWin As RECT
    GetWindowRect hwnd, rWin
    FormWidthInPixels = rWin.Right - rWin.Left
    FormHeightInPixels = rWin.Bottom - rWin.Top
    
    Dim rtn As Long

    rtn = CreateRoundRectRgn(0, 0, FormWidthInPixels, FormHeightInPixels, diameter, diameter)
    Call SetWindowRgn(hwnd, rtn, True)
    
End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    
    '点击鼠标左键,可以移动窗口
    
    If Button = vbLeftButton Then
        ReleaseCapture
        SendMessage hwnd, WM_NCLBUTTONDOWN, HTCAPTION, ByVal 0&
    End If
    
End Sub

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Winform圆角窗体可以通过自定义类和继承实现。具体步骤如下: 1. 创建项目,添加自定义类:MyWin32.cs和PerPixelAlphaBlend.cs;圆角窗体RoundedForm ;继承RoundedForm的窗体Form1。 2. 在MyWin32.cs中添加以下代码: ```csharp using System; using System.Runtime.InteropServices; namespace Win32 { public static class MyWin32 { [DllImport("user32.dll")] public static extern IntPtr GetDC(IntPtr hWnd); [DllImport("user32.dll")] public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); [DllImport("gdi32.dll")] public static extern IntPtr CreateCompatibleDC(IntPtr hDC); [DllImport("gdi32.dll")] public static extern int DeleteDC(IntPtr hDC); [DllImport("gdi32.dll")] public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject); [DllImport("gdi32.dll")] public static extern int DeleteObject(IntPtr hObject); [DllImport("user32.dll")] public static extern int GetWindowRect(IntPtr hWnd, out RECT lpRect); [StructLayout(LayoutKind.Sequential)] public struct RECT { public int Left; public int Top; public int Right; public int Bottom; } } } ``` 3. 在PerPixelAlphaBlend.cs中添加以下代码: ```csharp using System; using System.Drawing; using System.Drawing.Imaging; using System.Runtime.InteropServices; namespace Win32 { public static class PerPixelAlphaBlend { [DllImport("user32.dll")] public static extern IntPtr GetDC(IntPtr hWnd); [DllImport("user32.dll")] public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); [DllImport("gdi32.dll")] public static extern IntPtr CreateCompatibleDC(IntPtr hDC); [DllImport("gdi32.dll")] public static extern int DeleteDC(IntPtr hDC); [DllImport("gdi32.dll")] public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject); [DllImport("gdi32.dll")] public static extern int DeleteObject(IntPtr hObject); [DllImport("msimg32.dll", EntryPoint = "AlphaBlend")] public static extern bool AlphaBlend(IntPtr hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, IntPtr hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, BLENDFUNCTION blendFunction); [StructLayout(LayoutKind.Sequential)] public struct BLENDFUNCTION { public byte BlendOp; public byte BlendFlags; public byte SourceConstantAlpha; public byte AlphaFormat; } public static void SetBitmap(Bitmap bitmap, Control control) { SetBitmap(bitmap, control, 255); } public static void SetBitmap(Bitmap bitmap, Control control, byte opacity) { if (control == null) { throw new ArgumentNullException("control"); } IntPtr screenDc = GetDC(IntPtr.Zero); IntPtr memDc = CreateCompatibleDC(screenDc); IntPtr hBitmap = IntPtr.Zero; IntPtr oldBitmap = IntPtr.Zero; try { hBitmap = bitmap.GetHbitmap(Color.FromArgb(0)); oldBitmap = SelectObject(memDc, hBitmap); Size size = new Size(bitmap.Width, bitmap.Height); Point pointSource = new Point(0, 0); Point topPos = new Point(control.Left, control.Top); Win32.MyWin32.BLENDFUNCTION blend = new Win32.MyWin32.BLENDFUNCTION(); blend.BlendOp = 0; blend.BlendFlags = 0; blend.SourceConstantAlpha = opacity; blend.AlphaFormat = 1; Win32.MyWin32.RECT sourceRect = new Win32.MyWin32.RECT() { Left = pointSource.X, Top = pointSource.Y, Right = pointSource.X + size.Width, Bottom = pointSource.Y + size.Height }; Win32.MyWin32.RECT destRect = new Win32.MyWin32.RECT() { Left = topPos.X, Top = topPos.Y, Right = topPos.X + size.Width, Bottom = topPos.Y + size.Height }; IntPtr screenDc2 = GetDC(IntPtr.Zero); AlphaBlend(screenDc2, destRect.Left, destRect.Top, destRect.Right - destRect.Left, destRect.Bottom - destRect.Top, memDc, sourceRect.Left, sourceRect.Top, sourceRect.Right - sourceRect.Left, sourceRect.Bottom - sourceRect.Top, blend); ReleaseDC(IntPtr.Zero, screenDc2); } finally { SelectObject(memDc, oldBitmap); DeleteObject(hBitmap); DeleteDC(memDc); ReleaseDC(IntPtr.Zero, screenDc); } } } } ``` 4. 在RoundedForm.cs中添加以下代码: ```csharp using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; namespace Win32 { public class RoundedForm : Form { private int radius = 20; public int Radius { get { return radius; } set { radius = value; } } protected override void OnPaint(PaintEventArgs e) { GraphicsPath path = GetRoundPath(ClientRectangle, radius); this.Region = new Region(path); e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; e.Graphics.FillPath(new SolidBrush(Color.White), path); } private GraphicsPath GetRoundPath(RectangleF rect, int radius) { float r2 = radius / 2f; GraphicsPath path = new GraphicsPath(); path.AddArc(rect.X, rect.Y, radius, radius, 180, 90); path.AddLine(rect.X + r2, rect.Y, rect.Width - r2, rect.Y); path.AddArc(rect.X + rect.Width - radius, rect.Y, radius, radius, 270, 90); path.AddLine(rect.Width, rect.Y + r2, rect.Width, rect.Height - r2); path.AddArc(rect.X + rect.Width - radius, rect.Y + rect.Height - radius, radius, radius, 0, 90); path.AddLine(rect.Width - r2, rect.Height, rect.X + r2, rect.Height); path.AddArc(rect.X, rect.Y + rect.Height - radius, radius, radius, 90, 90); path.AddLine(rect.X, rect.Height - r2, rect.X, rect.Y + r2); path.CloseFigure(); return path; } } } ``` 5. 在Form1.cs中继承RoundedForm,并添加以下代码: ```csharp public partial class Form1 : RoundedForm { public Form1() { InitializeComponent(); this.Radius = 20; } } ``` 6. 在Form1.Designer.cs中添加以下代码: ```csharp this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(284, 261); this.Name = "Form1"; this.Text = "Form1"; ``` 7. 在Form1_Load事件中添加以下代码: ```csharp private void Form1_Load(object sender, EventArgs e) { this.BackColor = Color.FromArgb(0, 0, 0, 0); PerPixelAlphaBlend.SetBitmap(Properties.Resources.background, this); } ``` 其中,background是一个png格式的图片,用于设置窗体背景。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值