Bitmap dùng để lưu ảnh đang có trên panel khi repaint panel không lưu được ảnh.. Mỗi tab có một List các Bitmap để lưu quá trình vẽ, dùng cho chức năng Undo, Redo.. Thông tin chi tiết li
Trang 1Thông tin chi tiết liên hệ : uyvq@bkindex.com or haind@bkindex.com Page 1
Lập trình Advance Painter
Đề tài: Lập trình ứng dụng vẽ đơn giản mô phỏng MS Paint
Thực hiện bởi nhóm :
Nguyễn Đức Hải
Hà Trọng Sỹ
Vũ Quốc Uy
Trang 2Thông tin chi tiết liên hệ : uyvq@bkindex.com or haind@bkindex.com Page 2
Muc lục
Muc lục 2
I Giới thiệu 3
II Chức năng 3
1 Chức năng hiện có 3
2 Chức năng chưa hoàn thành 3
III Giao diện 4
IV Mã nguồn 4
1 Painter.cs 4
2 DrawTool 4
3 PencilTool 5
4 Eraser 5
5 LineTool 5
6 RectangleBoundTool: 6
7 CurveTool, PolygonTool 6
8 TextTool 6
9 Các lớp còn lại 7
V Lịch sử phát triển 7
Trang 3Thông tin chi tiết liên hệ : uyvq@bkindex.com or haind@bkindex.com Page 3
PAINTER
I Giới thiệu
Đây là chương trình mô phỏng MS_Paint của window và có thêm một số tính năng khác biệt, được viết hoàn toàn bằng C#.Net
II Chức năng
1 Chức năng hiện có
- Vẽ bút chì
- Vẽ đoạn thẳng
- Vẽ curve
- Vẽ hình chữ nhật và các hình tương tự: elip, đa giác, ngôi sao, mũi tên, …
- Thay đổi màu và độ dày, di chuyển, resize hình đang vẽ
- Cắt ảnh (giống chức năng Select của MSPaint)
- Pick Color
- Tẩy
- Chèn chữ vào ảnh
- In ngày tháng
- Quay 90, 180, 270 độ
- Undo, Redo
- Hoạt động theo tab (giống Firefox)
- Open, Save, kéo thả file ảnh vào khung vẽ hiện tại
2 Chức năng chưa hoàn thành
- Resize panel / hình
- Croping drawing: Vẽ trong 1 region xác định
- Thay đổi dạng đường viền và bề mặt của shape (outline & fill)
- Tô màu
- Phóng to, thu nhỏ
- Select theo nhiều dạng hình khác nhau
- Vẽ bằng chuột phải
Trang 4Thông tin chi tiết liên hệ : uyvq@bkindex.com or haind@bkindex.com Page 4
- Rotate, Copy, Paste ảnh/hình đang vẽ
III Giao diện
- Dùng thư viện DevExpress để hỗ trợ việc thiết kế giao diện
- Người dùng có thể tùy chọn skin trong các giao diện có sẵn
IV Mã nguồn
Gồm các class sau:
- Painter: Form chính
- DrawTool: Lớp các công cụ vẽ (lớp cha của các lớp còn lại)
- PencilTool: Vẽ bằng bút chì
- LineTool: Vẽ đoạn thẳng
- RectangleBoundTool: Lớp vẽ các hình có khung chữ nhật
- CurveTool, RectangleTool, EllipTool, PolygonTool, DiamonTool, UpArrowTool, DownArrowTool, LeftArrowTool, RightArrowTool, Eraser, SixStarTool, FiveStarTool, FourStarTool, HexagonTool, PentagonTool, RightTriangleTool, TriangleTool, TextTool, SelectTool: Kế thừa lớp RectangleBoundTool, thực hiện các chức năng tương ứng với tên lớp
Mô tả khái quát
1 Painter.cs
Mỗi tab có khung vẽ là 1 Panel màu trắng, kèm theo là 1 Bitmap cùng kích thước với panel Bitmap dùng để lưu ảnh đang có trên panel (khi repaint panel không lưu được ảnh)
Mỗi tab có một List các Bitmap để lưu quá trình vẽ, dùng cho chức năng Undo, Redo Lưu ý là khi vẽ shape thì nút Redo sẽ enable, cho thấy là shape chưa hoàn tất và có thể thay đổi màu / độ dày, khi đó nếu click nút Redo thì shape sẽ chính thức hoàn tất
2 DrawTool
Trang 5Thông tin chi tiết liên hệ : uyvq@bkindex.com or haind@bkindex.com Page 5
Có hàm tạo với tham số truyền vào là panel, Bitmap và Pen (lưu màu và độ dày bút vẽ) hiện tại trên form
Chức năng vẽ hình được thực hiện bằng cách handle các sự kiện MouseDown, MouseUp, MouseMove
Phương thức RefreshTool dùng để khởi tạo lại DrawTool khi Panel và Bitmap thay đổi
Phương thức EndShape để kết thúc hình đã vẽ dở (nếu hình chưa kết thúc thì có thể thay đổi màu và độ dày)
Phương thức Cancel để hủy hình đang vẽ và khởi tạo lại DrawTool
Phương thức DrawToPanel dùng kỹ thuật Double buffering để hình trên Panel khi đang vẽ không bị nhấp nháy
Phương thức DrawToBitmap: lưu hình vào Bitmap, chính thức hoàn thành hình vẽ
Ngoải ra còn có một số hàm hỗ trợ khác
3 PencilTool
Kế thừa trực tiếp từ DrawTool, thực hiện chức năng vẽ theo đường đi của con trỏ chuột
Có 1 trường thuộc kiểu GraphicsPath để lưu nét vẽ, dùng để vẽ lại khi có thay đổi màu/độ dày bút vẽ
Khi MouseMove thì vẽ trực tiếp lên Panel (không dùng double buffering)
để đảm bảo tốc độ vẽ
4 Eraser
Kế thừa PencilTool
Tạo một Pen mới màu trắng để không ảnh hưởng đến Pen truyền vào
5 LineTool
Kế thừa DrawTool
Có thể thay đổi vị trí 2 mút của đoạn thẳng / tịnh tiến cả đoạn
Trang 6Thông tin chi tiết liên hệ : uyvq@bkindex.com or haind@bkindex.com Page 6
6 RectangleBoundTool:
Có hầu hết các method cho việc vẽ hình có bao chữ nhật
Các lớp con nếu không có đặc điểm gì đặc biệt (không phải là curve hay polygon,…) thì chỉ cần override hàm DrawShape để vẽ hình tương ứng (elip, hình chữ nhật, ngôi sao,…)
Các bước vẽ: Khi MouseDown, kiểm tra chế độ làm việc (vẽ, resize, move?) dựa vào vị trí của con trỏ chuột rồi gọi các hàm tương ứng khi MouseMove và MouseUp Sau khi MouseUp tạo 1 hình mới (MouseUp khi chế
độ được chọn là “vẽ”) thì vẽ khung hình chữ nhật bao quanh hình để tiện resize/move
7 CurveTool, PolygonTool
Kế thừa RectangleBoundTool
Có thêm các trường để lưu tọa độ các điểm, lưu hình sau khi đã xác định được tất cả các điểm (cần lưu để khi resize không bị mất hình)
Override Phương thức EndShape để thực hiện việc đóng hình vẽ nếu chưa xác định được hết tọa độ các điểm
Khi resize, tọa độ các điểm được tính theo tỷ lệ để hình mới giữ được dạng
cũ
8 TextTool
Kế thừa RectangleBoundTool
Có thêm các trường để lưu font, bút vẽ, tạo một richtextbox để nhập text, các biến xử lý tự động resize
Cách vẽ: đầu tiên tạo ra một textbox để nhập text, sau đó lấy dữ liệu text đó dùng hàm DrawString để vẽ lên panel đúng tại vị trí ta nhập text
Xử lý hàm:
Hàm DrawText: xử lý text trong richtextbox để vẽ ra panel
Hàm DrawShape: tạo mới một ô richtextbox để nhập text
Bắt sự kiện TextChanged để xử lý auto resize box
Trang 7Thông tin chi tiết liên hệ : uyvq@bkindex.com or haind@bkindex.com Page 7
Override hàm EndShape để gọi hàm vẽ text và xóa richtextbox đi
9 Các lớp còn lại
Kế thừa RectangleBoundTool
Thực hiện chức năng vẽ các hình có bao chữ nhật
V Lịch sử phát triển
Phiên bản đầu tiên do Vũ Quốc Uy làm, thời điểm 22 Tháng ba 2011
Chức năng còn rất đơn giản đó là vẽ được lên bitmap
Phiên bản 2 do Nguyễn Đức Hải làm có hệ thống hơn, các chức năng đầy đủ hơn nhiều so với phiên bản 1 thời gian 3 tháng 6 năm 2011
Trang 8Thông tin chi tiết liên hệ : uyvq@bkindex.com or haind@bkindex.com Page 8
Sau đó phải đến tháng 11-2011 Paint được phát triển tiếp, và lần này được thực hiện chung bởi nhóm sinh viên Nguyễn Đức Hải, Vũ Quốc Uy và Hà Trọng
Sỹ Phiên bản này có thể coi là phiên bản 3.0 có rất nhiều điểm mới và nổi trội Hình thức làm việc nhóm và tuân thủ các quy tắc trong làm việc nhóm, các công việc được chuyên môn hóa nên phần mềm Paint được “lột xác” khá nhiều Thực hiện trong vòng 1 tháng
Trang 9Thông tin chi tiết liên hệ : uyvq@bkindex.com or haind@bkindex.com Page 9