7.1. Giới thiệu document/view...
Các đặc điểm của kiến trúc tài liệu/quan sát
- Tính độc lập dữ liệu, tài liệu của chương trình.
- Tính độc lập của khung nhìn đối với cửa sổ chương trình.
- Tính gắn kết giữa tài liệu và khung nhìn.
- Một khung nhìn một thời điểm chỉ làm việc được với một tài liệu, ngược
lại một tài liệu có thể đồng thời được xử lý bởi nhiều khung nhìn.
- Cho phép quản lý lưu trữ tài liệu chương trình một cách “trong suốt”
thông qua kỹ thuật Serialize gắn kết với tài liệu.
Khái niệm về tạo lập động (dynamic create): là cơ chế cho phép tạo các
đối tượng từ các lớp không bằng câu lệnh lập trình. Phải sử dụng các
macro sau để khai báo và định nghĩa cho các lớp tương ứng:
DECLARE_DYNCREATE( class_name ),
IMPLEMENT_DYNCREATE( class_name , base_name ),
RUNTIME_CLASS( class_name ).
13 trang |
Chia sẻ: candy98 | Lượt xem: 569 | Lượt tải: 0
Bạn đang xem nội dung tài liệu Bài giảng Lập trình Windows - Chương 7: Kiến trúc Document/View, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
1Chương 7
Kiến trúc
Document/View
27.1. Giới thiệu document/view
Một ứng dụng theo kiến trúc document/view
Lớp quan sát - CV
Lớp tài liệu - CD
Lớp ứng dụng - CT
Lớp cửa sổ - CS
37.1. Giới thiệu document/view...
Các đặc điểm của kiến trúc tài liệu/quan sát
- Tính độc lập dữ liệu, tài liệu của chương trình.
- Tính độc lập của khung nhìn đối với cửa sổ chương trình.
- Tính gắn kết giữa tài liệu và khung nhìn.
- Một khung nhìn một thời điểm chỉ làm việc được với một tài liệu, ngược
lại một tài liệu có thể đồng thời được xử lý bởi nhiều khung nhìn.
- Cho phép quản lý lưu trữ tài liệu chương trình một cách “trong suốt”
thông qua kỹ thuật Serialize gắn kết với tài liệu.
Khái niệm về tạo lập động (dynamic create): là cơ chế cho phép tạo các
đối tượng từ các lớp không bằng câu lệnh lập trình. Phải sử dụng các
macro sau để khai báo và định nghĩa cho các lớp tương ứng:
DECLARE_DYNCREATE( class_name ),
IMPLEMENT_DYNCREATE( class_name , base_name ),
RUNTIME_CLASS( class_name ).
47.1. Giới thiệu document/view...
Có hai kiểu kiến trúc này: SDI (đơn tài liệu) và MDI (đa tài liệu)
- Đơn tài liệu là chương trình chỉ xử lý một tài liệu tại một thời điểm.
- Đa tài liệu cho phép xử lý nhiều tài liệu (trên nhiều khung nhìn) đồng thời.
Minh họa SDI và MDI như sau:
57.2. Ứng dụng kiểu SDI
Bước 1: Dẫn xuất để xây dựng lớp cung cấp cho chương trình:
Lớp ứng dụng CT từ lớp CWinApp.
Lớp khung cửa sổ CS từ lớp CFrameWnd.
Lớp tài liệu CD từ lớp CDocument.
Lớp CV từ lớp CView.
Bước 2: Cho phép tạo lập động các lớp CS, CD và CV bằng cách sử dụng
các cặp macro DECLARE_DYNCREATE và
IMPLEMENT_DYNCREATE.
Bước 3: Tạo một mẫu (template) để liên kết các lớp CS, CD và CV với nhau
qua đối tượng lớp CSingleDocTemplate.
Bước 4: Phân tích cú pháp và xử lý dòng lệnh bằng hàm
ParseCommandLineInfo().
Bước 5: Nạp chồng một số hàm thành viên để thực hiện như:
- Hàm lưu trữ và đọc tài liệu
CObject :: Serialize()
- Hàm vẽ tài liệu lên khung nhìn
CView :: OnDraw(),...
67.2. Ứng dụng kiểu SDI...
class CD : public CDocument
{ DECLARE_DYNCREATE( CD )
.................................................
};
IMPLEMENT_DYNCREATE( CD, CDocument )
class CV : public CView
{ DECLARE_DYNCREATE( CV )
.................................................
};
IMPLEMENT_DYNCREATE( CV, CView )
Lớp tài liệu - CD
Lớp quan sát - CV
CT a;
class CS : public CFrameWnd
{ DECLARE_DYNCREATE( CS )
.................................................
};
IMPLEMENT_DYNCREATE( CS, CFrameWnd )
class CT : public CWinApp
{ public: BOOL InitInstance()
{
///-- Khởi động ứng dụng --///
}
};
#include
Lớp cửa sổ - CS
Lớp chương trình - CT
Đối tượng chương trình
77.2. Ứng dụng kiểu SDI...
Các bước khởi tạo ứng dụng trong hàm InitInstance() của lớp CT,
Bước 1) Tạo đối tượng liên kết các thành phần chương trình:
CSingleDocTemplate *p = new CSingleDocTemplate( ID_số_hiệu ,
RUNTIME_CLASS( CD ),
RUNTIME_CLASS( CS ),
RUNTIME_CLASS( CV ) );
AddDocTemplate( p );
Bước 2) Xử lý dòng lệnh
CCommandLineInfo CLInfo;
ParseCommandLine(CLInfo);
ProcessShellCommand(CLInfo);
Trong đó ID_số_hiệu là số hiệu của một String table và Menu trong tài
nguyên, quy định các tham số mẫu tài liệu cho ứng dụng. Thực đơn phải
có tối thiếu 2 mục chọn ngang và cấu trúc xâu như sau:
ID_số_hiệu “ tên_chương_trình \n tên_tài_liệu \n tên_kiểu_tài_liệu \n
tên_kiểu_file_tài_liêu (*.???) \n .??? \n kiểu_tài_liệu \n tên_tài_liệu ”
87.2. Ứng dụng kiểu SDI...
Các hàm API đăng ký tài liệu
EnableShellOpen();
RegisterShellFileTypes();
Hàm OnDraw() của lớp CV để hiển thị tài liệu
void OnDraw(CDC *pDC)
{ // hiển thị tài liệu,
// sử dụng hàm GetDocument() để xác định tài liệu gắn với quan sát này.
}
Lưu trữ và đọc tài liệu trên ổ đĩa, hàm Serialize() trong lớp CD
void Serialize( CArchive &ar )
{ // dùng toán tử > trên đối tượng ar để ghi và đọc dữ liệu,
// dùng hàm IsLoading() và IsStoring() trên ar để xác định trạng thái đọc và ghi
}
Hàm cập nhật nội dung lên khung nhìn từ tài liệu
UpdateAllViews( CView *view ); và SetModifiedFlag( BOOL );
97.2. Ứng dụng kiểu SDI...
Hàm tạo tài liệu mới
CWinApp :: OnFileNew()
CDocument :: OnNewDocument()
Hàm mở tài liệu
CWinApp :: OnFileOpen()
CWinApp :: OnDoPromptFileName()
CWinApp :: OpenDocumentFile()
CDocument :: OnOpenDocument()
Hàm lưu tài liệu
CDocument :: OnSaveDocument()
Chúng ta muốn thực hiện các chức năng trên phải ánh xạ thông điệp tới
các hàm tương ứng trong lớp CWinApp. Viết đè các hàm trong lớp
CDocument để thực hiện thêm một số việc cần thiết.
10
7.3. Kiến trúc đa tài liệu - MDI
Kiến trúc MDI khá giống với SDI, tuy nhiên phải điều chỉnh và thêm một số
thành phần sau:
- Lớp cửa sổ chính (CS) sẽ kế thừa từ lớp CMDIFrameWnd, cửa sổ này chứa
nhiều cửa sổ con. Mỗi cửa sổ con ứng với một tài liệu/quan sát cụ thể.
class CS : public CMDIFrameWnd ...
- Lớp cửa sổ con (CC) để chứa một tài liệu/quan sát được kế thừa từ
CMDIChildWnd.
class CC : public CMDIChildWnd ...
- Trong hàm khởi tạo ứng dụng InitInstance() phải sử dụng:
+ Lớp mẫu đa tài liệu CMultiDocTemplate thay cho CSingleDocTemplate
+ Truyền lớp cửa sổ con (CC) thay cho lớp cửa sổ chính (CS) trong lệnh tạo
mẫu đa tài liệu:
CMultiDocTemplate( tài_nguyên, lớp_CD, lớp_CC, lớp_CV );
+ Thêm lệnh tạo cửa sổ chính (CS) và gán cho thành phần m_pMainWnd
m_pMainWnd = new CS;
+ Gọi hàm hiển thị và cập nhật cửa sổ chính.
m_pMainWnd->ShowWindow( trạng_thái );
m_pMainWnd->UpdateWindow();
11
7.3. Kiến trúc đa tài liệu – MDI...
Minh họa kiến trúc MDI như sau
Lớp cửa sổ chính
CS : CMDIFrameWnd
Lớp cửa sổ con
CC : CMDIChildWnd
Lớp tài liệu gắn với
quan sát CD/CV
Lớp ứng dụng chứa mọi
thành phần
12
7.3. Kiến trúc đa tài liệu – MDI...
Cơ chế lưu trữ tài liệu trong kiến trúc Doc/View
- Định nghĩa số hiệu chức năng ID_FILE_SAVE để ánh xạ
- Xâu ký tự của tiêu đề hộp thoại chọn file: AFX_IDS_SAVEFILE
- Nạp chồng hàm Serialize( CArchive & ar ) để thực hiện lưu
Sơ đồ minh họa cơ chế lưu tệp
ID_FILE_SAVE CDocument :: OnFileSave()
CDocument :: DoFileSave()
CDocument :: DoSave(LPCTSTR path, BOOL repl)
CDocument :: OnSaveDocument(LPCTSTR path)
CDocument :: Serialize(CArchive &ar)
Data
CD : CDocument
Ổ đĩa
13
7.3. Kiến trúc đa tài liệu – MDI...
Cơ chế mở một tệp tài liệu trong kiến trúc Doc/View
- Định nghĩa số hiệu chức năng ID_FILE_OPEN để ánh xạ
- Xâu ký tự của tiêu đề hộp thoại chọn file: AFX_IDS_OPENFILE
- Nạp chồng hàm Serialize( CArchive & ar ) để thực hiện đọc tài liệu từ tệp
Sơ đồ minh họa cơ chế lưu tệp
ID_FILE_OPEN CWinApp :: OnFileOpen()
CDocManager :: DoPromptFileName(...)
Data
CD : CDocument
Ổ đĩa
CDocument :: OnOpenDocument( filename )
CDocument :: OnOpenDocument( filename )
CDocument :: Serialize( CArchive &ar )