Bạn muốn tạo ra ứng dụng có giao diện gây ấn tượng với người dùng, form bình thường có dạng hình dạng chữ nhật hoặc vuông không thỏa mãn yêu cầu của bạn? Bạn muốn tạo form có hình dạng bất kỳ? Trong C#, chúng ta hoàn toàn có thể làm điều này với một thủ thuật rất đơn giản.
Form và hầu hết các control (điều khiển) trong C# đều có thuộc tính Region. Thuộc tính này quy định một vùng để Form hoặc control hiển thị. Để tạo ra form hay control có hình dạng bất kỳ, chúng ta phải tạo ra một vùng màn hình theo hình dạng mong muốn và truyền vùng màn hình này vào cho thuộc tính Region.
Chúng ta có thể tự vẽ một region hoặc tạo nó từ một ảnh bitmap. Trong bài hướng dẫn này, tôi sẽ trình bày cách tạo một region từ một ảnh bitmap và “ép” nó vào form.
Đầu tiên, ta tạo một lớp có chức năng chuyển một ảnh bitmap thành một region, tạm gọi là lớp BitmapRegion.
using System.Drawing; using System.Windows.Forms; using System.Drawing.Drawing2D; namespace CustomShapedForm { public class BitmapRegion { public BitmapRegion() { } public static void CreateRegion(Control ct, Bitmap bm) { if (ct == null || bm == null) { return; } // Thiết lập kích thước của control bằng với // kích thước của bitmap ct.Width = bm.Width; ct.Height = bm.Height; // kiểm tra xem ct có phải là Form if (ct is System.Windows.Forms.Form) { Form fm = (Form)ct; // Tăng kích thước form để dành chổ cho đường viền (nếu có) fm.Width += 15; fm.Height += 35; // thiết lập form trở thành không có border fm.FormBorderStyle = FormBorderStyle.None; // đưa bitmap trở thành background image fm.BackgroundImage = bm; // tính toán graphics path dựa trên bitmap GraphicsPath path = CalculateGraphicsPath(bm); // thay đổi thuộc tính Region của form fm.Region = new Region(path); } else if (ct is System.Windows.Forms.Button) { Button bt = (Button)ct; bt.Text = ""; // không hiển thị label của button bt.Cursor = Cursors.Hand; // thiết lập background image cho button bt.BackgroundImage = bm; GraphicsPath path = CalculateGraphicsPath(bm); bt.Region = new Region(path); } } private static GraphicsPath CalculateGraphicsPath(Bitmap bm) { GraphicsPath path = new GraphicsPath(); // dùng màu của góc trên trái của bm là màu transparent Color transparentColor = bm.GetPixel(0, 0); // duyệt bm theo cột for (int row = 0; row < bm.Height; row++) { // duyệt bm theo hàng for (int col = 0; col < bm.Width; col++) { if (bm.GetPixel(col, row) != transparentColor) { int i = col; // đếm số pixel trong hàng khác màu với transparentColor for (i = col+1; i < bm.Width; i++) { if (bm.GetPixel(i, row) == transparentColor) break; } path.AddRectangle(new Rectangle(col, row, i-col, 1)); col = i; } } } return path; } } }
Ý tưởng: chúngta sẽ quét toàn bộ ảnh bitmap này, lọc tất cả các pixel có màu khác với màu nền (background) và cho vào một đối tượng GraphicsPath. Mục đích là để lấy vùng Shape. Sau đó ta sẽ tạo một region từ Graphic Path này và ép nó vào form hoặc control. Ví dụ:
public Form1() { InitializeComponent(); BitmapRegion.CreateRegion(this, bmForm); BitmapRegion.CreateRegion(btnExit, bmExit); }
Kết quả:
Chúc các bạn thành công. Các bạn có thể download chương trình mẫu bên dưới.
Source code tham khảo:
[sociallocker id=”444″]Download[/sociallocker]