Bai 7 4

4 0 0
Bai 7 4

Đang tải... (xem toàn văn)

Thông tin tài liệu

Microsoft Word Bai 7 4 doc Trang 1 MÔN LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Bài thực hành số 7 4 Xây dựng chương trình ₫ồng hồ có hình dạng tùy ý bằng cách lập trình ₫ộng I Mục tiêu Giúp SV làm quen với cách thứ[.]

Trang MƠN : LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG Bài thực hành số 7.4 : Xây dựng chương trình ₫ồng hồ có hình dạng tùy ý cách lập trình ₫ộng I Mục tiêu : ƒ Giúp SV làm quen với cách thức tạo form có hình dạng ảnh bitmap qui ₫ịnh II Nội dung : ƒ Lập trình ₫ộng thuộc tính liên quan Form ₫ể có hình dạng ảnh qui ₫ịnh ƒ Hiện thực lại chức control button ₫ã bị : ₫óng form, di dời form III Chuẩn ₫ầu : ƒ Sinh viên nắm vững lập trình thành thạo ₫oạn code ₫ể tạo form có hình dạng tùy ý IV Qui trình : Thực lại thực hành 7.1 hay nhân thư mục chứa Project thực hành 7.1 thành Project NRF_Dongho_P Chạy VS Net, chọn menu File.Open.Project mở lại Project NRF_Dongho_P Ấn phải chuột vào mục Form1.cs cửa sổ Solution Explorer chọn option View Designer ₫ể hiển thị lại cửa sổ thiết kế Form Chọn Form, cửa sổ thuộc tính hiển thị, duyệt tìm mục BackgroundImage kiểm tra xem ₫ã chứa ảnh ₫ồng hồ chưa Nếu chưa khai báo ảnh cho Form Tìm hàm Form1_Load viết thêm ₫oạn code ₫ể thiết lập hình dạng form theo ảnh sau : private void Form1_Load(object sender, EventArgs e) { //tạo ₫ối tượng quản lý assembly System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetExecutingAssembly(); //tạo ₫ối tượng Stream miêu tả ảnh bitmap Stream myStream = myAssembly.GetManifestResourceStream("Form_Dongho.Resources.DonghoTho.bmp"); //tạo ₫ối tượng ảnh bitmap bgimg = new Bitmap(myStream); //xác ₫ịnh màu cần lọc bỏ Color col = bgimg.GetPixel(1, 1); //thiết lập hình dạng Form ứng dụng theo ảnh bitmap this.Region = ConvertB2R(bgimg, col); //thiết lập ảnh cho Form this.BackgroundImage = bgimg; //ẩn tittle bar ₫ường viền form this.FormBorderStyle = FormBorderStyle.None; } Viết thêm hàm dịch vụ ₫ể xây dựng Region cho Form theo ảnh : //hàm kiểm tra pixel ảnh có trùng màu qui ₫ịnh không bool Equal(Byte[] pbase, int idx, Color key) { if (pbase[idx] != key.B) return false; if (pbase[idx + 1] != key.G) return false; if (pbase[idx + 2] != key.R) return false; Trang if (pbase[idx + 3] != key.A) return false; return true; } //hàm chuyển ảnh bitmap thành Region qui ₫ịnh ₫ường viền ảnh Region ConvertB2R(Bitmap bitmap, Color Key) { GraphicsUnit unit = GraphicsUnit.Pixel; //xác ₫ịnh kích thước ảnh RectangleF boundsF = bitmap.GetBounds(ref unit); Rectangle bounds = new Rectangle((int)boundsF.Left, (int)boundsF.Top, (int)boundsF.Width, (int)boundsF.Height); //xác ₫ịnh liệu ành BitmapData bitmapData = bitmap.LockBits(bounds, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); //xác ₫ịnh ₫ịa hàng pixel ₫ầu tiên IntPtr ptr = bitmapData.Scan0; //xác ₫ịnh ₫ộ dài vùng nhớ chứa toàn pixel ảnh (24 bits per pixels) int bytes = Math.Abs(bitmapData.Stride) * bitmap.Height; //copy vùng chứa toàn pixel ảnh vào pbase byte[] pbase = new byte[bytes]; System.Runtime.InteropServices.Marshal.Copy(ptr, pbase, 0, bytes); //xác ₫ịnh số hàng, cột ảnh bitmnap int yMax = (int)boundsF.Height; int xMax = (int)boundsF.Width; //tạo ₫ối tượng Path chứa path miêu tả ảnh GraphicsPath path = new GraphicsPath(); int isrow = 0; int idx = 0; int x, y; for (y = 0; y < yMax; y++) { //duyệt xử lý hàng pixel idx = isrow; //setup offset vùng nhớ chứa pixel hành for (x = 0; x < xMax; x++) { //nếu pixel hành trùng màu bỏ qua if (Equal(pbase, idx, Key)) { idx = idx + 4; //hiệu chỉnh offset vùng nhớ chứa pixel hành continue; } //nhớ vị trí pixel lề trái vùng ảnh tìm ₫ược int x0 = x; //duyệt tìm lề phải vùng ảnh tìm ₫ược while (x < xMax && (!Equal(pbase, idx, Key))) { x = x + 1; idx = idx + 4; } //add path chữ nhật miêu tả ₫oạn pixel ảnh tìm ₫ược path.AddRectangle(new Rectangle(x0, y, x - x0, 1)); } Trang //hiệu chỉnh offset vùng nhớ chứa hàng pixel isrow = isrow + bitmapData.Stride; } //tạo Region ₫ược miêu tả ₫ối tượng Path vừa tìm ₫ược Region region = new Region(path); //dọn dẹp path.Dispose(); bitmap.UnlockBits(bitmapData); //trả region tìm ₫ược return region; } Dời ₫ầu file, thêm lệnh using sau ₫ây ₫ể dùng dịch vụ xử lý ảnh : using System.Drawing.Imaging; using System.Drawing.Drawing2D; Chọn menu Debug.Start Debugging ₫ể dịch chạy ứng dụng Xem kết ₫ánh giá kết Ta thấy Form có hình dạng ảnh qui ₫ịnh khơng cịn titlebar button ₫iều khiển nên khơng thể di dời hay ₫óng Form trực quan ₫ược Ta thực tiếp số việc ₫ể giải vấn ₫ề Hãy ₫óng Form lại (bằng cách chọn option Debug.Stop Debugging hay chọn option “Close window” menu pop-up icon ứng dụng taskbar) Ấn phải chuột vào mục Form1.cs cửa sổ Solution Explorer chọn option View Designer ₫ể hiển thị lại cửa sổ thiết kế Form Chọn Form, cửa sổ thuộc tính hiển thị, click icon ₫ể hiển thị danh sách kiện Form, duyệt tìm kiện MouseDown, MouseUp, MouseMove tạo hàm xử lý kiện tương ứng Viết code cụ thể cho hàm vừa tạo sau : private void Form1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) //chỉ chấp nhận ấn chuột trái { //kiểm tra việc click chuột ₫ể ₫óng form if (Math.Abs(e.X - xC) < EPSI && Math.Abs(e.Y - yC) < EPSI) Close(); //drag chuột : lưu giữ vị trí chuột vị trí Form lúc bắt ₫ầu drag mouseDownPos = Control.MousePosition; formDownPos = Location; //ghi nhận trạng thái giữ chuột isMouseDown = true; } } private void Form1_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) //chỉ chấp nhận thả chuột trái //ghi nhận trạng thái thả chuột isMouseDown = false; } private void Form1_MouseMove(object sender, MouseEventArgs e) { if (isMouseDown) { Trang //xác ₫ịnh vị trí chuột hành Point mousePos = Control.MousePosition; //tính ₫ộ dời chuột so với ví trị bắt ₫ầu drag int dx = mousePos.X - mouseDownPos.X; int dy = mousePos.Y - mouseDownPos.Y; //thiết lập vị trí cho Form theo yêu cầu drag Location = new Point(formDownPos.X +dx, formDownPos.Y +dy); } } 10 Dời cursor nhập liệu ₫ầu class Form1 viết thêm lệnh ₫ịnh nghĩa thuộc tính cần dùng ₫ể quản lý chuột sau : private Point formDownPos; //vị trí Form lúc bất ₫ầu drag chuột private Point mouseDownPos; //vị trí chuột lúc bất ₫ầu drag chuột private Boolean isMouseDown = false; //tọa ₫ộ tâm button Close form int xC = 94; int yC = 43; //sai số chấp nhận so với tâm button Close const int EPSI = 10; 11 Chọn menu Debug.Start Debugging ₫ể dịch chạy ứng dụng Thử ₫óng cửa sổ khác ₫ể Form ₫ồng hồ hiển thị desktop Xem kết hiển thị, thử drag mouse ₫ể dời Form ₫ồng hồ Click thử vào vị trí mắt phải thỏ (₫ại diện button Close) xem form có ₫óng lại khơng

Ngày đăng: 09/04/2023, 06:40

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan