Xây dựng chương trình vẽ hình mở rộng BKPaint Xây dựng chương trình vẽ hình mở rộng BKPaint Xây dựng chương trình vẽ hình mở rộng BKPaint Xây dựng chương trình vẽ hình mở rộng BKPaint Xây dựng chương trình vẽ hình mở rộng BKPaint
ĐẠI HỌC BÁCH KHOA HÀ NỘI Báo cáo môn học Lập trình hướng đối tượng Đề tài: De02C - Xây dựng chương trình vẽ hình mở rộng - BKPaint Nguời thực Trần Quang Kiên - 20101744 - 01242886369 Nguyễn Duy Thành - 20102737 - 01698679162 Bạch Văn Hải - 20101464 - 01649612854 Nguyễn Xuân Hoà - 20101559 - 0988219953 Nhóm: Nhóm 12 - K55 Người hướng dẫn TS Cao Tuấn Dũng Viện công nghệ thông tin truyền thông Bộ môn Công Nghệ Phần Mềm Ngày tháng 11 năm 2012 Contents i Mục lục Abbreviations Tổng quan vấn đề liên quan 1.1 Lập trình hướng đối tượng với C++ 1.1.1 C++ 1.1.2 C++11 1.1.2.1 nullptr - trỏ null 1.1.2.2 auto - tự động suy diễn kiểu 1.1.2.3 Range-for 1.1.2.4 Chỉ thị override Qt Framework 1.2.1 Giới thiệu 1.2.2 Lập trình C++ với Qt 1.2.3 Một số kỹ thuật hướng đối tượng Qt 1.2.3.1 Cơ chế cha-con 1.2.3.2 Cơ chế signal - slot (tín hiệu - khe cắm) 1.2 xii Phân tích thiết kế mức kiến trúc 2.1 Biểu đồ Use-case 2.1.1 Biểu đồ Use-case tổng quát 2.1.2 Phân rã Use-case Painting 10 2.1.3 Phân Use-case Replay painting 10 Biểu đồ trình tự 12 2.2.1 Biểu đồ trình tự cho Use-case Open 12 2.2.2 Biểu đồ trình tự cho Use-case Save 13 2.2.3 Biểu đồ trình tự cho Use-case Painting 13 2.2.3.1 Biểu đồ trình tự cho Use-case Draw shape 13 2.2.3.2 Biểu đồ trình tự cho Use-case Erase 15 2.2.4 Biểu đồ trình tự cho Use-case Replay Painting 16 2.2.5 Biểu đồ trình tự cho Use-case Undo / Redo 19 2.2 2.3 Biểu đồ lớp 21 Contents ii 2.3.1 Biểu đồ lớp tổng quan 2.3.2 Biểu đồ lớp chi tiết cho MainWindow thành phần giao diện 22 2.3.3 Biểu đồ lớp chi tiết cho Canvas Player 24 2.3.4 Biểu đồ lớp chi tiết cho PaintOperation lớp liên quan 25 Thiết kế chi tiết lớp 21 26 3.1 Kiến trúc Class 3.2 Danh mục Class 27 3.3 AboutDialog Class Tham chiếu 29 3.3.1 Mô tả chi tiết 30 3.3.2 Thông tin hàm thành viên 30 3.3.2.1 displayFile 30 AddImage Class Tham chiếu 31 3.4.1 Mô tả chi tiết 32 3.4.2 Thông tin Constructor Destructor 32 3.4.2.1 AddImage 32 Thông tin hàm thành viên 32 3.4.3.1 load 32 3.4.3.2 operate 33 3.4.3.3 save 33 3.4.3.4 type 34 AddShape Class Tham chiếu 34 3.5.1 Mô tả chi tiết 35 3.5.2 Thông tin Constructor Destructor 35 3.5.2.1 AddShape 35 Thông tin hàm thành viên 36 3.5.3.1 append 36 3.5.3.2 load 36 3.5.3.3 operate 37 3.5.3.4 save 37 3.5.3.5 type 37 3.4 3.4.3 3.5 3.5.3 3.6 Canvas Class Tham chiếu 26 38 3.6.1 Mô tả chi tiết 42 3.6.2 Thông tin Member Enumeration 43 3.6.2.1 DrawMode 43 Thông tin Constructor Destructor 43 3.6.3.1 Canvas 43 Thông tin hàm thành viên 44 3.6.4.1 44 3.6.3 3.6.4 fillBackground Contents iii 3.6.4.2 genEraseCursor 44 3.6.4.3 getBrush 44 3.6.4.4 getBuffer 45 3.6.4.5 getPen 45 3.6.4.6 getRenderHints 45 3.6.4.7 initCursors 45 3.6.4.8 load 46 3.6.4.9 mouseMoveEvent 46 3.6.4.10 mousePressEvent 46 3.6.4.11 mouseReleaseEvent 47 3.6.4.12 operate 47 3.6.4.13 paintEvent 47 3.6.4.14 playNextOp 48 3.6.4.15 redo 48 3.6.4.16 regenerateBuffer 48 3.6.4.17 regularPolygon 49 3.6.4.18 regularStar 49 3.6.4.19 reloadPlayer 50 3.6.4.20 setBrush 50 3.6.4.21 setEraseRadius 50 3.6.4.22 setMode 51 3.6.4.23 setNoCorner 51 3.6.4.24 setPen 51 3.6.4.25 setRenderHint 52 3.6.4.26 setZoomFactor 52 3.6.4.27 startPlayer 53 3.6.4.28 stopPlayer 53 3.6.4.29 undo 53 3.6.4.30 updateCursor 53 Thông tin Member Data 54 3.6.5.1 mousePressed 54 ChangeShape Class Tham chiếu 54 3.7.1 Mô tả chi tiết 56 3.7.2 Thông tin Constructor Destructor 56 3.7.2.1 ChangeShape 56 Thông tin hàm thành viên 57 3.7.3.1 getAddShape 57 3.7.3.2 load 57 3.7.3.3 operate 58 3.6.5 3.7 3.7.3 Contents iv 3.7.3.4 save 58 3.7.3.5 setChangedPart 58 3.7.3.6 setLastTopLeft 59 3.7.3.7 type 59 Thông tin Member Data 60 3.7.4.1 changedPart 60 3.7.4.2 lastTopLeft 60 ColorPicker Class Tham chiếu 60 3.8.1 Mô tả chi tiết 63 3.8.2 Thông tin Constructor Destructor 63 3.8.2.1 ColorPicker 63 Thông tin hàm thành viên 64 3.8.3.1 colorAt 64 3.8.3.2 initContexMenu 64 3.8.3.3 initPalette 64 3.8.3.4 mouseMoveEvent 65 3.8.3.5 mousePressEvent 65 3.8.3.6 paletteAction_triggered 66 3.8.3.7 setPalette 66 66 3.7.4 3.8 3.8.3 3.9 Erase Class Tham chiếu 3.9.1 Mô tả chi tiết 67 3.9.2 Thông tin Constructor Destructor 67 3.9.2.1 Erase 67 Thông tin hàm thành viên 68 3.9.3.1 load 68 3.9.3.2 save 68 3.9.3.3 type 69 3.10 Fill Class Tham chiếu 69 3.9.3 3.10.1 Mô tả chi tiết 70 3.10.2 Thông tin Constructor Destructor 70 3.10.2.1 Fill 70 3.10.3 Thông tin hàm thành viên 71 3.10.3.1 load 71 3.10.3.2 operate 71 3.10.3.3 save 71 3.10.3.4 type 72 3.11 ToolBar::LargeIconWidthStyle Class Tham chiếu 72 3.11.1 Mô tả chi tiết 73 3.12 MainWindow Class Tham chiếu 73 Contents v 3.12.1 Mô tả chi tiết 81 3.12.2 Thông tin Member Enumeration 82 3.12.2.1 anonymous enum 82 3.12.2.2 FileType 82 3.12.3 Thông tin Constructor Destructor 82 3.12.3.1 MainWindow 82 3.12.3.2 MainWindow 83 3.12.4 Thông tin hàm thành viên 83 3.12.4.1 closeEvent 83 3.12.4.2 enablePainting 83 3.12.4.3 hoveredColor 84 3.12.4.4 init 84 3.12.4.5 initActions 84 3.12.4.6 initMenus 84 3.12.4.7 initStatusBar 85 3.12.4.8 initToolbars 85 3.12.4.9 initWidgets 85 3.12.4.10 loadFile 85 3.12.4.11 maybeSave 86 3.12.4.12 openBrushColorDialog 86 3.12.4.13 openPenColorDialog 86 3.12.4.14 playerModified 87 3.12.4.15 playerStopped 87 3.12.4.16 readSettings 87 3.12.4.17 reloadControl 87 3.12.4.18 saveGraphicFile 88 3.12.4.19 saveReplayFile 88 3.12.4.20 setBrushColor 89 3.12.4.21 setBrushStyle 89 3.12.4.22 setCurrentFile 89 3.12.4.23 setPenColor 90 3.12.4.24 setPenStyle 90 3.12.4.25 setPenWidth 90 3.12.4.26 setRenderHint 91 3.12.4.27 strippedName 91 3.12.4.28 updateLabelPosition 92 3.12.4.29 updateRecentFileActions 92 3.12.4.30 writeSettings 92 3.12.5 Thông tin Member Data 92 Contents vi 3.12.5.1 actionAntialiasing 92 3.12.5.2 actionHighQualityAntialiasing 93 3.12.5.3 actionNonCosmeticDefaultPen 93 3.12.5.4 actionSmoothPixmapTransform 93 3.12.5.5 actionTextAntialiasing 93 3.12.5.6 colorPicker 94 3.12.5.7 colorPickerToolBar 94 3.12.5.8 menuBar 94 3.13 MousePress Class Tham chiếu 94 3.13.1 Mô tả chi tiết 96 3.13.2 Thông tin hàm thành viên 96 3.13.2.1 load 96 3.13.2.2 operate 97 3.13.2.3 save 97 3.13.2.4 setChangedPart 98 3.13.2.5 setLastTopLeft 98 3.13.2.6 type 98 3.13.3 Thông tin Member Data 99 3.13.3.1 changedPart 99 3.13.3.2 lastTopLeft 99 3.14 NewFileOption Struct Tham chiếu 99 3.14.1 Mô tả chi tiết 100 3.14.2 Thông tin Member Data 100 3.14.2.1 size 100 3.15 NewFileOptionDialog Class Tham chiếu 100 3.15.1 Mô tả chi tiết 101 3.15.2 Thông tin hàm thành viên 102 3.15.2.1 dialogAccepted 102 3.15.2.2 getNewFileOption 102 3.16 OpPair Struct Tham chiếu 102 3.16.1 Mô tả chi tiết 103 3.17 PaintOperation Class Tham chiếu 103 3.17.1 Mô tả chi tiết 104 3.17.2 Thông tin Constructor Destructor 104 3.17.2.1 ∼PaintOperation 105 3.17.3 Thông tin hàm thành viên 105 3.17.3.1 load 105 3.17.3.2 operate 105 3.17.3.3 save 106 Contents vii 3.17.3.4 type 106 3.18 ColorPicker::Palette Struct Tham chiếu 107 3.18.1 Mô tả chi tiết 107 3.19 ColorPicker::PaletteColor Struct Tham chiếu 107 3.19.1 Mô tả chi tiết 107 3.20 Player Class Tham chiếu 108 3.20.1 Mô tả chi tiết 111 3.20.2 Thông tin Constructor Destructor 111 3.20.2.1 Player 111 3.20.2.2 Player 112 3.20.2.3 ∼Player 112 3.20.3 Thông tin hàm thành viên 112 3.20.3.1 addFinishChangeShape 112 3.20.3.2 addOperation 113 113 3.20.3.4 canRedoChanged 113 3.20.3.5 canUndoChanged 114 3.20.3.6 getBuffer 114 3.20.3.7 isEmpty 115 115 3.20.3.9 loadImage 115 3.20.3.10 pause 116 3.20.3.11 play 116 3.20.3.12 playerStopped 116 3.20.3.13 redo 116 3.20.3.14 repaint 117 3.20.3.15 resizeBuffer 117 3.20.3.16 resume 117 3.20.3.17 save 117 3.20.3.18 setIntervalBySpeed 118 3.20.3.19 size 118 3.20.3.20 stop 118 3.20.3.21 timerTimeout 119 3.20.3.22 undo 119 3.20.3.23 zoom 119 3.20.3.3 background 3.20.3.8 load 3.21 ResizeDialog Class Tham chiếu 119 120 3.21.2 Thông tin hàm thành viên 121 3.21.2.1 dialogAccepted 121 3.21.1 Mô tả chi tiết Contents viii 3.21.2.2 getNewSize 121 3.22 SetBrush Class Tham chiếu 121 3.22.1 Mô tả chi tiết 122 3.22.2 Thông tin hàm thành viên 123 3.22.2.1 load 123 3.22.2.2 operate 123 3.22.2.3 save 123 3.22.2.4 type 124 3.23 SetBrushToolBar Class Tham chiếu 124 126 3.23.2 Thông tin Constructor Destructor 126 3.23.2.1 SetBrushToolBar 126 3.23.2.2 SetBrushToolBar 127 3.23.3 Thông tin hàm thành viên 127 3.23.3.1 brushColorNeeded 127 3.23.3.2 brushStyleChanged 127 3.23.3.3 init 128 3.23.3.4 initActions 128 3.23.3.5 initWidgets 128 3.23.3.6 reloadBrushColorIcon 129 3.23.3.7 reloadBrushStyleIcon 129 3.23.4 Thông tin Member Data 129 3.23.4.1 actionBrushColor 129 3.23.4.2 brushStyleActionGroup 130 3.23.4.3 brushStyleMenu 130 3.23.4.4 brushStyleSignalMapper 130 3.24 SetPen Class Tham chiếu 130 3.23.1 Mô tả chi tiết 3.24.1 Mô tả chi tiết 131 3.24.2 Thông tin hàm thành viên 132 3.24.2.1 load 132 3.24.2.2 operate 132 3.24.2.3 save 133 3.24.2.4 type 133 3.25 SetPenToolBar Class Tham chiếu 134 3.25.1 Mô tả chi tiết 135 3.25.2 Thông tin Constructor Destructor 136 3.25.2.1 SetPenToolBar 136 3.25.2.2 SetPenToolBar 136 3.25.3 Thông tin hàm thành viên 136 Contents ix 3.25.3.1 init 136 3.25.3.2 initActions 137 3.25.3.3 initWidgets 137 3.25.3.4 penColorNeeded 137 3.25.3.5 penStyleChanged 137 3.25.3.6 penWidthChanged 138 3.25.3.7 reloadPenColorIcon 138 3.25.3.8 reloadPenStyleIcon 138 3.25.3.9 setPenWidth 139 3.25.4 Thông tin Member Data 139 3.25.4.1 actionPenColor 139 3.25.4.2 penStyleActionGroup 139 3.25.4.3 penStyleMenu 140 3.25.4.4 penStyleSignalMapper 140 3.25.4.5 penWidthSlider 140 3.26 SetRenderHint Class Tham chiếu 141 3.26.1 Mô tả chi tiết 142 3.26.2 Thông tin hàm thành viên 142 3.26.2.1 load 142 3.26.2.2 operate 142 3.26.2.3 save 143 3.26.2.4 type 143 3.27 ToolBar Class Tham chiếu 144 145 3.27.2 Thông tin Constructor Destructor 145 3.27.2.1 ToolBar 145 3.27.2.2 ToolBar 146 3.27.2.3 ∼ToolBar 146 3.27.3 Thông tin hàm thành viên 146 3.27.3.1 addSpace 146 3.27.3.2 genColorIcon 147 3.27.4 Thông tin Member Data 147 3.27.4.1 LargeIconWidth 147 3.27.1 Mô tả chi tiết Giải pháp kỹ thuật 148 4.1 Cài đặt tính Replay 148 4.1.1 Giải pháp lưu trữ 148 4.1.2 PaintOperation - lớp sở cho tất thao tác vẽ 149 4.1.3 Cài đặt tính Replay 149 Chương Thiết kế chi tiết lớp 3.26.1 142 Mô tả chi tiết Lớp đại diện cho thao tác thay đối render hint Tất thao tác vẽ (PaintOperation) chia đối tượng vẽ QPainter Trong lớp QPainter có thuộc tính kiểu Painter::RenderHints bao gồm cờ (kiểu QPainter::RenderHint) quy định việc render thao tác vẽ hình Canvas Lớp SetPen có thuộc tính hint, thực bật tắt tương ứng (tùy thuộc vào thuộc tính on) Xem thêm QPainter, QPainter::RenderHints Định nghĩa dòng 38 file setrenderhint.hh 3.26.2 Thông tin hàm thành viên 3.26.2.1 void SetRenderHint::load ( QDataStream & stream ) [override], [virtual] Đọc liệu cho thao tác vẽ từ stream Đọc hint, on từ stream Type đọc trước để xác định kiểu thao tác vẽ Các tham số stream luồng liệu Xem thêm save (QDataStream &) Thực PaintOperation Định nghĩa dòng 67 file setrenderhint.cc 3.26.2.2 QRectF SetRenderHint::operate ( QPainter & painter ) const [override], [virtual] Thực thao tác Bật tắt hint Chương Thiết kế chi tiết lớp 143 Các tham số painter đối tượng vẽ thao tác Giá trị trả Vùng vẽ bị thay đổi sau thực Thực PaintOperation Định nghĩa dòng 43 file setrenderhint.cc 3.26.2.3 void SetRenderHint::save ( QDataStream & stream ) const [override], [virtual] Lưu trạng thái thao tác vẽ vào stream Ghi Type, hint, on vào stream Các tham số stream luồng liệu vào Xem thêm load (QDataStream &) Thực PaintOperation Định nghĩa dòng 55 file setrenderhint.cc 3.26.2.4 qint32 SetRenderHint::type ( Kiểu thao tác Thực chất trả Type Giá trị trả qint32 kiểu thao tác ) const [inline], [override], [virtual] Chương Thiết kế chi tiết lớp 144 Xem thêm Type Thực PaintOperation Định nghĩa dòng 64 file setrenderhint.hh Thông tin cho class biên soạn từ file sau đây: • src/paintoperation/setrenderhint.hh • src/paintoperation/setrenderhint.cc 3.27 ToolBar Class Tham chiếu Thanh công cụ #include Sơ đồ kế thừa cho ToolBar: QObject QPaintDevice QWidget QToolBar ToolBar SetBrushToolBar SetPenToolBar Classes • class LargeIconWidthStyle Style với icon có chiều rộng lớn Các hàm thành viên Public • ToolBar (QWidget ∗parent=nullptr) Phương thức khởi tạo • ToolBar (QString const &title, QWidget ∗parent=nullptr) Phương thức khởi tạo Chương Thiết kế chi tiết lớp 145 • virtual ∼ToolBar () Phương thức hủy ảo • void addSpace (int spaceSize) Thêm khoảng trống vào cuối công cụ Các hàm Static Public • static QIcon genColorIcon (QColor const &color, int width, int height) Sinh icon với màu kích thước cho trước Các thuộc tính Static Public • static const int IconWidth = 24 Độ rộng Icon • static const int IconHeight = 24 Độ cao Icon • static const int LargeIconWidth = 70 Độ rộng Icon với độ rộng lớn Additional Inherited Members 3.27.1 Mô tả chi tiết Thanh công cụ Là "wrapper" lớp QToolBar Có cài đặt thêm số phương thức addSpace (int), genColorIcon() Xem thêm QToolBar Định nghĩa dòng 33 file toolbar.hh 3.27.2 3.27.2.1 Thông tin Constructor Destructor ToolBar::ToolBar ( QWidget ∗ parent = nullptr ) Phương thức khởi tạo Khởi tạo với cha cho trước Chương Thiết kế chi tiết lớp 146 Các tham số parent đối tượng cha Xem thêm QToolBar::QToolBar(QWidget ∗), ToolBar(QString const &, QWidget ∗) Định nghĩa dòng 40 file toolbar.cc ToolBar::ToolBar ( QString const & title, QWidget ∗ parent = nullptr ) 3.27.2.2 Phương thức khởi tạo Khởi tạo với cha tiêu đề cho trước Các tham số title tiêu đề parent đối tượng cha Xem thêm ToolBar(QWidget ∗), QToolBar:QToolBar(QString const &, QWidget ∗) Định nghĩa dòng 53 file toolbar.cc ToolBar::∼ToolBar ( 3.27.2.3 ) [virtual] Phương thức hủy ảo Xem thêm ToolBar(QWidget∗), ToolBar(QString const &, QWidget∗) Định nghĩa dòng 64 file toolbar.cc 3.27.3 3.27.3.1 Thông tin hàm thành viên void ToolBar::addSpace ( int spaceSize ) Thêm khoảng trống vào cuối công cụ Chương Thiết kế chi tiết lớp 147 Các tham số spaceSize kích thước khoảng trống Định nghĩa dòng 75 file toolbar.cc 3.27.3.2 QIcon ToolBar::genColorIcon ( QColor const & color, int width, int height ) [static] Sinh icon với màu kích thước cho trước Icon có dạng hình chữ nhật kích thước width x height tô màu color Các tham số color Màu icon width chiều rộng height chiều cao Giá trị trả Icon Định nghĩa dòng 93 file toolbar.cc 3.27.4 Thông tin Member Data 3.27.4.1 const int ToolBar::LargeIconWidth = 70 [static] Độ rộng Icon với độ rộng lớn Xem thêm LargeIconWidthStyle Định nghĩa dòng 76 file toolbar.hh Thông tin cho class biên soạn từ file sau đây: • src/widget/toolbar.hh • src/widget/toolbar.cc Chương Giải pháp kỹ thuật 148 Chương Giải pháp kỹ thuật 4.1 Cài đặt tính Replay 4.1.1 Giải pháp lưu trữ Để có tính Replay, chương trình phải lưu lại trình vẽ từ lúc bắt đầu Có cách để làm việc này: Quay phim lại trình vẽ, Chụp lại hình ảnh vẽ có thay đổi, cần chụp phần bị thay đổi, Lưu lại thông tin mã hoá thao tác người dùng Ví dụ: vẽ hình nhật cần lưu thông tin hai điểm góc trái góc bên phải, đổ màu cần lưu màu điểm đổ màu, thay lưu kết thực (dạng hình ảnh), Nhận xét: • Cách lập trình không khó tốn nhớ Quan trọng trình vẽ, người dùng ngắt, nghỉ chừng Thời gian hai thao tác liên nhanh, chậm mà không xác định trước Do khó tùy biến tốc độ sau này, • Cách khắc phục nhược điểm cách 1: ảnh tĩnh tốn nhớ hơn, bỏ thời gian chờ cách không cần thiết hai thao tác vẽ liền Tuy nhiên cài đặt phức tạp phải tổ chức lại cấu trúc liệu, • Cách thực chất cải tiến cách 2, đơn vị lưu trữ hình ảnh kết mà thông tin để tạo nên hình ảnh Về mặt nhớ tiết kiệm cách hiệu Ngoài ra, với cách lưu trữ thông tin ta tùy biến thao tác vẽ dễ dàng Chương Giải pháp kỹ thuật 149 (phóng to / thu nhỏ, kéo dãn, quay, ) mà không mát thông tin so với cách lưu trữ hình ảnh Nhờ chương trình mở rộng thêm tính sau Với phân tích ưu / nhược điểm trên, chương trình BKPaint sử dụng cách thứ để lưu trữ liệu 4.1.2 PaintOperation - lớp sở cho tất thao tác vẽ PaintOperation lớp trừu tượng, có cài đặt số phương thức ảo (operate(), load(), save()) phục vụ cho trình thực lưu trữ (vào file) Chương trình lưu danh sách PaintOperation, người dùng thay đổi nội dung tài liệu, đối tượng thuộc lớp dẫn xuất PaintOperation tạo thêm vào danh sách Ở đây, ta sử dụng kỹ thuật đa hình: mặt lưu trữ nhớ coi đối tượng vẽ PaintOperation, mặt thực lưu trữ (vào file) đối tượng vẽ có cách thức thực hiện, lưu trữ riêng, định nghĩa phần viết lại phương thức ảo nêu Xem thêm: PaintOperation, OpPair, hình 2.18 (Biểu đồ lớp PaintOperation) 4.1.3 Cài đặt tính Replay Ta sử dụng đếm thời gian (Player::timer) thay tạm nghỉ (sleep) thực Lý timer hoạt động thread khác với thread (GUI thread), việc tạm nghỉ thread không ảnh hưởng đến GUI thread, mà giao diện chương trình không bị đóng băng (không hoạt động) thời gian chờ 4.2 Kỹ thuật đệm (buffer) Đơn vị tài liệu chương trình thao tác vẽ (PaintOperation) Để thị nội dung đối tượng dạng hình ảnh phải sử dụng giải thuật vẽ hình, việc có chi phí không nhỏ số lượng thao tác lớn Trong yêu cầu vẽ lại hình đến lúc (như thay đổi kích thước cửa sổ hay người dùng kéo trượt) Do đó, thay vẽ lại lần có yêu cầu, ta vẽ trước nội dung vào buffer Mỗi lần có yêu cầu vẽ lại cần chép phần cần vẽ lại vào vẽ Chương Giải pháp kỹ thuật 4.3 150 Phóng to / thu nhỏ Cách đơn giản để phóng to / thu nhỏ vẽ phóng to / thu nhỏ buffer Tuy nhiên buffer vốn hình ảnh bitmap, phóng to gây tượng vỡ hình Giải pháp thực lại toàn tất thao tác vẽ với tỉ lệ mới, nhờ mà chương trình hiển thị hình ảnh dù tỉ lệ nầo HÌNH 4.1: Kích thước bình thường Chương Giải pháp kỹ thuật 151 HÌNH 4.2: Phóng to với tỉ lệ 3:1 Do chi phí thực lại từ đầu lớn, nên chương trình có áp dụng số kỹ thuật để giảm thiểu tính toán: • Nếu chế độ Replay không vẽ lại Canvas, mà tạm lưu yêu cầu zoom để thực lại từ đầu lúc kết thúc Replay, • Nếu không chế độ Replay không vẽ lại buffer Player 4.4 Undo / Redo Có cách để thực Undo: • Mỗi thao tác vẽ kèm với ảnh chụp phần vẽ mà thay đổi, Undo thao tác có nghĩa ghép ảnh chụp vào vẽ • Vẽ lại từ đầu, trừ thao tác bị Undo (thao tác gần nhất) Chương Giải pháp kỹ thuật 152 Cách thứ có nhược điểm tốn nhớ lại thực nhanh Trong cách thứ hai ngược lại, tốn nhớ thực lâu số thao tác vẽ nhiều lên Chương trình BKPaint sử dụng cách thứ hai để thực Undo Chương Kết luận đánh giá 153 Chương Kết luận đánh giá 5.1 Kết luận đánh giá • Chương trình có số tính vẽ Paint, cộng thêm hai tính chơi lại trình vẽ thư viện tranh mẫu • Hiệu chương trình tốt sử dụng kỹ thuật tối ưu (4), Tuy nhiên, có số nhược điểm: • Còn thiếu nhiều tính quan trọng: văn bản, gradient, chọn lựa, chép, • Giải pháp Undo chưa thực hiệu quả, Một số hướng phát triển chương trình: • Chuyển chương trình thành chương trình vẽ vector, đối tượng trung tâm chương trình PaintOperation, tương tự với Object chương trình vẽ vector Tuy nhiên cần phải cải tiến giải thuật đổ màu để nhận diện Object sinh sau thực • Chạy chương trình thiết bị có hình cảm ứng, thao tác chạm (có thể đa điểm) thay chuột Với thư viện Qt kiện chạm tự động sinh kiện chuột tương ứng, không cần phải thay đổi nhiều chương trình, • Khắc phục nhược điểm nêu Tóm lại, qua tập lớn này, nhóm đã: • lập trình hướng đối tượng với C++, có chuẩn C++11, Chương Kết luận đánh giá 154 • Làm quen với Qt Framework thư viện đồ hoạ nó, • Học số kỹ thuật đồ học máy tính, • Biết cách thiết kế phần mềm hướng đối tượng 5.2 5.2.1 Phân công công việc nhóm Phân công công việc Công việc Người thực Phân tích / thiết kế chương trình Thành Thiết kế giao diện Kiên Thiết kế icon & tìm kiếm hình mẫu Hoà Tìm hiểu giải thuật Hải BẢNG 5.1: Phân công công việc nhóm - Phân tích / thiết kế Công việc Người thực PaintOperation & lớp dẫn xuất Kiên Lớp Canvas & Player Thành Lớp MainWindow & thiết kế giao diện Hoà Các lớp giao diện (ToolBar, Dialog, ) Hải Tổng hợp, chỉnh sửa Thành BẢNG 5.2: Phân công công việc nhóm - coding Công việc Người thực Chương Kiên Chương Thành Chương Hải Chương Thành Tổng hợp, chỉnh sửa Thành BẢNG 5.3: Phân công công việc nhóm - Viết báo cáo Đánh giá đóng góp: Chương Kết luận đánh giá 155 Kiên 30% Thành 30% Hải 20% Hoà 20% BẢNG 5.4: Đánh giá mức độ đóng góp 5.2.2 Kế hoạch làm việc lịch họp nhóm Kế hoạch làm việc: Tuần Mục tiêu cần đạt Hoàn thành đề cương Hoàn tất báo cáo phần Hoàn tất thiết kế, giải pháp kỹ thuật báo cáo phần Lập trình chi tiết hoàn tất kiểm thử 10 Tối ưu hoá, nâng cấp hoàn thiện chức năng, 12 Hoàn thành nộp báo cáo BẢNG 5.5: Kế hoạch làm việc Lịch họp nhóm: tất ngày tuần, trao đổi phần công việc hoàn thành chưa hoàn thành Bibliography 156 Tài liệu tham khảo [1] Bjarne Stroustrup What were the aims of the c++11 effort?, 2011 Available at http: //www.stroustrup.com/C++11FAQ.html#aims [2] Wikipedia C++11, 2012 Available at http://en.wikipedia.org/wiki/C%2B% 2B11 [3] Bjarne Stroustrup C++ faq, 2011 Available at http://www.stroustrup.com/C+ +11FAQ.html [4] ISO C++ Committee Working draft, c++11 international standard In Working Draft, C++11 International Standard, 2012 [5] Wikipedia Qt (framework), 2012 Available at http://en.wikipedia.org/wiki/ Qt_(framework) ... đồ trình tự cho Use-case Painting Biểu đồ trình tự cho Use-case Draw shape BKPaint hỗ trợ vẽ nhiều loại shape khác (hình chữ nhật, hình elip, đa giác, ) với cách vẽ khác Nhưng nhìn chung trình. .. chung trình vẽ hình có trình tự kiểu hình 2.6 Chương Phân tích thiết kế mức kiến trúc 14 HÌNH 2.6: Biểu đồ trình tự cho Use-case Draw shape Trong đó: • Khi nhấn chuột điểm sinh thao tác vẽ kiểu... biên dịch trình dịch C++ bình thường Chương trình làm nhiệm vụ moc (meta- object compiler) Nhờ mà chương trình Qt có nhiều tính C++ Meta Object, Property, Signal-slot, Hình 1.1 sơ đồ trình biên