Trao đổi với tôi

http://www.buidao.com

5/2/10

[Programming] Tab Control trong VC++6

Câu hỏi :
Trong VC++ 6.0 làm thế nào để sử dụng Tab Control, mỗi lần bấm vào Tab nào đó sẽ tạo ra 1 form mới trên tab đó, mọi thao tác trên tab đó cũng giống như trên 1 form bình thường.


Trả lời :
Có nhiều cách dùng đối tượng TabControl, trong đó cách dễ dàng nhất là dùng nó thông qua 2 đối tượng MFC là CPropertySheet và CPropertyPage. CPropertySheet là đối tượng chứa nhiều trang thuộc tính (form), mỗi trang thuộc tính là đối tượng CPropertyPage. Sau đây là qui trình điển hình để tạo 1 form chứa 1 sheet gồm 3 trang thuộc tính như sau:

1. Chạy VC++, tạo project mới để quản lý ứng dụng theo dạng "Dialog Based". Form giao diện chính của ứng dụng được để trống (bạn nên xóa 2 button và 1 label do VC++ tạo sẵn).
2. Thiết kế trực quan trang thuộc tính đầu tiên cần dùng. Để tạo 1 trang thuộc tính mới, bạn chọn menu Insert.Resource.Dialog.New. Sau khi 1 dialog mới được tạo ra, bạn hãy thiết kế trực quan các phần tử giao diện mong muốn trong dialog đó y như thiết kế dialog chính của chương trình. Lưu ý rằng kích thước của các trang thuộc tính được dùng chung trong 1 TabControl nên giống nhau. Để tạo ra class miêu tả dialog vừa thiết kế, bạn hãy nhấn kép chuột trên dialog tương ứng, cửa sổ "Add a class" sẽ xuất hiện, bạn hãy đặt tên cho class miêu tả dialog này (thí dụ như CPage1), lưu ý duyệt danh sách các "base class" và chọn CPropetyPage làm "base class" cho class cần tạo ra. Ngoài ra lưu ý rằng nội dung thuộc tính "Caption" của dialog sẽ trở thành tên "tab" tương ứng trong TabControl chứa dialog này.
3. Lặp lại bước 2 cho các trang thuộc tính cần dùng còn lại (thí dụ tên là CPage2, CPage3).
4. Tạo class PropertySheet chứa các trang thuộc tính. Vào menu View.ClassWizard, chọn button "Add class.New" để mở cửa sổ tạo class mới, đặt tên cho class (thí dụ như CProgSheet), duyệt danh sách các "base class" và chọn CPropetySheet làm "base class" cho class cần tạo ra.
5. Mở file đặc tả class của form chương trình (thí dụ tên là TestTabCtrlDlg.h), thêm các thuộc tính sau để quản lý các đối tượng trang thuộc tính và đối tượng sheet:
CPage1* m_page1;
CPage2* m_page2;
CPage3* m_page3;
CProgSheet* m_pPropSheet;
6. Mở file hiện thực class miêu tả form chương trình (thí dụ tên là TestTabCtrlDlg.cpp), duyệt tìm hàm OnInitDialog() và thêm đoạn code sau vào vị trí được VC++ đề nghị (sau hàng chú thích "// TODO: Add extra initialization here") :
BOOL CTestTabCtrlDlg::OnInitDialog() {
//đoạn code đã được tạo sẵn bởi VC++
...
// TODO: Add extra initialization here
// tạo các trang thuộc tính
m_page1 = new CPage1;
m_page2 = new CPage2;
m_page3 = new CPage3;
// tạo đối tượng PropertySheet
m_pPropSheet = new Sheet(IDS_CAPSHEET, GetActiveWindow(), IDD_PROPPAGE1);
// "add" từng trang thuộc tính vào sheet
m_pPropSheet->AddPage(m_page1);
m_pPropSheet->AddPage(m_page2);
m_pPropSheet->AddPage(m_page3);
// thiết lập chế độ "modeless" cho trang thuộc tính
if (!m_pPropSheet->Create(this,
DS_CONTEXTHELP | DS_SETFONT | WS_CHILD | WS_VISIBLE)) {
DestroyWindow();
return FALSE;
}
//thiết lập vị trí và kích thước cho sheet
m_pPropSheet->SetWindowPos(NULL, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE);
//thiết lập style hiển thị cho sheet
m_pPropSheet->ModifyStyle(WS_BORDER|WS_CAPTION,
(WS_BORDER|WS_CAPTION));
//hiệu chỉnh kích thước của Form theo kích thước của Sheet
CRect rectSize;
m_pPropSheet->GetWindowRect(rectSize);
MoveWindow (0,0,rectSize.Width()+10,rectSize.Height()+30,TRUE);
return TRUE; // return TRUE unless you set the focus to a control
}
7. Dịch và thử chạy ứng dụng để kiểm tra kết quả.

reflink: http://www.pcworld.com.vn/hoi-dap/lap-trinh/2006/04/1216582/tab-control-trong-vc-6/