Tài liệu Thực hành lập trình windows: TH Lập trình Windows Chương 1-2
Bài tập chương 1
1. Viết chương trình hiển thị màn hình như sau:
Hướng dẫn:
1/9
TH Lập trình Windows Chương 1-2
2/9
TH Lập trình Windows Chương 1-2
3/9
TH Lập trình Windows Chương 1-2
4/9
TH Lập trình Windows Chương 1-2
2. Từ chương trình câu 1, thay đổi một số thuộc tính của cửa sổ lần lượt như sau:
5/9
TH Lập trình Windows Chương 1-2
-
3. Lần lượt thay đổi trạng thái cửa sổ như sau:
• Nằm ở giữa màn hình, kích thước 640x480
• Luơn nằm trên các cửa sổ khác .
• Khơng thể thay đổi kích thước
• Cửa sổ phĩng to đầy màn hình
Gợi ý: sử dụng các hàm thuộc lớp CWnd: Create, ShowWindow, SetWindowPos
Bài tập chương 2
1. Bài 1
6/9
TH Lập trình Windows Chương 1-2
Gợi ý:
- Sử dụng hàm GetClientRect để lấy kích thước vùng Client
- Chia vùng Client thành 4 phần bằng nhau, mỗi phần là một hình chữ nhật
- Sử dụng các đối tượng CPen, CBrush và các hàm Ellipse, Chord, Pie, RoundRect,
SetTextColor, SetBk...
86 trang |
Chia sẻ: Khủng Long | Lượt xem: 953 | Lượt tải: 0
Bạn đang xem trước 20 trang mẫu tài liệu Thực hành lập trình windows, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
TH Lập trình Windows Chương 1-2
Bài tập chương 1
1. Viết chương trình hiển thị màn hình như sau:
Hướng dẫn:
1/9
TH Lập trình Windows Chương 1-2
2/9
TH Lập trình Windows Chương 1-2
3/9
TH Lập trình Windows Chương 1-2
4/9
TH Lập trình Windows Chương 1-2
2. Từ chương trình câu 1, thay đổi một số thuộc tính của cửa sổ lần lượt như sau:
5/9
TH Lập trình Windows Chương 1-2
-
3. Lần lượt thay đổi trạng thái cửa sổ như sau:
• Nằm ở giữa màn hình, kích thước 640x480
• Luơn nằm trên các cửa sổ khác .
• Khơng thể thay đổi kích thước
• Cửa sổ phĩng to đầy màn hình
Gợi ý: sử dụng các hàm thuộc lớp CWnd: Create, ShowWindow, SetWindowPos
Bài tập chương 2
1. Bài 1
6/9
TH Lập trình Windows Chương 1-2
Gợi ý:
- Sử dụng hàm GetClientRect để lấy kích thước vùng Client
- Chia vùng Client thành 4 phần bằng nhau, mỗi phần là một hình chữ nhật
- Sử dụng các đối tượng CPen, CBrush và các hàm Ellipse, Chord, Pie, RoundRect,
SetTextColor, SetBkMode, DrawText
Ví dụ: hàm vẽ Ellipse:
7/9
TH Lập trình Windows Chương 1-2
2. Bài 2
Gợi ý:
- Tính kích thước bitmap, mỗi ảnh sau cĩ kích thước gấp 2 lần ảnh trước
- Sử dụng hàm BitBlt và StretchBlt.
8/9
TH Lập trình Windows Chương 1-2
3. Bài 3
9/9
TH Lập trình Windows Chương 3
Bài tập chương 3
1. Dùng MFC AppWizard xây dựng ứng dụng sau:
Chuỗi Hello!MFC cĩ thể chuyển động theo các phương:
- Sang trái : khi nhấn phím ←
- Sang phải: khi nhấn phím →
- Đi lên: khi nhấn phím ↑
- Đi xuống: khi nhấn phím ↓
- Phím S: Start – Stop chuyển động
Gợi ý:
- Sử dụng MDC và các hàm LoadBitmap, StretchBlt để load ảnh nền.
- Tạo font chữ, sử dụng các hàm SetTextColor, DrawText để xuất chuỗi
Hello!MFC
- Chuỗi Hello!MFC nằm trong một frame hình chữ nhật (CRect). Để thay đổi vị trí
chuỗi, chỉ cần di chuyển frame. Chú ý: Để tính tốn kích thước frame trên, sử
dụng hàm GetTextMetrics kết hợp với độ dài chuỗi.
- Khai báo hàm xử lý sự kiện WM_TIMER. Trong hàm OnTimer, cập nhật lại vị trí
frame tuỳ theo chiều di chuyển đang được chọn
- Khai báo hàm xử lý sự kiện WM_KEYDOWN. Trong hàm OnKeyDown, cập
nhật lại chiều chuyển động dựa vào giá trị các phím được nhấn
1/7
TH Lập trình Windows Chương 3
Ví dụ:
- Khai báo các biến thuộc lớp CChildView:
- Tạo MDC:
- Load ảnh nền:
- Tính kích thước và vị trí frame chứa chuỗi Hello!MFC:
2/7
TH Lập trình Windows Chương 3
- Xử lý sự kiện nhấn phím:
- Xử lý sự kiện WM_TIMER:
3/7
TH Lập trình Windows Chương 3
2. Dùng MFC AppWizard xây dựng ứng dụng vẽ tự do như sau:
Yêu cầu:
- Giữ chuột trái rê vẽ tự do
- Khi nhấn một trong các phím:
o ‘R’, ‘G’, ‘B’: nét vẽ chuyển sang màu tượng ứng (Red, Green, Blue)
o Phím ‘A’, ‘C’: thay đổi con trỏ chuột (tùy ý), phím ‘E’: về dạng mặc định
o Phím ↑, ↓: thay đổi độ dày nét vẽ ( 1 ≤ nét vẽ ≤ 20)
o Phím Delete: xĩa màn hình
- Khi click chuột trên thanh tiêu đề: thay đổi tiêu đề cửa sổ
Gợi ý:
- Để thực hiện được thao tác vẽ, sử dụng các hàm xử lý sự kiện nhấn chuột
(WM_LBUTTONDOWN) để bắt đầu chọn vị trí vẽ và di chuyển chuột
(WM_MOUSEMOVE ) thực hiện thao tác vẽ.
4/7
TH Lập trình Windows Chương 3
- Thay đổi con trỏ chuột và độ dày nét vẽ thực hiện trong hàm OnKeyDown
- Để thay đổi tiêu đề khi click trên thanh tiêu đề cửa sổ, xử lý sự kiện
WM_NCLBUTTONDOWN của lớp CmainFrame
Ví dụ:
Trong lớp CChildView, khai báo các biến, các hàm và viết code cho các hàm:
// CChildView.h
//Hàm thay đổi con trỏ chuột
//Nhấn nút trái chuột
//Di chuyển chuột
5/7
TH Lập trình Windows Chương 3
//Nhấn phím
//Thay đổi con trỏ chuột
6/7
TH Lập trình Windows Chương 3
//Nhấn nút trái chuột ngồi vùng client
7/7
TH Lập trình Windows Chương 4
Bài tập chương 4
Dùng MFC AppWizard xây dựng ứng dụng vẽ các đoạn thẳng như sau:
Yêu cầu: Dùng chuột rê vẽ các đoạn thẳng, cho phép lưu vào file có tên Lines.dat
- Chúc năng bàn phím:
Thay đổi màu vẽ:
Phím R: đỏ
Phím G: màu xanh lá
Phím B: màu xanh dương
Lưu vào file: phím S
Load từ file: phím L
Xoá màn hình: phím C
Gợi ý:
Xây dựng lớp CLine kế thừ từ CObject:
1/2
TH Lập trình Windows Chương 4
Định nghĩa hàm Serialize:
Trong lớp CChildView , khai báo danh sách các đối tượng CLine:
CArray m_arrLines;
Để vẽ một đoạn thẳng, sử dụng các hàm xử lý sự kiện:
- Nhấn chuột (WM_LBUTTONDOWN): xác định hai điểm của đoạn thẳng,
đưa đoạn thẳng vào danh sách m_arrLines.
- Di chuyển chuột (WM_MOUSEMOVE ): cập nhật vị trí điểm thứ hai của
đoạn thẳng và thực hiện thao tác vẽ.
- Nhả chuột (WM_LBUTTONUP): kết thúc thao tác vẽ đoạn thẳng.
Để lưu và load danh sách các đoạn thẳng đã vẽ, trong lớp CChildView, khai báo
và định nghĩa hàm Serialize:
2/2
THỰC HÀNH BÀI DRAWS
PHẦN I:
1) Tạo ứng dụng SDI:
2) Tạo class CShape
Trong file Shape.h, khai báo marco và các biến như sau:
Khai báo hàm Draw:
Định nghĩa hàm Draw:
void CShape::Draw(CDC *pDC)
{
CBrush br (clrBkColor);
CBrush *pOldBr = pDC->SelectObject(&br);
CPen pen(PS_SOLID, nPenWidth, clrBorderColor);
CPen *pOldPen =pDC->SelectObject(&pen);
switch (nShape)
{
case 0://ve doan thang
pDC->MoveTo(pLeftTop);
pDC->LineTo(pRightBottom);
break;
case 1://ve ellipse
pDC-> Ellipse (pLeftTop.x, pLeftTop.y, pRightBottom.x,
pRightBottom.y);
break;
case 2://ve hinh chu nhat
pDC-> Rectangle (pLeftTop.x, pLeftTop.y, pRightBottom.x,
pRightBottom.y);
break;
}
pDC->SelectObject(pOldBr);
pDC->SelectObject(pOldPen);
br.DeleteObject();
pen.DeleteObject();
}
Khai báo hàm ảo Serialize:
Bổ sung marcro IMPLEMENT_SERIAL(CShape, CObject,1)trên
hàm Serialize và định nghĩa hàm này như sau:
IMPLEMENT_SERIAL(CShape, CObject,1)
void CShape::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{ // storing code (luu du lieu)
ar << nShape << clrBkColor << clrBorderColor << nPenWidth <<
pLeftTop << pRightBottom;
}
else
{ // loading code (load du lieu)
ar >> nShape >> clrBkColor >> clrBorderColor >> nPenWidth >>
pLeftTop >> pRightBottom;
}
}
3) Trong class CDrawsDoc, khai báo các biến:
Trong hàm Serialize của lớp CDrawsDoc, bổ sung đoạn code
sau:
Trong hàm OnNewDocument, khởi tạo giá trị ban đầu cho các
biến:
4) Chuyển sang class CDrawsView, khai báo các biến:
Tạo hàm xử lý sự kiện WM_CREATE:
Trong hàm OnCreate, tạo memdc:
Trong hàm OnDraw:
Tạo hàm xử lý sự kiện WM_LBUTTONDOWN:
Tạo hàm xử lý sự kiện WM_MOUSEMOVE:
Tạo hàm xử lý sự kiện WM_ERASEBKGND, chặn sự kiện xĩa
view:
Chạy thử ứng dụng, dùng chuột vẽ các ellipse màu đỏ, đĩng
và save thành file
Mở lại ứng dụng, mở file đã lưu, xem kết quả.
PHẦN II: Bổ sung Dialog option cho phép lựa chọn các thuộc tính
vẽ
1) Bổ sung hộp thoại Option dialog: Trong tab Resource view,
click phải trên mục Dialog:
Thiết kế hộp thoại như sau:
Double click vào vùng trống trên hộp thoại, tạo class gắn
với hộp thoại như sau:
2) Tạo class CColorStatic kế thừa từ class CStatic để hiển thị
màu chữ, màu nền cho đối tượng Static:
Để thấy được class mới tạo trong cửa sổ Class View, khai
báo file tiêu đề colorstatic.h trên phần khai báo lớp
COptionDlg như sau:
Trong class CColorStatic, khai báo các biến sau:
Tạo hai hàm SetBkColor và SetTextColornhư sau:
Viết code cho hai hàm vừa tạo:
Tạo hàm xử lý sự kiện =WM_CTRLCOLOR:
Viết code cho hàm vừa tạo:
3) Khai báo các biến cho các control trên hộp thoại Options:
4) Chuyển sang tab ResourceView, chọn Menu IDR_MAINFRAME, bổ
sung thêm menu Tools, Options:
Click phải trên menu Options:
5) Trong class COptionDlg, khai báo các biến sau:
Thêm hàm ảo OnInitDialog vào class COptionDlg:
Tạo hàm xử lý sự kiện cho hai control Static:
Thiêt lập thuộc tính Notify cho hai control Static này là
True:
Viết code cho hai hàm xử lý sự kiện vừa tạo:
6) Cuộn lên trên đầu file CDrawsDoc.cpp, khai báo tiêu đề file
“OptionDlg.h”:
Viết code xử lý sự kiện menu:
Kết thúc
TH Lập trình Windows chương 5 Dialog - Controls
HƯỚNG DẪN THỰC HÀNH CHƯƠNG 5
2 Dialog và các Controls
2.1 Bài tập 1 (FontView)
Bước 1: Tạo project (Dialog base), thiết kế giao diện theo yêu cầu
Bước 2: Khai báo các biến thành viên ứng với các controls :
Loại control ID Caption Biến đối tượng
ComboBox IDC_COMBOSIZE m_cbSize
ListBox IDC_LIST_FONT m_lbFonts
Editbox IDC_CONTENT m_editContent
CheckBox IDC_CHECK_TRUETYPE m_chkCheckbox
CheckBox IDC_B m_chkB
CheckBox IDC_I m_chkI
CheckBox IDC_U m_chkU
Static IDC_STATIC_FONTVIEW m_staticFontView
1/19
TH Lập trình Windows chương 5 Dialog - Controls
Bước 3: Tạo menu:
Bước 4:
Khai báo và định nghĩa hàm xử lý font :
int CALLBACK EnumFontfamProc (LPENUMLOGFONT lpelf,
LPNEWTEXTMETRIC lpntm, DWORD nFonttype, long lParam);
Bước 5: Trong lớp CFontViewDlg, khai báo và định nghĩa các hàm
2/19
TH Lập trình Windows chương 5 Dialog - Controls
//Hàm liệt kê và hiển thị font
//Hàm tạo và chọn font dựa vào các lựa chọn
3/19
TH Lập trình Windows chương 5 Dialog - Controls
//Hàm kiểm tra có đoạn văn bản nào đang được chọn trong EditBox
//Hàm cập nhật trạng thái menu
4/19
TH Lập trình Windows chương 5 Dialog - Controls
//Tạo danh sách các cỡ chữ trong ComboBox
Bước 5: Trong lớp CFontViewDlg, khai báo và định nghĩa các hàm xử lý sự kiện
//Trong OnInitDialog
// Thay đổi lựa chọn font trong ListBox
//Check – uncheck ComboBox True Type
5/19
TH Lập trình Windows chương 5 Dialog - Controls
// Sự kiện từ menu
6/19
TH Lập trình Windows chương 5 Dialog - Controls
//sự kiện click vào menu -> cập nhật trạng thái menu
//Xử lý sự kiện phím
//Check – uncheck các CheckBox B, I, U
//Thay đổi lựa chọn trên ComboBox Size
7/19
TH Lập trình Windows chương 5 Dialog - Controls
2.2 Bài tập 2 (ColorText)
Bước 1: Tạo project (Dialog base), thiết kế giao diện theo yêu cầu
Bước 2: Tạo các lớp CColorStatic kế thừa từ lớp cơ sở CStatic và CiconListBox kế thừa từ lớp
cơ sở CListBox (xem trong slides)
Bước 3: Trong lớp CcolorTextDlg khai báo các biến :
Bước 4: Khai báo các biến thành viên ứng với các controls :
Loại control ID Caption Biến đối tượng
CColorStatic IDC_STATIC_TEXT Advanced
Control
Programming
m_staticText
CIconListBox IDC_LIST_ICON m_lbIcon
Bước 5: Khai báo các và định nghĩa các hàm xử lý sự kiện :
//Trong OnInitDialog
8/19
TH Lập trình Windows chương 5 Dialog - Controls
//Trong OnPaint
// Các sự kiện từ Radio Button, ListBox
9/19
TH Lập trình Windows chương 5 Dialog - Controls
10/19
TH Lập trình Windows chương 5 Dialog - Controls
2.3 Bài tập 3 (SampleEditor)
Bước 1: Tạo project (Dialog base), thiết kế giao diện theo yêu cầu
ListBox
EditBox
CheckBox
ComboBo
11/19
TH Lập trình Windows chương 5 Dialog - Controls
Bước 2: Xây dựng các lớp đáp ứng yêu cầu thiết kế giao diện
• ComboBox hiển thị màu sắc:
12/19
TH Lập trình Windows chương 5 Dialog - Controls
• ListBox hiển thị màu cho text: Tạo lớp CColorListBox kế thừa từ lớp cơ sở CListBox:
File ColorListbox.h
File ColorListbox.cpp
//
//Thêm một chuỗi vào ListBox với màu text là cColor
// Thiết lập kích thước cho mỗi item
13/19
TH Lập trình Windows chương 5 Dialog - Controls
// Vẽ lại ListBox
14/19
TH Lập trình Windows chương 5 Dialog - Controls
• Lớp CEditColor : kế thừa từ lớp cơ sở CEdit, thêm các chức năng chọn màu văn bản,
màu nền
//File EditColor.h
15/19
TH Lập trình Windows chương 5 Dialog - Controls
//File EditColor.cpp
16/19
TH Lập trình Windows chương 5 Dialog - Controls
Bước 3: Khai báo các biến thành viên ứng với các controls :
Loại control ID Caption Biến đối tượng
ComboBox IDC_COMBOCOLOR m_cbColor
(COwnerDrawComboBox)
ComboBox IDC_COMBOSIZE m_cbSize
ListBox IDC_FONTLIST m_lbFonts
(CColorListBox)
Editbox IDC_CONTENT m_editContent
(CEditColor)
CheckBox IDC_CHECKB m_bB
CheckBox IDC_CHECKI m_bI
CheckBox IDC_CHECKU m_bU
Bước 4:
// file SimpleEditor.h
Khai báo và định nghĩa hàm xử lý font :
int CALLBACK EnumFontfamProc (LPENUMLOGFONT lpelf,
LPNEWTEXTMETRIC lpntm, DWORD nFonttype, long lParam);
//file SimpleEditor.cpp
17/19
TH Lập trình Windows chương 5 Dialog - Controls
18/19
TH Lập trình Windows chương 5 Dialog - Controls
//Trong hàm OnInitDialog()
19/19
TH Lập trình Windows chương 5 Kiến trúc Documents/Views – Dialog, Property Sheets
HƯỚNG DẪN THỰC HÀNH CHƯƠNG 5
3 Kiến trúc Documents/Views
3.1 SdiSquares
Bước 1: Tạo ứng dụng SDI với project name: SdiSquares
Bước 2: Thiết kế lại menu
Bước 3: Trong lớp CSquaresDoc:
ID_COLOR_RED Red
ID_COLOR_YELLOW Yellow
ID_COLOR_GREEN Green
ID_COLOR_CYAN Cyan
ID_COLOR_BLUE Blue
ID_COLOR_WHITE White
• Khai báo hai biến
COLORREF m_clrCurrentColor; // màu tô hiện tại
COLORREF m_clrGrid[4][4]; // màu tô trong các ô
• Xây dựng các hàm:
// Đặt giá trị màu (color) cho ô thứ [i][j]
// Báo tài liệu đã được thay đổi, cập nhật các view
void CSquaresDoc::SetSquare(int i, int j, COLORREF color)
{
ASSERT (i >= 0 && i = 0 && j <= 3);
m_clrGrid[i][j] = color;
SetModifiedFlag (TRUE);
UpdateAllViews (NULL);
}
//Lấy giá trị màu của ô thứ [i][j]
COLORREF CSquaresDoc::GetSquare(int i, int j)
{
ASSERT (i >= 0 && i = 0 && j <= 3);
return m_clrGrid[i][j];
}
// Lấy giá trị màu hiện tại
COLORREF CSquaresDoc::GetCurrentColor()
{
return m_clrCurrentColor;
}
• Khởi tạo giá trị các biến trong hàm OnNewDocument()
for (int i =0; i<4; i++)
for (int j=0; j<4; j++)
m_clrGrid[i][j] = RGB (255, 255, 255);
1
TH Lập trình Windows chương 5 Kiến trúc Documents/Views – Dialog, Property Sheets
m_clrCurrentColor = RGB (255, 0, 0);
• Khai báo các hàm xử lý sự kiện ON_COMMAND,
ON_UPDATE_COMMAND_UI cho các menu ID_COLOR_RED -
>ID_COLOR_WHITE
• Xử lý việc lưu và lấy giá trị các biến trong hàm Serialize
if (ar.IsStoring())
{
for (int i=0; i<4; i++)
for (int j=0; j<4; j++)
ar << m_clrGrid[i][j];
ar << m_clrCurrentColor;
}
else
{
for (int i=0; i<4; i++)
for (int j=0; j<4; j++)
ar >> m_clrGrid[i][j];
ar >> m_clrCurrentColor;
}
Bước 4: Trong lớp CSquaresView:
• Thực hiện thao tác vẽ trong hàm OnDraw
CSquaresDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// vẽ và tô màu các ô trong lưới với giá trị từ các biến
của lớp Doc
for (int i=0; i<4; i++) {
for (int j=0; j<4; j++) {
COLORREF color = pDoc->GetSquare (i, j);
CBrush brush (color);
int x1 = (j * 100) + 50;
int y1 = (i * 100) + 50;
int x2 = x1 + 100;
int y2 = y1 +100;
CRect rect (x1, y1, x2, y2);
pDC->FillRect (rect, &brush);
}
}
// vẽ các đường thẳng theo phương đứng
for (int x=50; x<=450; x+=100) {
pDC->MoveTo (x, 50);
pDC->LineTo (x, 450);
}
// vẽ các đường thẳng theo phương ngang
for (int y=50; y<=450; y+=100) {
pDC->MoveTo (50, y);
2
TH Lập trình Windows chương 5 Kiến trúc Documents/Views – Dialog, Property Sheets
pDC->LineTo (450, y);
}
• Khai báo hàm xử lý sự kiện khi nhấn nút trái chuột
if (point.x >= 50 && point.x = 50 &&
point.y <= 450) {
int i = (point.y-50)/100;
int j = (point.x - 50) / 100;
CSquaresDoc* pDoc = GetDocument ();
COLORREF clrCurrentColor = pDoc->GetCurrentColor ();
pDoc->SetSquare (i, j, clrCurrentColor);
}
3.2 MDIDrawEllipse
Bước 1: Tạo ứng dụng MDI với project name: MDIDrawEllipse
Bước 2: Thiết kế lại menu
3
TH Lập trình Windows chương 5 Kiến trúc Documents/Views – Dialog, Property Sheets
Bước 3: Xây dựng lớp CEllipse
class CEllipse : public CObject
{
DECLARE_SERIAL(CEllipse)
CPoint m_P1, m_P2;
COLORREF m_clrBorderColor, m_clrFillColor;
BOOL m_bThick;
public:
CEllipse();
virtual ~CEllipse();
void Draw(CDC *pDC);
void SetPoint2(CPoint p);
void SetPoint1(CPoint p);
void SetBorderColor(COLORREF clrBorderColor);
void SetFillColor(COLORREF clrFillColor);
void SetPenWidth(int nPenWidth);
CPoint GetPoint2();
CPoint GetPoint1();
COLORREF GetBorderColor();
COLORREF GetFillColor();
BOOL GetPenWidth();
void Serialize(CArchive& ar);
};
// Ellipse.cpp
CEllipse::CEllipse()
{
m_P1 = m_P2 = CPoint(0,0);
m_clrBorderColor = RGB(0,0,0);
m_clrFillColor = RGB(255, 255, 255);
m_bThick=FALSE;
}
IMPLEMENT_SERIAL(CEllipse, CObject,1)
. . .
void CEllipse::Draw(CDC* pDC)
{
CPen NewPen, *pOldPen = NULL;
CBrush NewBrush, *pOldBrush = NULL;
if(m_bThick)
NewPen.CreatePen(PS_SOLID, 5, m_clrBorderColor);
else
NewPen.CreatePen(PS_SOLID, 0, m_clrBorderColor);
NewBrush.CreateSolidBrush(m_clrFillColor);
pOldPen = pDC->SelectObject(&NewPen);
4
TH Lập trình Windows chương 5 Kiến trúc Documents/Views – Dialog, Property Sheets
pOldBrush = pDC->SelectObject(&NewBrush);
pDC->Ellipse(CRect(m_P1, m_P2));
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
NewPen.DeleteObject();
NewBrush.DeleteObject();
}
void CEllipse::Serialize(CArchive& ar)
{
CObject::Serialize();
if (ar.IsStoring())
{
ar <<
m_P1<<m_P2<<m_clrFillColor<<m_clrBorderColor<<m_bThick;
}
else
{
ar >>
m_P1>>m_P2>>m_clrFillColor>>m_clrBorderColor>>m_bThick;
}
}
Bước 4: Trong lớp CMDIDrawEllipseDoc:
• Khai báo các biến:
COLORREF m_clrBkColor, m_clrBorderColor;
BOOL m_bThick;
CArray m_Objects; // danh sách
các Ellipses
• Xây dựng hàm:
void CMDIDrawEllipseDoc::SetEllipse(CPoint point)
{
CEllipse *pEllipse = new CEllipse;
pEllipse->SetPoint1(point);
pEllipse->SetPoint2(point);
pEllipse->SetFillColor(m_clrBkColor);
pEllipse->SetPenWidth (m_bThick);
pEllipse->SetBorderColor (m_clrBorderColor);
m_Objects.Add(pEllipse);
SetModifiedFlag (TRUE);
UpdateAllViews (NULL);
}
• Khởi tạo giá trị các biến trong hàm OnNewDocument()
m_Objects.RemoveAll();
5
TH Lập trình Windows chương 5 Kiến trúc Documents/Views – Dialog, Property Sheets
m_clrBkColor = RGB (255, 0, 0);
m_clrBorderColor = RGB(255,255,0);
m_bThick=FALSE;
• Khai báo các hàm xử lý sự kiện ON_COMMAND,
ON_UPDATE_COMMAND_UI cho các menu.
• Xử lý việc lưu và lấy giá trị các biến trong hàm Serialize
if (ar.IsStoring())
{
ar<<m_clrBkColor<<m_clrBorderColor<<m_bThick;
for(int i=0;i<m_Objects.GetSize();i++)
ar << m_Objects[i];
}
else
{
ar>>m_clrBkColor>>m_clrBorderColor>>m_bThick;
while(!ar.IsBufferEmpty())
{
CEllipse *pEll=new CEllipse();
Ar >> pEll ;
m_Objects.Add (pEll);
}
}
Bước 5: Trong lớp CMDIDrawEllipseView:
• Khai báo các biến:
CDC m_MemDC;
CBitmap m_MemBitmap, *m_pOldBitmap;
• Khai báo và định nghĩa hàm
// MDIDrawEllipseView.h
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
// MDIDrawEllipseView.cpp
ON_WM_CREATE() //BEGIN MESSAGEMAP
//
int CMDIDrawEllipseView::OnCreate(LPCREATESTRUCT
lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// lay kich thuoc man hinh
CClientDC dc(this);
int MaxX = ::GetSystemMetrics(SM_CXSCREEN);
int MaxY = ::GetSystemMetrics(SM_CYSCREEN);
//Tao ra MemDC tuong thich voi dc cua man hinh
m_MemDC.CreateCompatibleDC(&dc);
6
TH Lập trình Windows chương 5 Kiến trúc Documents/Views – Dialog, Property Sheets
//tao doi tuong CBitmap(kich thuoc MaxX,MaxY) tuong
thich voi dc man hinh
m_MemBitmap.CreateCompatibleBitmap (&dc,MaxX,MaxY);
// Dua doi tuong bitmap m_MemBitmap vao m_MemDC
m_pOldBitmap=m_MemDC.SelectObject(&m_MemBitmap);
return 0;
}
• Thực hiện thao tác vẽ trong hàm OnDraw
CMDIDrawEllipseDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect;
GetClientRect(&rect);
m_MemDC.FillSolidRect(rect,RGB(255,255,255));
int i, n = pDoc->m_Objects.GetSize();
for (i=0; i<n; i++)
pDoc->m_Objects[i]->Draw(&m_MemDC);
pDC-
>BitBlt(0,0,rect.Width(),rect.Height(),&m_MemDC,0,0,SRCC
OPY);
• Khai báo hàm xử lý sự kiện khi nhấn nút trái chuột
CMDIDrawEllipseDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->SetEllipse (point);
• Khai báo hàm xử lý sự kiện khi di chuyển chuột
CMDIDrawEllipseDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (nFlags & MK_LBUTTON==MK_LBUTTON)
if (pDoc->m_Objects.GetSize()>0)
{
CEllipse* pEllipse= pDoc->m_Objects[pDoc-
>m_Objects.GetSize()-1];
pEllipse->SetPoint2(point);
Invalidate();
}
• Khai báo hàm xử lý sự kiện khi nhả nút trái chuột
CMDIDrawEllipseDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (pDoc->m_Objects.GetSize()>0)
{
CEllipse* pEllipse= pDoc->m_Objects[pDoc-
>m_Objects.GetSize()-1];
pEllipse->SetPoint2(point);
CClientDC dc(this);
pEllipse->Draw(&dc);
pDoc->SetModifiedFlag (TRUE);
pDoc->UpdateAllViews (NULL);
7
TH Lập trình Windows chương 5 Kiến trúc Documents/Views – Dialog, Property Sheets
}
• Hủy các đối tượng trong hàm
CMDIDrawEllipseView::~CMDIDrawEllipseView()
m_MemDC.DeleteDC();
m_MemBitmap.DeleteObject();
4 Dialog, Property Sheets
4.1 DlgDemo (Modal dialog)
Bước 1: Tạo ứng dụng SDI (bỏ chọn Document/View)
Thiết kế lại menu File: Gồm hai menu Options và Exit.
Bước 2: Từ menu Insert, chọn Resource, Dialog, New để thêm
vào ứng dụng một hộp thoại dialog.
Thiết kế lại dialog (IDD_OPTIONS ) và thêm các controls
theo yêu cầu
Double click vào dialog để tạo lớp mới COptionsDialog :
public CDialog và khai báo các biến cho các controls tương
ứng:
Loại control ID Caption Biến đối
tượng
Command
Button
IDC_RESET Reset
Editbox IDC_WIDTH m_nWidth
Editbox IDC_HEIGHT m_nHeight
Radio Button IDC_INCHES
(group)
Inches
m_nUnits
8
TH Lập trình Windows chương 5 Kiến trúc Documents/Views – Dialog, Property Sheets
Radio Button IDC_CENTIMETERS Centimeters
Radio Button IDC_PIXELS Pixels
Bước 3: Trong lớp CChildView khai báo các biến:
int m_nUnits;
int m_nHeight;
int m_nWidth;
Trong hàm OnPaint()
void CChildView::OnPaint()
{
CPaintDC dc(this); // Device context for painting.
CBrush brush (RGB (255, 0, 255));
CBrush* pOldBrush = dc.SelectObject (&brush);
switch (m_nUnits) {
case 0: // Inches.
dc.SetMapMode (MM_LOENGLISH);
dc.Rectangle (0, 0, m_nWidth * 100, -m_nHeight *
100);
break;
case 1: // Centimeters.
dc.SetMapMode (MM_LOMETRIC);
dc.Rectangle (0, 0, m_nWidth * 100, -m_nHeight *
100);
break;
case 2: // Pixels.
dc.SetMapMode (MM_TEXT);
dc.Rectangle (0, 0, m_nWidth, m_nHeight);
break;
}
dc.SelectObject (pOldBrush);
}
Khai báo hàm xử lý sự kiện cho menu File -> Option
void CChildView::OnFileOptions()
{
COptionsDialog dlg;
dlg.m_nWidth = m_nWidth;
dlg.m_nHeight = m_nHeight;
dlg.m_nUnits = m_nUnits;
if (dlg.DoModal () == IDOK) {
m_nWidth = dlg.m_nWidth;
9
TH Lập trình Windows chương 5 Kiến trúc Documents/Views – Dialog, Property Sheets
m_nHeight = dlg.m_nHeight;
m_nUnits = dlg.m_nUnits;
Invalidate ();
}
}
4.2 DlgDemo (Modeless dialog)
Bước 1-2:
Tạo ứng dụng và thiết kế hộp thoại Options giống bài tập
3.1
Right click vào lớp COptionsDlg , chọn Add Windows
Message Handler, chọn sự kiện WM_INITDIALOG để thêm hàm
OnInitDialog cho lớp này.
BOOL COptionsDialog::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
CMainFrame* pMain = (CMainFrame*)AfxGetApp()-
>GetMainWnd();
m_nWidth = pMain->m_nWidth;
m_nHeight = pMain->m_nHeight;
m_nUnits = pMain->m_nUnits;
UpdateData(FALSE);
return TRUE; // return TRUE unless you set the focus to a
control
}
Khai báo hàm xử lý sự kiện cho các nút OK, Cancel và Reset
void COptionsDialog::OnReset()
{
m_nWidth = 4;
m_nHeight = 2;
m_nUnits = 0;
UpdateData (FALSE);
}
void COptionsDialog::OnOK()
{
UpdateData(TRUE);
CMainFrame* pMain = (CMainFrame*)AfxGetApp()-
>GetMainWnd();
pMain->m_nWidth = m_nWidth;
pMain->m_nHeight = m_nHeight;
pMain->m_nUnits = m_nUnits;
pMain->Invalidate ();
CDialog::OnOK();
}
10
TH Lập trình Windows chương 5 Kiến trúc Documents/Views – Dialog, Property Sheets
void COptionsDialog::OnCancel()
{
ShowWindow(SW_HIDE);
CDialog::OnCancel();
}
Bước 3: Trong lớp CMainFrame khai báo các biến:
int m_nUnits;
int m_nHeight;
int m_nWidth;
Bước 4: Trong lớp CChildView
Khai báo biến :
COptionsDialog pDialog;
Khai báo hàm xử lý sự kiện cho menu File -> Option
void CChildView::OnFileOptions()
{
if(!pDialog) pDialog.Create(IDD_OPTIONS);
pDialog.ShowWindow(SW_SHOW);
}
4.3 PropDemo (Property Sheets)
Bước 1: Tạo ứng dụng SDI như bài tập 3.1.
Bước 2: Insert hai dialog, thiết kế giao diện như yêu cầu và
tạo hai lớp mới tương ứng với hai dialog trên:
class CSizePage : public CPropertyPage
{
. . .
// Dialog Data
//{{AFX_DATA(CSizePage)
enum { IDD = IDD_SIZEPAGE };
int m_nHeight;
int m_nWidth;
int m_nUnits;
//}}AFX_DATA
. . .
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CSizePage)
afx_msg void OnChange();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
void CSizePage::OnChange()
{
SetModified (TRUE);
11
TH Lập trình Windows chương 5 Kiến trúc Documents/Views – Dialog, Property Sheets
}
class CColorPage : public CPropertyPage
{
. . .
// Dialog Data
//{{AFX_DATA(CColorPage)
enum { IDD = IDD_COLORPAGE };
int m_nColor;
//}}AFX_DATA
. . .
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CColorPage)
afx_msg void OnChange();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
void CColorPage::OnChange()
{
SetModified (TRUE);
}
Bước 3: Tạo lớp mới kế thừa từ lớp CPropertySheet
class CMyPropertySheet : public CPropertySheet
{
. . .
// Attributes
public:
CColorPage m_colorPage;
CSizePage m_sizePage;
. . .
// Generated message map functions
protected:
//{{AFX_MSG(CMyPropertySheet)
//}}AFX_MSG
afx_msg void OnApply ();
DECLARE_MESSAGE_MAP()
};
// MyPropertySheet.cpp
BEGIN_MESSAGE_MAP(CMyPropertySheet, CPropertySheet)
//{{AFX_MSG_MAP(CMyPropertySheet)
//}}AFX_MSG_MAP
ON_BN_CLICKED (ID_APPLY_NOW, OnApply)
END_MESSAGE_MAP()
12
TH Lập trình Windows chương 5 Kiến trúc Documents/Views – Dialog, Property Sheets
////////////////////////////////////////////////////////
/////////////////////
void CMyPropertySheet::OnApply ()
{
GetActivePage ()->UpdateData (TRUE);
CMainFrame* pMain = (CMainFrame*)AfxGetApp()-
>GetMainWnd();
pMain->m_nWidth = m_sizePage.m_nWidth;
pMain->m_nHeight = m_sizePage.m_nHeight;
pMain->m_nUnits = m_sizePage.m_nUnits;
pMain->m_nColor = m_colorPage.m_nColor;
pMain->Invalidate ();
}
Bước 4: Trong lớp CChildView:
Trong hàm OnPaint()
void CChildView::OnPaint()
{
CPaintDC dc(this);
CMainFrame* pMain = (CMainFrame*)AfxGetApp()-
>GetMainWnd();
CBrush brush (CColorPage::m_clrColors[pMain-
>m_nColor]);
CBrush* pOldBrush = dc.SelectObject (&brush);
switch (pMain->m_nUnits) {
case 0: // Inches.
dc.SetMapMode (MM_LOENGLISH);
dc.Ellipse (0, 0, pMain->m_nWidth * 100, -pMain-
>m_nHeight * 100);
break;
case 1: // Centimeters.
dc.SetMapMode (MM_LOMETRIC);
dc.Ellipse (0, 0, pMain->m_nWidth * 100, -pMain-
>m_nHeight * 100);
break;
case 2: // Pixels.
dc.SetMapMode (MM_TEXT);
dc.Ellipse (0, 0, pMain->m_nWidth, pMain-
>m_nHeight);
}
dc.SelectObject (pOldBrush);
}
Khai báo hàm xử lý sự kiện cho menu File -> Propertiers
void CChildView::OnFilePropertiers()
{
13
TH Lập trình Windows chương 5 Kiến trúc Documents/Views – Dialog, Property Sheets
CMainFrame* pMain = (CMainFrame*)AfxGetApp()-
>GetMainWnd();
CMyPropertySheet ps (_T ("Properties"));
ps.m_sizePage.m_nWidth = pMain->m_nWidth;
ps.m_sizePage.m_nHeight = pMain->m_nHeight;
ps.m_sizePage.m_nUnits = pMain->m_nUnits;
ps.m_colorPage.m_nColor = pMain->m_nColor;
if (ps.DoModal () == IDOK) {
pMain->m_nWidth = ps.m_sizePage.m_nWidth;
pMain->m_nHeight = ps.m_sizePage.m_nHeight;
pMain->m_nUnits = ps.m_sizePage.m_nUnits;
pMain->m_nColor = ps.m_colorPage.m_nColor;
pMain->Invalidate ();
}
}
4.4 Phones(Common Dialog)
Bước 1: Tạo ứng dụng dialog và thiết kế giao diện theo yêu cầu
ListBox
(m_lbPhoneList
14
TH Lập trình Windows chương 5 Kiến trúc Documents/Views – Dialog, Property Sheets
Bước 2: Tạo lớp CEditNumber kế thừa từ lớp CEdit:
class CEditNumber : public CEdit
{
. . .
//{{AFX_MSG(CEditNumber)
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT
nFlags);
//}}AFX_MSG
. . .
};
//EditNumber.cpp
void CEditNumber::OnChar(UINT nChar, UINT nRepCnt, UINT
nFlags)
{
// TODO: Add your message handler code here and/or call
default
if (((nChar >= _T ('0')) && (nChar <= _T ('9'))) ||
(nChar == VK_BACK) || (nChar == _T ('(')) || (nChar == _T
(')')) ||
(nChar == _T ('-')) || (nChar == _T (' ')))
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
Bước 3: Insert dialog
• Tạo lớp mới CAddPhoneDlg :public CDialog và khai báo các
biến cho các controls tương ứng
Loại
control
ID Caption Biến đối tượng
Editbox IDC_NAME m_editName
Editbox IDC_PHONE CEditNumber
m_editPhone
Command IDOK (Bitmap) OK m_btOk
15
TH Lập trình Windows chương 5 Kiến trúc Documents/Views – Dialog, Property Sheets
Button
Command
Button
IDCANCEL
(Bitmap)
Cancel m_btCancel
• Trong hàm OnInitDialog()
BOOL CAddPhoneDlg::OnInitDialog()
{
CDialog::OnInitDialog();
HBITMAP hbitmap=::LoadBitmap (::AfxGetInstanceHandle
(),
MAKEINTRESOURCE(IDB_OK));
m_buttonOk.SetBitmap (hbitmap);
hbitmap=::LoadBitmap (::AfxGetInstanceHandle (),
MAKEINTRESOURCE(IDB_CANCEL));
m_buttonCancel.SetBitmap (hbitmap);
return TRUE;
}
Bước 4: Insert menu và thiết kế menu File theo yêu cầu
Bước 5: Trong lớp CPhonesDlg
• Khai báo biến CString m_strPathName;
• Khai báo và định nghĩa các hàm:
// Lưu dữ liệu từ ListBox vào file
BOOL CPhonesDlg::SaveFile(LPCTSTR pszFile)
{
BOOL bResult = FALSE;
try {
CStdioFile file (pszFile, CFile::modeWrite |
CFile::modeCreate);
DWORD dwCount = m_lbPhoneList.GetCount ();
file.Write (&dwCount, sizeof (dwCount));
if (dwCount)
{
for (int i=0; i<(int) dwCount; i++) {
CString string;
m_lbPhoneList.GetText (i, string);
string += _T ("\n");
16
TH Lập trình Windows chương 5 Kiến trúc Documents/Views – Dialog, Property Sheets
file.WriteString (string);
}
}
bResult = TRUE;
}
catch (CFileException* e) {
e->ReportError ();
e->Delete ();
}
return bResult;
}
17
TH Lập trình Windows chương 5 Kiến trúc Documents/Views – Dialog, Property Sheets
//Đọc file đưa vào ListBox
BOOL CPhonesDlg::LoadFile(LPCTSTR pszFile)
{
BOOL bResult = FALSE;
try {
CStdioFile file (pszFile, CFile::modeRead);
m_lbPhoneList.ResetContent ();
DWORD dwCount;
file.Read (&dwCount, sizeof (dwCount));
if (dwCount) {
for (int i=0; i<(int) dwCount; i++) {
CString string;
file.ReadString (string);
m_lbPhoneList.AddString (string);
}
}
bResult = TRUE;
}
catch (CFileException* e) {
e->ReportError ();
e->Delete ();
}
return bResult;
}
• Khai báo các hàm xử lý sự kiện từ menu
void CPhonesDlg::OnFileNew()
{
CAddPhoneDlg dlg;
if(dlg.DoModal ()==IDOK)
{
CString str=dlg.m_sName +_T("\t")+dlg.m_sPhone ;
m_lbPhoneList.AddString (str);
}
}
void CPhonesDlg::OnFileOpen()
{
CFileDialog dlg (TRUE, _T ("phn"), _T ("*.phn"),
OFN_FILEMUSTEXIST | OFN_HIDEREADONLY,
m_szFilters);
if (dlg.DoModal () == IDOK)
{
if (LoadFile (dlg.GetPathName ()))
{
m_strPathName = dlg.GetPathName ();
m_lbPhoneList.SetCurSel (0);
18
TH Lập trình Windows chương 5 Kiến trúc Documents/Views – Dialog, Property Sheets
}
}
}
void CPhonesDlg::OnFileSave()
{
if (!m_strPathName.IsEmpty ())
SaveFile (m_strPathName);
else
OnFileSaveAs ();
}
void CPhonesDlg::OnFileSaveAs()
{
CFileDialog dlg (FALSE, _T ("phn"), m_strPathName,
OFN_OVERWRITEPROMPT |
OFN_PATHMUSTEXIST | OFN_HIDEREADONLY,
m_szFilters);
if (dlg.DoModal () == IDOK)
if (SaveFile (dlg.GetPathName ()))
m_strPathName = dlg.GetPathName ();
}
void CPhonesDlg::OnFileExit()
{
OnOK();
}
// biến m_szFilters[] được khai báo đầu file PhoneDlg.cpp
như sau:
TCHAR m_szFilters[] =
_T ("My files (*.phn)|*.phn|All files (*.*)|*.phn||");
19
Các file đính kèm theo tài liệu này:
- tailieu.pdf