giới thiệu vè ngôn ngữ visual C++
Trang 1CHƯƠ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ữ chocả hai được an toàn khỏi sự can thiệp từ bên ngoài vào do sử dụng sai Trongngô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êngkhô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 đốitượ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ộtbiế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ềumục đích khác nhau có quan hệ về phương diện kỹ thuật Mục đích của tính đadạng được áp dụng cho OOP (Object Oriented Programming )là cho phép mộttê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ềuphương pháp “ Điều này có nghĩa là thiết kế một giao diện chung cho một nhómcó 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 chophé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 2trì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ệnchung
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ácngô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àytrì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ấtcủ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ấttổ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ếtkhông được quản lý bằng sự phân loại theo thứ bậc Trong mỗi trường hợp lớpcon 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ộtcấu trúc Dạng tổng quát như sau:
Trang 3Trong 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 tacó 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ànhmộ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ànhviê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 tronglớ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ủachú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áchhà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ệncủa một lớp là :
+ constructor : là operation khởi tạo đối tượng và (hoặc) khởi động trạngthái của nó
+Destructor : là operation giải phóng trạng thái của một đối tượng và hủychính đối tượng đó
III- THƯ VIỆN TRONG VISUAL C++:
Trang 4Visual 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 Windowdễ 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 đốitượ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ầnhành mà lập trình viên window phải viết trần ra Nhiều lớp đối tượng trong MFCmang một tương ứng rất gần gũi với structure và với “window class“ theo nghĩacổ đ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 ứngdụng
Control Class : Liên quan đến các ô điều khiển nhìn thấy được (visualcontrol) như ô hiệu đính (Edit control), nút điều khiển (command button) ô liệtkê (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 ( commanddialog 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ênquan đế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ácdialog Bar trong một ứng dụng đi kèm với cửa sổ bị chẻ đôi giống như trên fileManager 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ỗilầ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 5 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ệukhá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 trongnhữ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ượngruntime, 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
- CGdiObject + CPen + CBrush + CBitmap + CRgn + CFont + CPalette
Trang 6Lớ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áotrực tiếp một thể hiện của lớp CWnd trong ứng dụng Windows, mà phải cho dẫnxuấ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 đếnviệ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ậtnhỏ 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ênxó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 đổikí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ếpnhận thông tin liên quan đến việc tô vẽ
CWnd::EndPaint
Trang 7void 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ấutrú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 độ clientcủa một vùng CWnd lên cấu trúc chỉ về bởi con trỏ lpRect Tọa độ client chobiết các góc upper-left và lower-right của vùng client Thông số lpRect là mộtcon 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 clientcủa CWnd Vùng client đánh dấu phải được tô vẽ lại khi thôngđiệp WM_PAINTkế 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ọihà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ọihàm Create( ) hoặc CreateEx( ) Đối tượng CWnd nhận triệu gọi hàm này saukhi 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ênquan đến đối tượng CWnd sẽ đươc tạo ra
CWnd::OnLbuttonDlbClk
Afx_msg void OnLButtonDlbClk( UINT nFlags, CPoint point): MFC gọihà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 mangWNDCLASS stype CS_DBLCLHS mới nhận được triệu gọi hàm Việc bất tắtké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ệpWM_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 8CWnd:: On_LButtonDown
afx_msg BOOL OnLButtonDown( UINT nFl;ags, CPoint point): Gọi hàmnày khi người sử dụng nhấn nút trái chuột Các thông số giống hàmOnLButtonDlbClk
CWnd:: On_LButtonUp
afx_msg void OnLButtonUp( UINT nFl;ags, CPoint point): Gọi hàm nàykhi người sử dụng nhả nút trái chuột Các thông số giống hàmOnLButtonDlbClk
CWnd::OnMouseMove
afx_msg void OnMouseMove(UINT nFlags, CPoint point): MFC gọi hàmnà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ácthô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ộtthô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ượngCWnd có focus trước đó, nếu trị trả về NULL thì không có cưả sổ nào cả Contrỏ 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ữngchứ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 độngchủ 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ữadocument và người sử dụng View phản ảnh hình ảnh của document lên mànhì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 thaotá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ộtFrame window có thể được chia sẻ sử dụng bởi một hoặc nhiều view như trongtrườ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ớihoặ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àyvới document
Trang 9Một view chỉ có thể gắn với một document nhưng một document có thể gắnliền với nhiều view Ứng dụng có thể hỗ trợ nhiều loại view khác nhau đối vớimộ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ộtview 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ềukhung 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 thanhcô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 chodocument đượ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ếuNULL view không gắn liền với document
CView:: OnBeginPrinting
vitual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo): Được triệugọi bởi MFC vào đầu công tác Print hoặc PrintPreview sau khi hàmOnPreparePrinting được gọi vào Thiết đặt mặc nhiên của hàm này sẽ khônglà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útvẽ, 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 MFCngay sau khi một tài liệu đã được in hoặc xem trước Thiết đặt mặc nhiên củahàm không làm gì cả Cho phủ quyết hàm này để giải phóng những nguồn lựcGDI đã cấp phát trước đó bởi hàm OnPreparePrinting
Trang 10
2.3- Lớp CDocument :
Lớp CDocument cung cấp những chức năng cơ bản cũng như biến thành viênđối với những lớp Document tự tạo bởi người sử dụng và lớp OLE Document.Theo định nghĩa một document là một đơn vị dữ kiện thường ở dạng một tập tinmà điển hình người sử dụng mở thông qua File | Open và lưu trữ thông qua File |Save
Lớp Document hỗ trợ những công tác chuẩn như tạo document, cho nạpnó lên ký ức, đọc từ đĩa vào và cho cất trữ nó lên đĩa MFC thao tác cácdocument này sử dụng giao diện được định nghĩa bởi lớp CDocument
+ Một số hàm thành viên của lớp CDocument:
2.4- Lớp CDialog:
Lớp CDialog được dẫn xuất từ lớp CWnd là lớp cơ sở được dùng để hiển thị khung đối thoại lên màn hình Thư viện MFC cung cấp những lớp dialog để hỗ trợ những khung đối thoại thông dụng được cài sẵn ( gọi là command dialog ).Command dialog là những khung đối thoại tự tạo gọi là custom dialog
Command dialog là những khung đối thoại chuẩn đã có sẵn trên window 3.1 trở đi
Người ta phân biệt khung đối thoại làm hai loại: modal và modeless Modal dialog là khung đối thoại một khi gọi nó lên thì ta phải làm xong chuyện rồi đóng nó lại rồi mới chuyển sang cửa số khác Ngược lại, modeless dialog cho phép ta hiển thị cửa sổ rồi trở qua một công việc khác trên một cửa sổ khác không bắt buộc phải bỏ hoặc trước tiên phải đóng lại cửa sổ modeless này Sự khác biệt chủ yếu là khung đối thoại có cần dữ liệu quan trọng hay không
Trang 11Modal dialog thường có dữ liệu “gay cấn” phải tiếp nhận, modeless thì không Một khung đối thoại, tương tự như bất cứ cửa sổ nào khác thường nhận những thông điệp trên windows Trên khung đối thoại, điều đặc biệt quan tâm là làm thế nào giải quyết các thông báo phát đi từ các ô điều khiển nằm trên khung đối thoại, vì đây là cách người sử dụng tiếp cận với khung đối thoại.
+ Một số hàm thành viên của lớp CDialog
CDialog::DoModal( ): Cho gọi hàm thành viên này để gọi một khung đối thoại modal và trả về kết quả khi làm xong Hàm này sẽ giải quyết tất cả mọi tương tác với người sử dụng khi khung đối thoại đang hiện dịch
Nếu người sử dụng bấm tắt một trong những nút điều khiển trên một khung đối thoại, như nút <OK> hoặc <CANCEL> thì một hàm thành viên sẽ giảiquyết thông điệp sẽ được triệu gọi cố gắng đóng khung đối thoại
CDialog :: OnInitDialog
Vitual BOOL OnInitDialog( )
Hàm thành viên này được gọi để đáp ứng thông điệp WM_INITDIALOG Thông điệp này được chuyển cho khung đối thoại trong khi triệu gọi các hàm
Create ( ), CreateIndirect( ), hoặc DoModal( ), xảy ra ngay liền trứôc khi khung đối thoại được hiển thị
Cho phủ quyết hàm này khi cần thực hiện việc gì đó, đặc biệt khi khung đối thoại được khởi gán
CDialog ::EndDialog
Void EndDialog (int nResult) ;
Gọi hàm này để chấm dứt một modal dialog box Hàm này sẽ trả về nResult như là một trị trả về của DoModal( ) Ta phải dùng hàm EndDialog( ) đểhoàn tất việc xử lý, bất cứ lúc nào một modal dialog box được tạo ra
2.5- Lớp CWinApp:
Lơp CWinApp (Windows Application) là một lớp cơ sở cho phép dẫn xuấtmột đối tượng windows, Một đối tượng dùng cung cấp những hàm thành viên dùng khởi gán ứng dụng cũng như cho chạy và kết thúc chương trình windows trên MFC
+ Các hàm thành viên: