You are on page 1of 86

Một số xử lý thông dụng

GV.ThS.Trần Anh Tuấn A


Phần 1:
◦ Xử lý chuỗi
◦ Xử lý chuyển đổi kiểu dữ liệu
◦ Xử lý các điều khiển thông dụng
◦ Xử lý nhấp chuột
◦ Xử lý nhấn phím
Phần 2:
◦ Xử lý các lớp lưu trữ (MFC Collection)
◦ Xử lý các loại Dialog

Nội dung bài học


 Null-Terminated Strings
◦ Là một nhóm các ký tự hay ký hiệu kết hợp với nhau thành một từ hay
một câu
◦ Các ký tự nối tiếp nhau trong bộ nhớ và luôn kết thúc bằng ký tự null
(‘\0’)
◦ Vùng không gian lưu trữ : số ký tự + 1
◦ Cách khai báo :
 char StrName1[20] = “Hello World”; (static array)
 char *StrName2 = “Hello World”; (dynamic array)
 CHAR *StrName3 = “Hello World”; (Microsoft Window application)
 TCHAR *StrName4 = “Hello World”; (unicode standard)
 char *StrName5 = _T(“Hello World”); hoặc
char *StrName6 = _TEXT(“Hello World”); (unicode standard)

Xử lý chuỗi
 Một số thao tác thông dụng
◦ Gán :
 Mảng tĩnh : strcpy(StrName1,”Hello Vietnam”);
 Mảng động : StrName2 = “Hello Vietnam” hoặc StrName6 = strdup(“Hello
Vietnam”);
◦ Chiều dài mảng :
 int len = strlen(StrName3);
◦ Các lênh khác như :
 strcat - nối chuỗi
 strchr/strstr - trả về chuỗi mới từ ký tự/chuỗi tìm thấy trong chuỗi cũ
 strcmp - so sánh chuỗi
 strtok - phân chia chuỗi
 strtol/strtod - chuyển chuỗi thành số kiểu nguyên/thực
 strupr/strlwr - chuyển thành chuỗi chữ hoa/thường
◦ Định dạng chuỗi :
int a = 10; long b = 100; double c = 8.5; float d = 20.25;
char *str = “number”; char h = ‘:’;
 Mảng tĩnh :
sprintf(StrName1,"The %s is %c %d %ld %.1lf %.2f",str,h,a,b,c,d);
 Mảng động :
sprintf(StrName2 = new char[100],"The %s is %c %d %ld %.1lf %.2f",str,h,a,b,c,d);

Xử lý chuỗi
Lớp CString
◦ Thuộc thư viện MFC giúp hỗ trợ các thao tác xử
lý chuỗi thông thường
◦ Phương thức thiết lập:
 CString(const unsigned char* psz);
 CString(LPCWSTR lpsz);
 CString(LPCSTR lpsz);
◦ Ví dụ :
 CString strName(“Hello World”);
 CString strName = strName1;

Xử lý chuỗi
 Lớp CString (const)
◦ Các thao tác khác :
 FreeExtra() : xoá bỏ phần bộ nhớ còn dư
◦ Gọi hàm : strName.FreeExtra();

 GetLength() : chiều dài chuỗi


◦ Gọi hàm : strName.GetLength();

 TCHAR operator [] (int nIndex) const : lấy ký tự


◦ Gọi hàm : TCHAR h = strName[3];

 TCHAR GetAt ( int nIndex ) const : lấy ký tự


◦ Gọi hàm : TCHAR h = strName.GetAt(3);

 void SetAt (int nIndex, TCHAR ch) : Thêm ký tự


◦ Gọi hàm : strName.SetAt(3,’b’);

 int Find(TCHAR ch) const;


hay int Find(TCHAR ch, int nStart) const : Tìm một ký tự
 int ReverseFind(TCHAR ch) const : Tìm ngược
 int FindOneOf(LPCTSTR lpszCharSet) const :
Tìm một ký tự theo danh sách ký tự cho trước
 int Replace(TCHAR chOld, TCHAR chNew) : Thay thế ký tự

Xử lý chuỗi
 Lớp CString (const)
◦ Các thao tác khác :
 CString Left(int nCount) const : Trích chuỗi con từ trái qua
 CString Right( int nCount ) const : Trích chuỗi con từ phải qua
 CString Mid(int nFirst) const / CString Mid(int nFirst, int nCount) const : Trích chuỗi
con từ vị trí bất kỳ
 int Find(LPCTSTR lpszSub) const / int Find(LPCTSTR pstr, int nStart) const : Tìm vị
trí xuất hiện chuỗi con
 int Delete(int nIndex , int nCount = 1) : xoá nCount ký tự từ ký tự thứ nIndex
 int Remove(TCHAR ch) : xoá một ký tự
 int Replace(TCHAR chOld, TCHAR chNew) / int Replace(LPCTSTR lpszOld, LPCTSTR
lpszNew) : Thay thế ký tự/chuỗi
 int Collate(LPCTSTR lpsz) const /int CollateNoCase(LPCTSTR lpsz) const : So sánh
hai chuỗi
 void TrimLeft() / void TrimRight() : Xoá khoảng trắng dư thừa đầu/cuối
 BOOL IsEmpty() const : Kiểm tra chuỗi rỗng

◦ Định dạng chuỗi


 void Format(LPCTSTR lpszFormat, ...);
 Gọi hàm :
strName.Format(“The Sum of %d + %d is %d”,a,b,c);
strName.Format(“Noi hai chuoi %s va %s ta co chuoi %s”,str1,str2,str);

Xử lý chuỗi
 Chuyển đổi giữa các kiểu số
◦ Từ kiểu nguyên sang thực
 int a = 10; double d = (double)a;

◦ Từ kiểu thực sang nguyên


 double d = 5.25; int floor = (int)d; int ceil = (int)(d+0.5);

 Chuyển đổi giữa các kiểu chuỗi


◦ Từ (char *) sang CString
char *sName = “Hello World”;
CString str;
str.Format(“%s”,sName);

◦ Từ CString sang (char *)


CString str = "Hello World";
char *sName;
sName = str.GetBuffer(1);

Xử lý chuyển đổi kiểu dữ liệu


 Chuyển đổi từ chuỗi sang số
◦ Từ CString sang kiểu nguyên
CString strNumber = “12345”;
int Number , nFields;
nFields = sscanf(strNumber, "%d", &Number );
if (nFields == 0 || nFields == EOF)
Number = 0

◦ Từ CString sang kiểu thực


double Number;
Number = atof((LPCSTR)strNumber);

◦ Từ (char*) sang kiểu thực/nguyên :


Thực hiển đổi (char*) sang CString trước , rồi tiến hành từ CString sang kiểu
thực/nguyên

 Chuyển đổi từ số sang chuỗi


◦ Từ kiểu thực/nguyên sang CString
CString strNumber;
int a = 10; double d = 5.25;
strNumber.Format(“%d”,a); / strNumber.Format(“%l.2f”,d);

◦ Từ kiểu thực/nguyên sang (char*) :


Thực hiện chuyển đổi từ kiểu thực/nguyên sang CString , rồi thực hiện chuyển
CString sang (char*)

Xử lý chuyển đổi kiểu dữ liệu


 Các control thông dụng
nằm trên hộp control như
hình.
 Để mở/tắt hộp control:
nhấn phải chuột trên thanh
toolbar. Khi thấy một
menu xuất hiện thì chọn
Controls.
 Các control thông dụng
gồm:
◦ Static Text
◦ Edit Box
◦ Button
◦ CheckBox
◦ Radio Button
◦ Combobox
◦ ListBox
◦ Picture

Xử lý các điều khiển thông dụng


Xử lý các điều khiển thông dụng
Thiết kế giao diện
◦ Bước 1 : Vào tab resource view
◦ Bước 2 : Chọn một dialog cần thiết kế giao diện
◦ Bước 3 : Dùng chuột kéo thả các control vào dialog
◦ Bước 4 : Dùng toolbar canh chỉnh cho thẳng hàng các control
◦ Bước 5 : Với mỗi control. Nhấp phải chuột chọn Properties rồi
ghi caption (nếu có) và định nghĩa ID (bắt buộc) cho mỗi
control.
◦ Bước 6 : Tuỳ theo yêu cầu của từng control trong ứng dụng.
Người dùng có thể chỉnh các thuộc tính khác trong hộp thoại
Properties

Xử lý các điều khiển thông dụng


Kéo thả control

Xử lý các điều khiển thông dụng


Canh chỉnh

Thuộc
tính
Định nghĩa
ID cho
control

Xử lý các điều khiển thông dụng


 Cách dùng ClassWizard tạo biến quản lý control
◦ Mỗi control được người dùng kéo thả cần phải có biến đối
tượng để quản lý việc thay đổi hình thái của chúng trong
quá trình chạy chương trình
◦ Các biến đối tượng của mỗi control đều tương ứng với
một lớp mà Window cung cấp cho riêng chúng
◦ ClassWizard là một công cụ giúp người dùng dễ dàng tạo
biến cho mỗi control được kéo thả khi thiết kế giao diện

Xử lý các điều khiển thông dụng


 Giao diện ClassWizard (Chọn menu View > ClassWizard)
◦ Message Maps : Giúp người lập trình thêm các hàm xử tương
ứng với các sự kiện thao tác

Xử lý các điều khiển thông dụng


 Giao diện ClassWizard (Chọn menu View > ClassWizard)
◦ Member Variables : giúp người dùng thêm một biến điều khiển
hay biến giá trị cho mỗi control ( dựa trên ID của control đó )

Xử lý các điều khiển


thông dụng
Static Text
◦ Là control dùng để hướng dẫn người
dùng thuộc lớp CStatic
◦ Cách tạo static text :
 Cách 1 : kéo thả trong lúc design và tạo biến đối tượng dùng
class Winzard (nếu cần)
 Cách 2 :
CStatic *lblName = new CStatic;
lblNameCreate(“First Name", WS_CHILD | WS_VISIBLE,
CRect(20, 20, 100, 40), this);
◦ Cách tạo biến đối tượng không dùng ClassWizard :
CStatic *lblName;
lblName = (CStatic *)GetDlgItem(IDC_STATIC_NAME);

◦ Các thao tác con của lớp CStatic:


 GetWindowText(CString &) :Lấy Caption của Static text
 SetWindowText(LPCTSTR) : Thay đổi Caption

Xử lý các điều khiển thông dụng


Command Button
◦ Thuộc lớp CButton
◦ Các sự kiện thông dụng :
 Nhấp đơn (BN_CLICKED) , Nhấp đúp (BN_DOUBLECLICKED)
◦ Cách tạo control :
Cách 1 : Design & Classwizard
Cách 2 :
CButton *pButton; pButton = new CButton;
pButton->Create("&Submit", WS_CHILD | WS_VISIBLE,
CRect(150, 20, 250, 43), this, 0x302);
◦ Tạo biến đối tượng không dùng ClassWizard
CButton *pButton;
pButton = (CButton*)GetDlgItem(IDC_BUTTON_THEM);

Xử lý các điều khiển thông dụng


Command Button
◦ Các thao tác thuộc lớp Cbutton

 GetWindowText(Cstring &) :
◦ Lấy nhãn của nút
 SetWindowText(LPCTSTR) :
◦ Gán nhãn nút
 ShowWindow(int nCmdShow) :
◦ với nCmdShow là SW_SHOW hay SW_HIDE để làm ẩn hiện
nút bấm
 EnableWindow(bool bEnable = TRUE) :
◦ kích hoạt nút / nhưng kích hoạt nút

Xử lý các điều khiển thông dụng


 Edit Box
◦ Thuốc lớp CEdit
◦ Các sự kiện thông dụng :
 Thay đổi nhập liệu (EN_CHANGE) ;
 Nhận Focus từ bàn phím (EN_SETFOCUS)
 Thao tác khi vượt quá lượng ký tự đã định nghĩa (EN_MAXTEXT)
◦ Cách tạo control :
 Cách 1 : Design & Winzard
 Cách 2 :
CEdit *Musician = new CEdit;
Musician->Create(WS_CHILD | WS_VISIBLE,
CRect(10, 50, 150, 70), this, 0x1552);

◦ Tạo biến đối tượng không dùng ClassWizard


CEdit *pEdit;
pEdit = (CEdit*)GetDlgItem(IDC_EDIT_FIRSTNAME);

◦ Các thao tác thuộc lớp CEdit


 Thao tác chung : GetWindowText,SetWindowText,ShowWindow,EnableWindow
 Thao tác riêng :
SetLimitText(UINT nMax) : Định số lượng ký tự nhập
SetPasswordChar(TCHAR) : Định ký tự password thay thế các ký tự nhập
SetReadonly(BOOL bReadonly = TRUE) : Cho người dùng nhập/không nhập được

Xử lý các điều khiển thông dụng


CheckBox
◦ Thuộc lớp CButton
◦ Các sự kiện thông dụng :
 Nhấp đơn (BN_CLICKED)
 Nhấp đúp (BN_DOUBLECLICKED)
◦ Cách tạo control :
 Cách 1 : Design & Winzard
 Cách 2 :
◦ CButton *chkNgoaiNgu[2];
◦ chkNgoaiNgu[0] = new CButton;
◦ chkNgoaiNgu[0]->Create("&English",
WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX | BS_LEFTTEXT,
CRect(20, 40, 140, 55), this, 0x11);
◦ chkNgoaiNgu[1] = new CButton;
◦ chkNgoaiNgu[1]->Create("&Vietnammese",
WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX | BS_LEFTTEXT,
CRect(20, 60, 140, 75), this, 0x12);

Xử lý các điều khiển thông dụng


CheckBox
◦ Tạo biến đối tượng không dùng ClassWizard
 CButton *pCheckBox;
 pCheckBox = (CButton*)GetDlgItem(IDC_CHECK_VIETNAM);
◦ Các thao tác thuộc lớp CButton cho EditBox
 Thao tác chung :
GetWindowText,SetWindowText,ShowWindow,EnableWindow
 Thao tác riêng :
SetCheck(int nCheck) / int GetCheck():

Đổi hình dạng CheckBox giống dạng PushButton

Xử lý các điều khiển thông dụng


Radio Button
◦ Thuộc lớp CButton
◦ Các sự kiện thông dụng :
 Nhấp đơn (BN_CLICKED)
 Nhấp đúp (BN_DOUBLECLICKED)
◦ Cách tạo control :
 Cách 1 : Design & Winzard
 Cách 2 :
CButton *group;
CButton *chkPhai[2];
group = new CButton;
group->Create("Phai",WS_CHILD|WS_VISIBLE|BS_GROUPBOX,
CRect(15,20,145,80), this, 0x10);
chkPhai[0] = new CButton;
chkPhai[0]->Create("&Nam", WS_GROUP|WS_VISIBLE |BS_AUTORADIOBUTTON,
CRect(20, 40, 140, 55), this, 0x11);
chkPhai[1] = new CButton;
chkPhai[1]->Create("&Nu", WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,
CRect(20, 60, 140, 75), this, 0x12);
◦ Các thao tác thuộc lớp CButton cho Radio Button:
 SetCheck(int nCheck) / int GetCheck () : Kiểm tra check hay không

Xử lý các điều khiển thông dụng


Radio Button
◦ Các thao tác cơ bản
 Thuộc tính Group : là thuộc tính giúp đánh dấu một nhóm các
radiobutton thành các group khác nhau.
 Radiobutton nào được đánh dấu Group sẽ đứng đầu Group đó.
 Với mỗi group chỉ một radiobutton chọn được check còn các
radiobutton còn lại sẽ tự động uncheck.

Xử lý các điều khiển thông dụng


ListBox
◦ Thuộc lớp CListBox
◦ Các sự kiện thông dụng:
 Chọn một item (LBN_SELCHANGE)

◦ Cách tạo control :


 Cách 1 : Design & ClassWizard
 Cách 2 :
 CListBox* pListCountry = new CListBox;
 pListCountry->Create(WS_CHILD|WS_VISIBLE|LBS_STANDARD|WS_VSCROLL,
CRect(10,10,200,200), this, 0x11);
 pListCountry->AddString("American");
 pListCountry->AddString("England");
 pListCountry->AddString("VietNam");
 pListCountry->AddString("Korea");
 pListCountry->AddString("Japan");
 pListCountry->AddString("Germany");

Xử lý các điều khiển thông dụng


 ListBox
◦ Các thao tác của CListBox
 AddString(LPCTSTR)
◦ thêm một item vào ListBox
 InsertString(UINT nIndex,LPCTSTR)
◦ Thêm một Item vào sau item thứ nIndex

 DeleteString(UINT nIndex)
◦ Xóa một Item thứ nIndex trên ListBox
◦ Thứ tự Index của các Item là 0,1,2,… theo thứ tự AddString
 int GetCurSel()
◦ Lấy index của Item đang được chọn
 GetText(UINT nIndex,CString &)
◦ Lấy chuỗi của Item thứ nIndex
 int GetCount()
◦ Cho biết có bao nhiêu Item hiện có trong ListBox
 ResetContent()
◦ Xóa toàn bộ Item có trong ListBox

Xử lý các điều khiển thông dụng


Combo Box
◦ Thuộc lớp CComboBox
◦ Các sự kiện thông dụng :
 Chọn một item mới (CBN_SELCHANGE)
 Thay đổi một item (CBN_EDITCHANGE)
◦ Các dạng Combobox :

Xử lý các điều khiển thông dụng


Combo Box
◦ Cách tạo Control
 Cách 1 :
◦ Design : kéo thả control combobox , định nghĩa ID
◦ Data : Vào properties , chọn tab Data, nhập liệu
 Lưu ý: Dùng Ctrl + Enter để xuống dòng khi nhập liệu

Run

◦ Winzard : Vào Member Variables, chọn ID Combobox,


Add variables , Tạo một biến Control dạng CComboBox

Xử lý các điều khiển thông dụng


Combo Box
 Cách 2 :
CComboBox *Majors = new CComboBox;
Majors->Create(WS_CHILD|WS_VISIBLE|WS_VSCROLL|CBS_DROPDOWNLIST
, CRect(10, 50, 200, 150), this, 0x1448);
Majors->AddString("Accounting");
Majors->AddString("Art Education");
Majors->AddString("Finance");
Majors->AddString("Biology");
 Lưu ý : Ngoài CBS_DROPDOWNLIST còn có CBS_SIMPLE , CBS_DROPDOWN

◦ Các thao tác cơ bản :


 Có đầy đủ các thao tác của ListBox
 Khác với ListBox dùng GetText thì ComboBox dùng
GetLBText(UINT nIndex, Cstring&) đề lấy chuỗi của Item thứ nIndex

Xử lý các điều khiển thông dụng


Biến giá trị (value variables)
◦ Là biến quản lý các giá trị (chuỗi, số) hiển thị trên các control
◦ MFC có cơ chế chuyển dữ liệu từ biến (chuỗi, số) lên hiển thị
trên control hoặc ngược lại lấy hiển thị trên control gán vào
biến giá trị nhờ hàm UpdateData
BOOL UpdateData( BOOL bSaveAndValidate = TRUE );
bSaveAndValidate = TRUE : lấy dữ liệu từ control gán vào biến
bSaveAndValidate = FALSE: lấy dữ liệu từ biến đưa lên control
◦ Cách tạo biến giá trị :
 Class Winzard > Add Variables :
◦ Chọn Category : Value
◦ Chọn Variable types : là kiểu dữ liệu lưu trữ (CString, int, long, double, float, ….)
Ví dụ :
◦ Xây dựng chương trình người dùng nhập các thông tin cá
nhân rồi nhấn nút Info để hiển thị các thông tin vừa
nhập lên màn hình
◦ Bước 1: Thiết kế giao diện như sau :
 Riêng control Radio Button “Nam” ta check vào thuộc tính
Group

Xử lý các điều khiển thông dụng


Ví dụ (const)
◦ Bước 2 : Nhận định và thêm các biến cần thiết
 Nhận định :
◦ Edit Box MSSV người dùng sẽ nhập chuỗi  tạo một biến giá kiểu
CString chon control này.
◦ Edit Box HoTen cũng vậy
◦ Radio Button “Nam” đứng đầu group nên ta sẽ tạo một biến value
kiểu int cho nó. Nếu biến này là 0 thì là “Nam” , là 1 thì là “Nữ”
◦ Edit Box DTB người dùng sẽ nhập số thực nên ta sẽ tạo một biến
giá trị kiểu double cho control này
 Dùng Class Wizard tạo các biến trên
Ví dụ (const)
◦ Bước 3 : Nhận định và viết code xử lý
 Nhận định :
◦ Người dùng có thể nhập và thay đổi thông tin tùy ý. Nhưng chỉ khi
nhấp bào button “Xác Nhận” thì ta mới thu gom giá trị nhập để
xuất ra màn hình
◦ Vậy ta thêm sự kiện Nhấn vào nút “Xác Nhận” và dùng hàm
UpdateData(TRUE) để thu thập giá trị từ các control trên màn hình
gán vào biến
◦ Sau khi các biến đã có giá trị , ta sử dụng MessageBox để xuất
thông tin người dùng
 Thêm sự kiện nhấn nút “Xác Nhận” : Dùng Class Wizard
Ví dụ (const)
Các thông điệp xử lý chuột

Xử lý nhấp chuột
Các thông điệp xử lý chuột
◦ Khi dùng Wizard ánh xạ thông điệp với một hàm điều khiển thì
các hàm điều khiển sẽ có dạng sau :

◦ Ví dụ : Ánh xạ thông điệp WM_LBUTTONDOWN thì hàm điều


khiển phát sinh là
Các thông điệp xử lý chuột

◦ Trong đó :
 nFlags : dùng để nhận biết nút bấm chuột và các phím Ctrl/Shift bởi
phép toán &) có giá trị:
 point : với point.x và point.y cho biết vị trí nhấp chuột ở đâu trên
cửa sổ ứng dụng

 Ví dụ :
◦ Để nhận biết phím Ctrl có được nhấn kèm với chuột dùng
if ((nFlags & MK_CONTROL) == MK_CONTROL) {…}

Xử lý nhấp chuột
Các thông điệp nhấn phím

◦ Hàm điều khiển có dạng như sau :

 Trong đó :
nChar : gồm phím ký tự thông thường và phím ảo
nRepCnt : Đếm số lần lặp lại nếu phím được nhấn và giữ
nFlags : Xác nhận các loại scan code,key transition code,
context code.

Xử lý nhấn phím
 Các thông điệp nhấn phím
◦ nChar : Bảng phím ảo
 Các thông điệp nhấn phím
◦ nFlags : Xác nhận các loại scan code,key transition code,
context code

Xử lý nhấn phím
Các bước áp dụng xử lý nhấn phím
◦ Bước 1 : Vì sự kiện KeyDown không tự động có sẵn trong
chương trình nên ta làm thao tác SendMessage để dịch mã
phím và gửi sự kiện WM_KEYDOWN khi người dùng thao tác
 Dùng ClassWizard , thêm hàm xử lý sự kiện PreTranslateMessage
 Viết thêm đoạn code SendMessage trong hàm PreTranslateMessage
Các bước áp dụng xử lý nhấn phím
◦ Bước 2 : Dùng ClassWizard thêm hàm xử lý sự kiện WM_KEYDOWN.
Dùng biến nChar trong hàm này để kiểm tra phím nào được nhấn
 Lưu ý : Trong trường hợp muốn xử lý nhấn nhiều phím cùng lúc thì dùng
hàm ::GetKeyState để kiểm tra phím ảo nào được nhấn cùng.
MFC Collection
◦ Thư viện MFC cung cấp một số lớp lưu trữ dùng để lưu
một nhóm dữ liệu (ví dụ : danh sách chuỗi, số
nguyên,Sinh Viên, Khách Hàng, Hang Hóa v.v… )
◦ Các lớp lưu trữ này được chia làm hai loại :
 Lớp lưu trữ tạo từ các mẫu C++
(Collection classes created from C++ templates)
 Lớp lưu trữ không tạo từ các mẫu C++
(Collection classes not created from C++ templates)
◦ Các dạng lưu trữ thông dụng MFC hỗ trợ
 List : dạng danh sách liên kết
 Array : dạng mảng
 Map : dạng từ điển

Các lớp lưu trữ (MFC Collection)


List structure

Array structure
Map structure

Các lớp lưu trữ (MFC Collection)


Lớp lưu trữ dạng Array
◦ Lớp lưu trữ tạo từ các mẫu C++
Cách dùng
 Thêm thư viện Afxtempl.h trước khi dùng
 Tạo một lớp dữ liệu muốn lưu trữ trong Array
Ví dụ : CSinhVien, CPoint, CBook, v.v….
 Khai báo mảng lưu trữ dùng lớp CArray

CArray <DataType, DataType&> variable


Ví dụ : #include “Afxtempl.h”
…..
CArray <SinhVien, SinhVien&> array;
array.SetSize(10);
Array.Add(SinhVien(“Tran Van Huy”,”0411255”,”Nam”);

Các lớp lưu trữ (MFC Collection)


Lớp lưu trữ dạng Array
◦ Lớp lưu trữ không tạo từ các mẫu C++

◦ Cách dùng
 Thêm thư viện Afxcoll.h trước khi dùng
 Khai báo : TênLớp biếnmảng;
 Ví dụ : CStringArray strarr;

Các lớp lưu trữ (MFC Collection)


Các phương thức của lớp lưu trữ Array

Các lớp lưu trữ (MFC Collection)


Các phương thức của lớp lưu trữ Array
Các phương thức của lớp lưu trữ Array
Lớp lưu trữ dạng List
◦ Lớp lưu trữ tạo từ các mẫu C++
Cách dùng
 Thêm thư viện Afxtempl.h trước khi dùng
 Tạo một lớp dữ liệu muốn lưu trữ trong List
Ví dụ : CSinhVien, CPoint, CBook, v.v….
 Khai báo mảng lưu trữ dùng lớp CList

CList <DataType, DataType&> variable

Ví dụ : #include “Afxtempl.h”
…..
CList <Book, Book&> list

Các lớp lưu trữ (MFC Collection)


Lớp lưu trữ dạng List
◦ Lớp lưu trữ không tạo từ các mẫu C++

◦ Cách dùng
 Thêm thư viện Afxcoll.h trước khi dùng
 Khai báo : TênLớp biếnmảng;
 Ví dụ : CStringList strlist;
◦ Kiểu dữ liệu POSITION
 Là kiểu dữ liệu dùng trong List để đại diện cho vị trí của một phần
tử trong List.

Các lớp lưu trữ (MFC Collection)


Các phương thức của lớp lưu trữ Array
 Head/Tail Access
◦ GetHead Returns the head element of the list (cannot be
empty).
◦ GetTail Returns the tail element of the list (cannot be empty).

 Operations
◦ RemoveHead Removes the element from the head of the list.
◦ RemoveTail Removes the element from the tail of the list.
◦ AddHead Adds an element (or all the elements in another list)
to the head of the list (makes a new head).
◦ AddTail Adds an element (or all the elements in another list) to
the tail of the list (makes a new tail).
◦ RemoveAll Removes all the elements from this list.

Các lớp lưu trữ (MFC Collection)


Các phương thức của lớp lưu trữ Array
 Iteration
◦ GetHeadPosition Returns the position of the head element of the
list.
◦ GetTailPosition Returns the position of the tail element of the list.
◦ GetNext Gets the next element for iterating.
◦ GetPrev Gets the previous element for iterating.

 Retrieval/Modification
◦ GetAt Gets the element at a given position.
◦ SetAt Sets the element at a given position.
◦ RemoveAt Removes an element from this list, specified by
position.

Các lớp lưu trữ (MFC Collection)


Các phương thức của lớp lưu trữ Array
 Insertion
◦ InsertBefore Inserts a new element before a given position.
◦ InsertAfter Inserts a new element after a given position.

 Searching
◦ Find Gets the position of an element specified by pointer value.
◦ FindIndex Gets the position of an element specified by a zero-
based index.

 Status
◦ GetCount Returns the number of elements in this list.
◦ IsEmpty Tests for the empty list condition (no elements).

Các lớp lưu trữ (MFC Collection)


Ví dụ dùng Array

SinhVien.cpp

Note: must make class Dialog to be


a friend of class SinhVien to access
SinhVien data (Hoten and MSSV)
Ví dụ dùng Array
CollectionDemoDlg::OnInitDialog()

CollectionDemoDlg.h

Collection Demo Dialog

Class Winzards
Ví dụ dùng Array
Ví dụ List
Book.h

Book.cpp
Ví dụ List

CCObListDemoDlg.h

Class Winzards

CCObListDemoDlg::OnInitDialog()
Ví dụ List
Lớp lưu trữ dạng Map
◦ Một map, được xem như một dictionary, là một bảng
gồm nhiều phần tử được xác định bởi khoá
◦ MFC cung cấp tập các lớp hỗ trợ sử dụng map như

Các lớp lưu trữ (MFC Collection)


Ví dụ sử dụng Map

Các lớp lưu trữ (MFC Collection)


Ví dụ sử dụng Map

Các lớp lưu trữ (MFC Collection)


Dialog
◦ Dialog là cửa sổ giao diện với đặc điểm trang trí được mô tả thông qua
một cấu trúc độc lập. Cấu trúc này được lưu trữ trong resource của ứng
dụng, gọi là dialog resource.
◦ Có hai kiểu hoạt động của dialog :
 Dialog khóa (modal dialog) : Tác vụ thực hiện Dialog phải chờ đến
khi dialog chấm dứt hoạt động
 Dialog không khóa (modeless dialog) : Tác vụ thực hiện dialog có thể
tiếp tục các xử lý tiếp theo ngay sau lệnh thực hiện dialog.

Xử lý Dialog
Modal Dialog
◦ Lớp MFC quản lý : CDialog

◦ Các bước tạo và xử lý Dialog


 Bước 1 : Thêm một Dialog trong Resource
 Bước 2 : Thêm các control vào dialog & Thiết lập thuộc
tính Dialog
 Bước 3 : Khai báo lớp một kế thừa từ lớp CDialog
 Bước 4 : Hiển thị Dialog
 Bước 5 : Xử lý Dialog
 Bước 6 : Việc truyền và nhận dữ liệu giữa các Dialog

Xử lý Dialog
Modal Dialog
◦ Bước chuẩn bị :
 Giả sử ta có một chương trình hiển thị một danh sách Sinh
Viên
 Yêu cầu : Thêm nút Thông Tin để mở dạng Modal Dialog

Xử lý Dialog
Modal Dialog
◦ Bước chuẩn bị (const)
Modal Dialog
◦ Bước 1 : Thêm một Dialog trong Resource
Modal Dialog
◦ Bước 2 : Thêm các control vào dialog & Thiết lập thuộc
tính Dialog
Modal Dialog
◦ Bước 3 : Khai báo lớp một kế thừa từ lớp CDialog

Chương trình sẽ tự động hỏi


người dùng có muốn tạo lớp
quản lý Dialog vừa tạo hay
không ?
Modal Dialog
◦ Bước 3 : Khai báo lớp một kế thừa từ lớp CDialog (const)
Modal Dialog
 Bước 4 & 5 & 6 : Lớp CViduDialogBased
Modal Dialog
 Bước 4 & 5 & 6 : Lớp CSampleDialog
Câu hỏi : Tại sao sau khi đổi
quê quán rồi nhấn nút OK thì
không thấy thay đổi trong danh
sách. Còn nhấn nút Update thì
lại có thay đổi
Các bước tạo vả xử lý Modeless Dialog

Xử lý Dialog
Các bước tạo vả xử lý Modeless Dialog
◦ Ví dụ : Cũng ví dụ Modal Dialog trên. Ta thêm nút chi tiết. Khi
nhấn vào nó một hộp thoại dạng Modeless sẽ bật lên có nhiệm
vụ hiển thị thông tin chi tiết của mỗi Sinh Viên khi người dùng
chọn trong ListBox
Modeless Dialog
◦ Bước 1 & 2 : Giống như tạo một Dialog thông thường
 Modeless Dialog
◦ Bước 3 : Tạo một đối tượng kiểu Modeless Dialog
 Modeless Dialog
◦ Bước 4 : Xác định lúc cần ẩn hay hiện Modeless Dialog
Các hộp thoại thông dụng :
◦ MFC hỗ trợ các lớp đại diện cho các hộp thoại sau :

Xử lý Dialog
 Các hộp thoại thông dụng
◦ Open Dialog

Xử lý Dialog
 Các hộp thoại thông dụng
◦ Open Dialog

Lưu ý :
0 : Hộp thoại Save File
1 : Hộp thoại Open File
Các hộp thoại thông dụng
◦ Color Dialog

Xử lý Dialog
Các hộp thoại thông dụng
◦ Color Dialog
Các hộp thoại thông dụng
◦ Font Dialog

Xử lý Dialog

You might also like