Luận văn tốt nghiệp
--------------------------------------------------------------------------------------------------
CHƯƠNG I: GIỚI THIỆU VỀ NGÔN NGỮ
I - GIỚI THIỆU VỀ VISUAL C++
1- Sự đóng kín :
Sự đóng kín là cơ chế liên kết mã và dữ liệu mà nó thao tác, và giữ cho
cả hai được an toàn khỏi sự can thiệp từ bên ngoài vào do sử dụng sai. Trong
ngôn ngữ hướng đối tượng mã và dữ liệu liên kết với nhau để tạo thành một hợp
đen độc lập. Trong hộp này là tất cả các mã và dữ liệu cần thiết. Khi mà một dữ
liệu liên kết như thế thì một đối tượng được tạo ra. Nói cách khác đối tượng là
dụng cụ hỗ trợ cho sự đóng kín. Trong một đối tượng mã, dữ liệu hoặc cả hai có
thể là riêng của đối tượng đó hoặc chung. Mã hoặc dữ liệu thuộc về đối tượng
đó và chỉ được truy cập bởi bộ phận của đối tượng. Nghóa là mã và dữ liệu riêng
không được truy cập bởi các phần khác của chương trình tồn tại ngoài đối tượng.
Khi dữ liệu là chung, các bộ phận khác của chương trình có thể truy cập được nó
mặc dù nó được đònh nghóa trong một đối tượng. Các phần chung của đối tượng
được dùng để cung cấp một giao diện có điều khiển cho các phần riêng của đối
tượng .
Với mọi mục đích, một đối tượng là một biến thuộc loại do người sử dụng
đònh nghóa. Một đối tượng liên kết mã và dữ liệu có thể được xem như là một
biến. Mỗi lần chúng ta đònh nghóa một đối tượng mới, chúng ta tạo ra một loại dữ
liệu mới.
2 Tính đa dạng :
Tính đa dạng là tính chất cho phép một tên được dùng cho hai hay nhiều
mục đích khác nhau có quan hệ về phương diện kỹ thuật. Mục đích của tính đa
dạng được áp dụng cho OOP (Object Oriented Programming )là cho phép một
tên dùng để chỉ rõ một lớp tác động tổng quát. Trong lớp tác động tổng quát,
một tác động cụ thể được xác đònh bởi loại dữ liệu.
Tổng quát khái niệm tính đa dạng là ý tưởng “ Một giao diện nhiều
phương pháp “. Điều này có nghóa là thiết kế một giao diện chung cho một nhóm
có tác động tương quan. Tuy nhiên, tác động cụ thể được thi hành cụ thể vào dữ
liệu. Ưu điểm của tính đa dạng là giúp làm giảm tính phức tạp bằng cách cho
phép cùng một giao diện được sử dụng để chỉ rõ một lớp tác động tổng quát,
chính trình biên dòch chọn lựa tác động cụ thể cho từng trường hợp. Là người lập
- Trang 1-
Luận văn tốt nghiệp
--------------------------------------------------------------------------------------------------
trình, ta không cần thực hiện này bằng tay. Chỉ cần nhớ và sử dụng giao diện
chung .
Tính đa dạng có thể áp dụng cho cả hàm lẫn toán tử. Thật sự tất cả các
ngôn ngữ lập trình điều có một ứng dụng hạn chế về tính đa dạng khi nó liên hệ
với toán tử số học. Ví dụ trong C dấu + dùng để cộng các số nguyên, các số
nguyên dài, các ký tự và các giá trò dấu phẩy động. Trong những trường hợp này
trình biên dòch tự động chọn số nguyên nào để áp dụng. Trong C++ có thể mở
rộng khái niệm này cho các biến mà ta đònh nghóa. Loại tính đa dạng này gọi là
qúa tải các toán tử (operation loading).
3 – Tính kế thừa :
Tính kế thừa là qúa trình mà một đối tượng có thể có được các tính chất
của một đối tượng khác. Cụ thể hơn một đối tượng có thể thừa kế các tính chất
tổng quát để bổ xung thêm các đặt điểm của nó. Tính thừa kế là quan trọng vì
nó cho phép các đối tượng hỗ trợ các khái niệm phân loại theo thứ bậc. Hầu hết
không được quản lý bằng sự phân loại theo thứ bậc. Trong mỗi trường hợp lớp
con thừa kế mọi đặc điểm của lớp cha và bổ xung thêm các đặt trưng của nó.
Không sử dụng sự phân loại theo thứ bậc, mỗi đối tượng sẽ phải đònh nghóa mọi
đặt trưng liên quan đến nó. Tuy nhiên nhờ sự sử dụng tính kế thừa để mô tả một
đối tượng bằng cách chỉ rõ lớp tổng quát nào thuộc về đối tượng cùng với các
đặt điểm riêng làm cho đối tượng trở thành duy nhất.
II- LỚP VÀ ĐỐI TƯNG :
1- Lớp :
Có lẽ đặt điểm quan trọng nhất trong lập trình hướng đối tượng là lớp.
Lớp là cơ cấu được dùng để tạo đối tượng. Như vậy lớp là trung tâm của nhiều
đặc điểm.
Cú pháp để khai báo một lớp cũng tương tự như cú pháp để khai báo một
cấu trúc. Dạng tổng quát như sau:
Class tên-lớp {
Các hàm và biến riêng của lớp
Public :
Các hàm và biến riêng của lớp
} danh sách các đối tượng
- Trang 2-
Luận văn tốt nghiệp
--------------------------------------------------------------------------------------------------
Trong khai báo lớp danh sách các đối tượng là tùy chọn. Giống như cấu trúc ta
có thể khai báo đối tượng sau này khi cần. Tên lớp là tùy chọn có tính kỹ thuật,
từ
quan điểm thực hành, thực sự nó luôn luôn cần đến. Lý do là tên lớp trở thành
một tên kiểu mới được dùng để khai báo các đối tượng của lớp.
Các hàm và biến được khai báo bên trong khai báo lớp được gọi là thành
viên của lớp đó. Theo mặt đònh, thì tất cả các hàm và biến khai báo bên trong
lớp là thuộc riêng của lớp đó. Trong một lớp có thể có các khai báo như : public,
protected, private.
+ public : là khai báo tới mọi client.
+ protected : là khai báo được truy xuất chỉ chính lớp đó, lớp con của nó,
và lớp friend.
+ private : là khai báo chỉ chính lớp đó và lớp friend sử dụng.
Tóm lại: Lớp là tập hợp của các đối tượng cùng có một cấu trúc chung hay hành
vi chung. Một đối tượng chỉ là thể hiện của lớp.
2- Đối tượng :
Một đối tượng có trạng thái, hành vi, đặc tính nhận dạng: Cấu trúc và
hành vi của các đối tượng giống nhau được đònh nghóa trong một lớp chung của
chúng, thuật ngữ instance và đối tượng có thể thay thế lẫn nhau.
+ Trạng thái (state): của một đối tượng bao gồm tất cả các đặc tính
( thường là tónh ) của đối tượng trừ đi giá trò hiện tại ( thường là động ) của mỗi
đặc tính đó.
+ Hành vi (behavior): của một đối tượng là đối tượng hoạt động như thế
nào theo điều kiện trạng thái của nó thay đổi và thông điệp truyền đến.
+ Hoạt động ( Operations): là một dòch vụ mà lớp cung cấp cho khách
hàng của nó.
Có hai loại operation thông dụng cần thiết để tạo và hủy những thể hiện
của một lớp là :
+ constructor : là operation khởi tạo đối tượng và (hoặc) khởi động trạng
thái của nó .
+Destructor : là operation giải phóng trạng thái của một đối tượng và hủy
chính đối tượng đó.
III- THƯ VIỆN TRONG VISUAL C++:
- Trang 3-
Luận văn tốt nghiệp
--------------------------------------------------------------------------------------------------
Visual C++ bao gồm thư viện của MicroSoft Foundation Class( MFC ) như
là một công cụ quan trọng để xây dựng nhanh chương trình Window sử dụng C+
+. MFC được viết ra với một mục đích duy nhất làm cho việc lập trình Window
dễ dành hơn là theo kiểu cổ điển bằng cách cung cấp những lớp đối với hành vi
(behavior) và thuộc tính ( property) với dạng biến lo giải quyết ( handle)
mọi công việc thông dụng trong tất cả chương trình windows. Những lớp đối
tượng nằm trong đã được thừa kế .
Những hành vi nằm trong mỗi lớp đối tượng sẽ thực hiện những phần
hành mà lập trình viên window phải viết trần ra. Nhiều lớp đối tượng trong MFC
mang một tương ứng rất gần gũi với structure và với “window class“ theo nghóa
cổ điển của window.
1- Các nhóm lớp trong thư viện MFC :
♣ Document & application class : Lo quản lý các tài liệu và các ứng
dụng .
♣ Control Class : Liên quan đến các ô điều khiển nhìn thấy được (visual
control) như ô hiệu đính (Edit control), nút điều khiển (command button) ô liệt
kê (list box) cũng như ô hỗn hợp ( combo box)
♣ Dialog box Class: Xử lý các khung đối thoại tự tạo bởi người sử dụng
( custom dialog box) và các khung đối thoại thông dụng đã cài sẵn ( command
dialog box như file, color selection, print, Fine/ Replace dialog box).
♣ Fram Window class : Quản lý các khung cửa sổ (chính và con ) liên
quan đến tài liệu SDI và MDI.
♣ View Class: Quản lý các trình đơn và các mục trình đơn.
♣ Control Bar Class : Tạo những thanh công, thanh tình trạng và các
dialog Bar trong một ứng dụng đi kèm với cửa sổ bò chẻ đôi giống như trên file
Manager của windows.
♣ Menu Bar : Quản lý các trình đơn và mục trình đơn .
♣ Graphical Draw Object : Liên quan đến các hình ảnh đồ họa bitmap,
Icon và việc quản lý và sử dụng font chữ (Font ), hộp mầu (Color palette) thường
được gọi là các đối tượng GDI (Graphic Device Interface).
♣ Graphical Drawing Class: Các lớp này sẽ giải quyết vẽ việc các điểm,
đường thẳng hoặc cong, hình dáng( tròn, chữ nhật, đa giác) thường được gọi là
đối tượng GDI.
♣ File Services Class: Các lớp này chận hứng và giăng bẫy bắt các lỗi
lầm khi chạy chương trình. Các sai lầm này có thể do hoạt động sai liên quan
đến tập tin, ký ức nguồn lực và OLE.
- Trang 4-
Luận văn tốt nghiệp
--------------------------------------------------------------------------------------------------
♣ Collection Class: Gồm ba nhóm lớp cho phép quản lý các bảng dãy
(Array), bảng liệt kê kết nối ( Linked List) và “maps” thuộc nhiều kiểu dữ liệu
khác nhau hoặc nhiều lớp khác nhau.
♣ OLE Support class: Các lớp này quản lý các đối tượng OLE trong những
giao dòch.
♣ ODBC class: Liên quan đến việc quản lý và truy xuất các tập tin dữ
liệu thông qua cơ chế ODBC (Open DataBase Connectivity).
♣ Miscellaneous Class: Các lớp linh tinh này là hỗ trợ mô hình đối tượng
runtime, các kiểu dữ liệu đơn giản, các cấu trúc.
2- Mối quan hệ của một số lớp trong MFC :
-CObject
+ CCmdTarget
+ CFile
+ CMenu
+ CGdiObject
+ CDC
+ CEception
- CCmdTarget
+ CWnd
+ CStatic
+ CButton
+ CBitmapButton
+ CEdit
+ CListBox
+ CCheckListBox
+CDragListBox
+ CComboBox
+ CSrollBar
+ CListCtrl
+ CProgressCtrl
+ CTreeCtrl
+ CSliderCtrl
- CDC
+ CPaintDC
+ CClientDC
+CMetaFileDC
+CWindowDC
- CGdiObject
+ CPen
+ CBrush
+ CBitmap
+ CRgn
+ CFont
+ CPalette
- Trang 5-
Luận văn tốt nghiệp
--------------------------------------------------------------------------------------------------
+CStatusbarCtrl
+ CToolBarCtrl
+ CRichEditCtrl
+ CWinThread
+ CDocument
+ CDocTemplet
2.1- Lớp CWnd :
Lớp Cwnd hậu duệ của lớp CCmdTarget là một lớp đồ sộ khá quan trọng
cung cấp những chức năng cơ bản cho tất cả các lớp cửa sổ như các ô điều khiển,
các khung đối thoại và View. Chỉ có những lớp dẫn xuất từ CWnd mới có thể
nhận các thông điệp. Thread và document có thể nhận command nhưng không
thể nhận message.
Lớp CWnd cung cấp chức năng thiên cửa sổ như hàm API CreateWindow( )
và DestroyWindow( ), các hàm lo tô vẽ cửa sổ trên màn hình, xử lý các thông
điệp, nói chuyện với Clipboard và nhiều thứ khác. Ta không bao giờ khai báo
trực tiếp một thể hiện của lớp CWnd trong ứng dụng Windows, mà phải cho dẫn
xuất từ lớp này những lớp nếu muốn tạo ra một loại cửa sổ mới nhìn thấy được.
+ Một số hàm trong lớp CWnd :
CWnd::BeginPaint
CDC* BeginPaint(LPPAINTSTRUCT lpPaint): Chuẩn bò CWnd để tô vẽ
lại và điền vào cấu trúc dữ liệu PAINTSTRUCT những thông tin liên quan đến
việc tô vẽ này. Cấu trúc tô vẽ chứa một cấu trúc RECT mang một hình chữ nhật
nhỏ nhất bao gồm trọn vùng nhật tu và một cờ hiệu cho biết vùng nền có nên
xóa hay không. Vùng nhật tu được đặt để bởi các hàm Invalidate ( ),
InvalidateRgn( ), hoặc InvalidateRect( ) và bởi hệ thống khi hệ thống thay đổi
kích thước, di chuyển, tạo mới, diễu hành hoặc thực hiện bất kỳ động tác nào
ảnh hưởng đến vùng Client. Nếu vùng nhật tu được đánh dấu xoá phần nền thì
hàm BeginPaint( ) sẽ gởi thông điệp WM_ONERASEBKGND.
Thông số lpPaint là con trỏ chỉ về cấu trúc dữ liệu PAINTSTRUCT tiếp
nhận thông tin liên quan đến việc tô vẽ.
CWnd::EndPaint
- Trang 6-
Luận văn tốt nghiệp
--------------------------------------------------------------------------------------------------
void EndPaint(LPPAINTSTRUCT lpPaint): Đánh dấu kết thúc việc tô vẽ
trên cửa sổ nào đó. Hàm này bắt buộc phải có khi bắt đầu hàm BeginPaint( )
nhưng chỉ khi nào việc tô vẽ hoàn tất. Thông số lpPaint là con trỏ chỉ về cấu
trúc PAINTSTRUCT tiếp nhận thông tin liên quan đến việc tô vẽ.
CWnd::GetClientRect
void GetClientRect( LPRECT lpRect): Hàm này sao chép tọa độ client
của một vùng CWnd lên cấu trúc chỉ về bởi con trỏ lpRect. Tọa độ client cho
biết các góc upper-left và lower-right của vùng client. Thông số lpRect là một
con trỏ chỉ về cấu trúc RECT hoặc về đối tượng CRect tiếp nhận các tọa độ
vùng client.
CWnd:: Invalidate
void Invalidate(BOOL bErare = TRUE): Hàm đánh dấu toàn vùng client
của CWnd. Vùng client đánh dấu phải được tô vẽ lại khi thôngđiệp WM_PAINT
kế tiếp xẩy ra. Thông số bErare cho biết mầu nền nằm trong vùng có nên xoá
hay không khi xử lý.
CWnd:: OnCreate
Afx_msg int OnCreate(LPCREATESTRUCT lpcreateStruct): MFC gọi
hàm này khi ứng dụng yêu cầu tạo cửa sổ Windows. Việc tạo ra bằng cách gọi
hàm Create( ) hoặc CreateEx( ). Đối tượng CWnd nhận triệu gọi hàm này sau
khi cửa sổ đã tạo ra nhưng trước khi cửa sổ hiện nguyên hình. Nghóa là OnCreate
được gọi trước khi hàm Create() hoặc CreateEx( ) trở về. Thông số
lpcreateStruct là con trỏ chỉ về cấu trúc CREATESTRUCT chứa thông tin liên
quan đến đối tượng CWnd sẽ đươc tạo ra.
CWnd::OnLbuttonDlbClk
Afx_msg void OnLButtonDlbClk( UINT nFlags, CPoint point): MFC gọi
hàm này khi người sử dụng nhấn nút trái chuột. Chỉ những cửa sổ nào mang
WNDCLASS stype CS_DBLCLHS mới nhận được triệu gọi hàm. Việc bất tắt
kép chuột sẽ phát sinh 4 events: Các thông điệp WM_LBUTTONDOWN,
WM_LBUTTONDLBCLK,WM_MOUSEMOVE và một thông điệp
WM_LBUTTONUP khi nhả nút chuột.
+ nFlags cho biết những visual keys khác nhau được nhấn xuống:
- MK_CONTROL: Xét nếu phím Control nhấn xuống
- MK_SHIFT: Xét nếu phím shift được nhấn xuống.
+ point Cho biết tọa độ x,y của cursor.
- Trang 7-
Luận văn tốt nghiệp
--------------------------------------------------------------------------------------------------
CWnd:: On_LButtonDown
afx_msg BOOL OnLButtonDown( UINT nFl;ags, CPoint point): Gọi hàm
này khi người sử dụng nhấn nút trái chuột. Các thông số giống hàm
OnLButtonDlbClk.
CWnd:: On_LButtonUp
afx_msg void OnLButtonUp( UINT nFl;ags, CPoint point): Gọi hàm này
khi người sử dụng nhả nút trái chuột. Các thông số giống hàm
OnLButtonDlbClk.
CWnd::OnMouseMove
afx_msg void OnMouseMove(UINT nFlags, CPoint point): MFC gọi hàm
này khi con trỏ chuột di chuyển. Nếu con chuột không bò chặn hứng thì thông
điệp WM_MOUSEMOVE sẽ trực tiếp nhận bởi đối tượng CWnd nằm dưới con
trỏ chuột, bằng không thông điệp sẽ đi đến cửa sổ đã chận hứng con chuột. Các
thông số được giải thích trên hàm OnLButtonDlbClk.
CWnd:: SetForcus
CWnd* SetFocus( ): Hàm này làm cho cửa sổ nhận được input focus để có
thể nhận được tất cả các nhập liệu từ bàn phím và con chuột, nó sẽ gởi một
thông điệp WM_KILLFOCUS cho cửa sổ đã bò đánh mất focus và một thông
điệp WM_SETFOCUS cho cửa sổ đã nhận input focus. Trò trả về là đối tượng
CWnd có focus trước đó, nếu trò trả về NULL thì không có cưả sổ nào cả. Con
trỏ có thể là hiện thời nên không thể cấp trữ dùng về sau.
2.2- Lớp CView :
Lớp CView được xem như là lớp cơ sở gốc của các View, cung cấp những
chức năng cơ bản cho những lớp view cơ bản tạo bởi người sử dụng. Hoạt động
chủ yếu của một view là in ấn.
View thường được gắn liền với document và hoạt động như chung gian giữa
document và người sử dụng. View phản ảnh hình ảnh của document lên màn
hình hoặc lên mày in, và suy diễn nhập liệu của người sử dụng như là một thao
tác lên document.
Một view được xem như là một cửa sổ con cái thuộc một Frame window. Một
Frame window có thể được chia sẻ sử dụng bởi một hoặc nhiều view như trong
trường hớp một cửa sổ bò chẻ đôi. Khi người sử dụng cho mở một cửa sổ mới
hoặc chẻ đôi một cửa sổ hiện hưũ thì MFC sẽ tạo ra view mới gắn liền view này
với document.
- Trang 8-
Luận văn tốt nghiệp
--------------------------------------------------------------------------------------------------
Một view chỉ có thể gắn với một document nhưng một document có thể gắn
liền với nhiều view. Ứng dụng có thể hỗ trợ nhiều loại view khác nhau đối với
một loại document, ví dụ một trình soạn thảo văn bản có thể cung cấp cả một
view xem trọn văn bản của document và một outline view chỉ cho thấy phần tiêu
đề các đoạn văn bản mà thôi. Các đoạn view này có thể cho thể hiện trên nhiều
khung cửa riêng biệt hoặc trên một splitter window khác nhau.
Một view có thể chòu trách nhiệm giải quyết các kiểu nhập liệu khác nhau:
từ bàn phím, từ bấm tắt con chuột cũng như từ những lệnh trình đơn, lệnh thanh
công cụ hoặc thanh điều hành. Một view sẽ tiếp nhận những lệnh chuyển đến từ
frame windows. Nếu view không xử lý lệnh nào đó thì nó chuyển tiếp cho
document được gắn với nó. Muốn sử dụng view ta cho dẫn xuất một lớp từ
CView rồi thiết đặt hàm thành viên OnDraw( ) lo việc hiển thò màn hình.
+ Một số hàm thành viên lớp CView:
CView::GetDocument
CDocument* GetDocument( ) const : Gọi hàm này đẻ lấy con trỏ chỉ về
document của view, việc này cho phép gọi các hàm thành viên document. Trò trả
về là một con trỏ chỉ về đối tượng CDocument được gắn liền với view, nếu
NULL view không gắn liền với document.
CView:: OnBeginPrinting
vitual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo): Được triệu
gọi bởi MFC vào đầu công tác Print hoặc PrintPreview sau khi hàm
OnPreparePrinting được gọi vào. Thiết đặt mặc nhiên của hàm này sẽ không
làm gì cả, cho phủ quyết hàm để cấp phát bất cứ nguồn lực GDI nào đó như bút
vẽ, cọ vẽ hoặc guồn lực đặc biệt cần cho in ấn.
- pDC: con trỏ chỉ về printer device context.
- pInfo: con trỏ chỉ vế cấu trúc CPrintInfo mô tả công tác in hiện hành.
CView:: OnEndPrinting
virtual void EndPrinting( CDC* pDC, CPrintInfo): Hàm này gọi bởi MFC
ngay sau khi một tài liệu đã được in hoặc xem trước. Thiết đặt mặc nhiên của
hàm không làm gì cả. Cho phủ quyết hàm này để giải phóng những nguồn lực
GDI đã cấp phát trước đó bởi hàm OnPreparePrinting.
- Trang 9-