Giáo trình thực hành 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

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ức tạo form có hình dạng do ảnh bitmap qui ₫ịnh.  
II. Nội dung :  
ƒ
ƒ
Lập trình ₫ộng các thuộc tính liên quan của Form ₫ể nó có hình dạng do ảnh nền qui  
₫ịnh.  
Hiện thực lại các chức năng trong các control button ₫ã bị mất : ₫óng form, di dời form.  
III. Chuẩn ₫ầu ra :  
ƒ
Sinh viên nắm vững và lập trình thành thạo các ₫oạn code ₫ể tạo form có hình dạng tùy ý.  
IV. Qui trình :  
1. Thực hiện lại bài thực hành 7.1 hay nhân bản thư mục chứa Project thực hành 7.1 thành  
Project NRF_Dongho_P.  
2. Chạy VS .Net, chọn menu File.Open.Project rồi mở lại Project NRF_Dongho_P.  
3. Ấn phải chuột vào mục Form1.cs trong cửa sổ Solution Explorer rồi 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 của nó sẽ hiển thị,  
duyệt tìm mục BackgroundImage và kiểm tra xem nó ₫ã chứa ảnh nền ₫ồng hồ chưa. Nếu  
chưa thì khai báo ảnh nền cho Form.  
4. Tìm hàm Form1_Load và viết thêm ₫oạn code ₫ể thiết lập hình dạng của form theo ảnh nền  
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 nền  
bgimg = new Bitmap(myStream);  
//xác ₫ịnh màu nền 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 nền cho Form  
this.BackgroundImage = bgimg;  
//ẩn tittle bar và ₫ường viền của form  
this.FormBorderStyle = FormBorderStyle.None;  
}
5. Viết thêm 2 hàm dịch vụ ₫ể xây dựng Region cho Form theo ảnh nền :  
//hàm kiểm tra 1 pixel ảnh có trùng màu nền 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 2  
if (pbase[idx + 3] != key.A) return false;  
return true;  
}
//hàm chuyển ảnh bitmap thành Region qui ₫ịnh ₫ường viền của ảnh  
Region ConvertB2R(Bitmap bitmap, Color Key)  
{
GraphicsUnit unit = GraphicsUnit.Pixel;  
//xác ₫ịnh kích thước ảnh nền  
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 dữ liệu của ành nền  
BitmapData bitmapData = bitmap.LockBits(bounds, ImageLockMode.ReadOnly,  
PixelFormat.Format32bppArgb);  
//xác ₫ịnh ₫ịa chỉ của hàng pixel ₫ầu tiên  
IntPtr ptr = bitmapData.Scan0;  
//xác ₫ịnh ₫ộ dài vùng nhớ chứa toàn bộ pixel ảnh (24 bits per pixels).  
int bytes = Math.Abs(bitmapData.Stride) * bitmap.Height;  
//copy vùng chứa toàn bộ 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 của ảnh bitmnap  
int yMax = (int)boundsF.Height;  
int xMax = (int)boundsF.Width;  
//tạo ₫ối tượng Path chứa các path miêu tả ảnh nền  
GraphicsPath path = new GraphicsPath();  
int isrow = 0;  
int idx = 0;  
int x, y;  
for (y = 0; y < yMax; y++)  
{ //duyệt xử lý từng hàng pixel  
idx = isrow; //setup offset vùng nhớ chứa pixel hiện hành  
for (x = 0; x < xMax; x++)  
{
//nếu pixel hiện hành trùng màu nền thì bỏ qua  
if (Equal(pbase, idx, Key))  
{
idx = idx + 4; //hiệu chỉnh offset vùng nhớ chứa pixel hiện 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 3  
//hiệu chỉnh offset vùng nhớ chứa hàng pixel kế tiếp  
isrow = isrow + bitmapData.Stride;  
}
//tạo Region ₫ược miêu tả bởi ₫ối tượng Path vừa tìm ₫ược  
Region region = new Region(path);  
//dọn dẹp  
path.Dispose();  
bitmap.UnlockBits(bitmapData);  
//trả về region tìm ₫ược  
return region;  
}
6. Dời về ₫ầu file, thêm 2 lệnh using sau ₫ây ₫ể dùng các dịch vụ về xử lý ảnh :  
using System.Drawing.Imaging;  
using System.Drawing.Drawing2D;  
7. Chọn menu Debug.Start Debugging ₫ể dịch và chạy ứng dụng. Xem kết quả và ₫ánh giá kết  
quả. Ta thấy hiện nay Form có hình dạng do ảnh nền qui ₫ịnh nhưng không còn titlebar và  
các button ₫iều khiển nên không thể di dời hay ₫óng Form trực quan ₫ược. Ta sẽ thực hiện  
tiếp 1 số việc ₫ể giải quyết vấn ₫ề này.  
8. Hãy ₫óng Form lại (bằng cách chọn option Debug.Stop Debugging hay chọn option “Close  
window” trong menu pop-up của icon của ứng dụng trên thanh taskbar).  
9. Ấn phải chuột vào mục Form1.cs trong cửa sổ Solution Explorer rồi 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 của nó sẽ hiển thị,  
click icon  
₫ể hiển thị danh sách các sự kiện của Form, duyệt tìm lần lượt các sự kiện  
MouseDown, MouseUp, MouseMove và tạo hàm xử lý sự kiện tương ứng. Viết code cụ thể cho  
3 hàm vừa tạo như 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à vị trí Form tại 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 4  
//xác ₫ịnh vị trí chuột hiện 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í mới 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 về ₫ầu class Form1 rồi viết thêm các lệnh ₫ịnh nghĩa các thuộc tính cần  
dùng ₫ể quản lý chuột như 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 của button Close form  
int xC = 94;  
int yC = 43;  
//sai số chấp nhận so với tâm của button Close  
const int EPSI = 10;  
11. Chọn menu Debug.Start Debugging ₫ể dịch và chạy ứng dụng. Thử ₫óng các cửa sổ khác và  
₫ể duy nhất Form ₫ồng hồ hiển thị trên nền desktop. Xem kết quả hiển thị, thử drag mouse  
₫ể dời Form ₫ồng hồ. Click thử vào vị trí mắt phải của thỏ (₫ại diện button Close) xem form  
có ₫óng lại không.  
pdf 4 trang myanh 20080 Free
Bạn đang xem tài liệu "Giáo trình thực hành 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", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_thuc_hanh_lap_trinh_huong_doi_tuong_bai_thuc_hanh.pdf