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; - Nhả chuột WM_LBUTTONUP: kết thúc thao tác
Trang 1TH 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
Trang 2TH Lập trình Windows Chương 1-2
2/9
Trang 3TH Lập trình Windows Chương 1-2
3/9
Trang 4TH Lập trình Windows Chương 1-2
4/9
Trang 5TH 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
Trang 6TH 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
Trang 7TH 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
Trang 9TH Lập trình Windows Chương 1-2
3 Bài 3
9/9
Trang 10TH 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
Trang 12TH 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
Trang 13o ‘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
Trang 14TH 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
Trang 15TH Lập trình Windows Chương 3
//Nhấn phím
//Thay đổi con trỏ chuột
6/7
Trang 16TH Lập trình Windows Chương 3
//Nhấn nút trái chuột ngoài vùng client
7/7
Trang 17TH 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
Trang 18TH 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 <CLine*,CLine*> m_arrLines;
- 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
Trang 19THỰC HÀNH BÀI DRAWS PHẦN I:
1) Tạo ứng dụng SDI:
Trang 242) Tạo class CShape
Trang 26 Trong file Shape.h, khai báo marco và các biến như sau:
Khai báo hàm Draw:
Trang 27 Đị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);
Trang 28CPen *pOldPen =pDC->SelectObject(&pen);
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; }
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:
Trang 29IMPLEMENT_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:
Trang 30 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:
Trang 31 Tạo hàm xử lý sự kiện WM_CREATE:
Trong hàm OnCreate, tạo memdc:
Trang 32 Trong hàm OnDraw:
Tạo hàm xử lý sự kiện WM_LBUTTONDOWN:
Trang 33 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ả
Trang 34PHẦN II: Bổ sung Dialog option cho phép lựa chọn các thuộc tính
Trang 35 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:
Trang 36
Trang 37 Để 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:
Trang 414) Chuyển sang tab ResourceView, chọn Menu IDR_MAINFRAME, bổ sung thêm menu Tools, Options:
Trang 42 Click phải trên menu Options:
Trang 435) Trong class COptionDlg, khai báo các biến sau:
Thêm hàm ảo OnInitDialog vào class COptionDlg:
Trang 44 Tạo hàm xử lý sự kiện cho hai control Static:
Trang 46 Thiêt lập thuộc tính Notify cho hai control Static này là True:
Trang 47 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:
Trang 48Kết thúc
Trang 49TH 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
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
Trang 50TH 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
Trang 51TH 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
Trang 52TH 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
Trang 53TH 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
Trang 54TH Lập trình Windows chương 5 Dialog - Controls
// Sự kiện từ menu
6/19
Trang 55TH 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
Trang 56TH 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
Trang 57TH Lập trình Windows chương 5 Dialog - Controls
//Trong OnPaint
// Các sự kiện từ Radio Button, ListBox
9/19
Trang 58TH Lập trình Windows chương 5 Dialog - Controls
10/19
Trang 59TH 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
CheckBoxComboBo
11/19
Trang 60TH 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
Trang 61TH 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:
//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
Trang 62TH Lập trình Windows chương 5 Dialog - Controls
// Vẽ lại ListBox
14/19
Trang 63TH 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
Trang 64TH Lập trình Windows chương 5 Dialog - Controls
…
//File EditColor.cpp
16/19
Trang 65TH 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)
ListBox IDC_FONTLIST m_lbFonts
(CColorListBox) Editbox IDC_CONTENT m_editContent
(CEditColor)
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
Trang 66TH Lập trình Windows chương 5 Dialog - Controls
18/19
Trang 67TH Lập trình Windows chương 5 Dialog - Controls
//Trong hàm OnInitDialog()
…
…
19/19
Trang 68TH 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 <= 3 && j >= 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)
• 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
Trang 69TH 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
Bước 4: Trong lớp CSquaresView:
• Thực hiện thao tác vẽ trong hàm OnDraw
CSquaresDoc* pDoc = GetDocument();
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 ngang
for (int y=50; y<=450; y+=100) {
pDC->MoveTo (50, y);
2
Trang 70TH 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 <= 450 && point.y >= 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);
Trang 71TH 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
void SetBorderColor(COLORREF clrBorderColor);
void SetFillColor(COLORREF clrFillColor);
void SetPenWidth(int nPenWidth);
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
Trang 72TH Lập trình Windows chương 5 Kiến trúc Documents/Views – Dialog, Property Sheets
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;
Trang 73TH 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++)
{ 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
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
Trang 74TH 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();
• 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();
• Khai báo hàm xử lý sự kiện khi nhả nút trái chuột
CMDIDrawEllipseDoc* pDoc = GetDocument();