Bài giảng Lập trình Windows - Chương 3: Lập trình C++ trên Windows
Phương pháp OOP và trên Windows Xây dựng lớp ứng dụng Xây dựng lớp cửa sổ Xử lý thông điệp trên cửa sổ Một số thông điệp cơ bản
Bạn đang xem nội dung tài liệu Bài giảng Lập trình Windows - Chương 3: Lập trình C++ trên Windows, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Chương 3: Lập trình C++ trên Windows
Phương pháp OOP và trên Windows
Xây dựng lớp ứng dụng
Xây dựng lớp cửa sổ
Xử lý thông điệp trên cửa sổ
Một số thông điệp cơ bản
3.1- Phương pháp OOP và trên Windows
Phương pháp lập trình hướng đối tượng
Lập trình OOP so với lập trình cấu trúc
Các khái niệm cơ bản trong lập trình hướng đối tượng
Các kỹ thuật OOP trong C++: xây dựng lớp, thành viên, kế thừa,
đối tượng và xử lý đối tượng, cơ chế ảo và đa hình,...
Thư viện MFC cung cấp OOP trên Windows
MFC
APILõi của
Windows
Programmer
3.2- Xây dựng lớp ứng dụng
Các thành phần chính ?
Lớp ứng dụng kế thừa từ CWinApp:
BOOL InitInstance()
m_pMainWnd
m_pActiveWnd
m_hInstance
Chương trình
Khai báo thư viện
Xây dựng các lớp
cho chương trình
Tạo đối tượng
chương trình
MFC
CWinApp
C
Chương trình
CT
Kế thừa
Cách viết lớp chương trình ?
Một số hàm MFC cơ bản ?
AfxMessageBox( thông-báo [, kiểu ] );
CWinApp* AfxGetApp();
CWnd* AfxGetMainWnd();
class CT : public CWinApp
{ public:
BOOL InitInstance()
{
.. Viết các lệnh khởi tạo chương trình
return 1;
}
};
3.2- Xây dựng lớp ứng dụng
Một chương trình MFC đơn giản
3.2- Xây dựng lớp ứng dụng
CT a;
class CT : public CWinApp
{
pubic:
BOOL InitInstance()
{
AfxMessageBox( “Chuong trinh don gian” );
return 1;
}
};
#include
Chương trình MFC
Cơ chế đa hình và
phương thức ảo
Lớp cửa sổ kế thừa từ CFrameWnd:
m_hWnd
Create( class, title );
ShowWindow( mode );
UpdateWindow();
MoveWindow( x,y, w,h / LPCRECT );
GetWindowRect( LPCRECT );
GetClientRect( LPCRECT );
SetWindowText( title );
MessageBox( text );
...
3.3- Xây dựng lớp cửa sổ
MFC
CFrameWnd
C
Chương trình
CS
Kế thừa
CWinApp
CT
Mẫu lập trình lớp cửa sổ
Tạo đối tượng cửa sổ trong lớp ứng dụng
m_pMainWnd = new CS;
3.3- Xây dựng lớp cửa sổ
class CS : public CFrameWnd
{ public:
CS()
{
. Tạo và hiển thị cửa sổ lên màn hình .
}
... Lập trình các thành viên lớp cửa sổ ...
};
#include
//====================================================
class CS : public CFrameWnd
{ public:
CS() { Create( 0, “Chuong trinh MFC” ); ShowWindow(1); UpdateWindow(); }
};
//===================================================
class CT : public CWinApp
{ public:
BOOL InitInstance()
{
m_pMainWnd = new CS;
return 1;
}
};
//===================================================
CT a;
Một chương trình có cửa sổ đơn giản
3.3- Xây dựng lớp cửa sổ
Xử lý các thông điệp
đáp ứng yêu cầu
người dùng
Lớp cửa sổ
Phương thức xử
lý thông điệp
3.4- Xử lý thông điệp trên cửa sổ
Cơ chế xử lý thông điệp trong MFC ?
Lớp có khai báo xử lý thông điệp ?
Khai báo trong lớp : DECLARE_MESSAGE_MAP()
Cài đặt ngoài lớp :
BEGIN_MESSAGE_MAP( derived, base )
ánh-xạ-thông-điệp
END_MESSAGE_MAP()
Mẫu phương thức xử lý thông điệp
afx_msg void On( tham-số );
Hàng đợi thông điệp
MFC API
#include
class CT : public CWinApp
{
........
};
class CS :public CFrameWnd
{
public:
(Xử lý thông điệp - Method)
};
CT a;
#include
int WINAPI WinMain( ... )
{
........
}
LRESULT CALLBACK hàmCS(...)
{
(Xử lý thông điệp - IF)
}
Thư viện
Lớp cửa sổ
vs
Hàm cửa sổ
Lớp ứng dụng
vs
Hàm chính
Đối tượng CT
So sánh giữa lập trình MFC & API ?
3.4- Xử lý thông điệp trên cửa sổ
Tên thông điệp Mẫu hàm xử lý thông điệp
WM_CLOSE
WM_DESTROY
OnClose();
OnDestroy();
WM_SIZING
WM_SIZE
OnSizing( UINT side, LPRECT rect );
OnSize( UINT type, int cx, int cy );
WM_MOVING
WM_MOVE
OnMoving( UINT side, LPRECT rect );
OnMove( int x, int y );
WM_ACTIVATE OnActivate( UINT state, CWnd *other, BOOL min);
WM_TIMER OnTimer( UINT sh );
WM_KEYDOWN
WM_CHAR
WM_KEYUP
OnKeyDown( UINT c, UINT r, UINT f );
OnChar( UINT c, UINT r, UINT f );
OnKeyUp( UINT c, UINT r, UINT f );
WM_MOUSEMOVE
WM_LBUTTONDOWN
WM_LBUTTONUP
OnMouseMove( UINT f, CPoint p );
OnLButtonDown( UINT f, CPoint p );
OnLButtonUp( UINT f, CPoint p );
Một số thông điệp cơ bản ?
3.4- Xử lý thông điệp trên cửa sổ
class CS : public CFrameWnd
{ public:
void OnSizing (UINT s, LPRECT r)
{
char t[100];
sprintf(t,"Sizing is (left=%d,top=%d) & (right=%d,bottom=%d)",
r->left,r->top,r->right,r->bottom);
SetWindowText(t);
}
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP( CS, CFrameWnd )
ON_WM_SIZING()
.............................
END_MESSAGE_MAP()
Hàm xử lý
thông điệp
Khai báo lớp có ánh
xạ thông điệp
Ánh xạ các thông điệp
có xử lý
3.4- Xử lý thông điệp trên cửa sổ
Ví dụ cách xử lý thông điệp trong MFC
Các thông điệp bàn phím và mẫu hàm xử lý
WM_CHAR Nhấn các phím ký tự OnChar (UINT c, UINT r, UINT f);
WM_KEYDOWN Nhấn xuống các phím OnKeyDown (UINT c, UINT r, UINT f);
WM_KEYUP Nhả các phím OnKeyUp (UINT c, UINT r, UINT f);
Ý nghĩa các tham số
UINT c: mã phím đã được gõ {VK_F1,...,F12, VK_HOME, VK_INSERT, ... }
UINT r: số lượng ký tự được sinh ra khi giữ phím
UINT f: các trạng thái khác của bàn phím
A
WM_KEYDOWN
WM_CHAR
WM_KEYUP
OnKeyDown (c=65,...)
OnChar (c=65,...)
OnKeyUp (c=65,...)
1
2
3
3.5- Một số thông điệp cơ bản
Các thông điệp chuột và mẫu hàm xử lý
WM_MOUSEMOVE Di chuyển chuột OnMouseMove (UINT f,CPoint p);
WM_LBUTTONDOWN Nhấn nút trái OnLButtonDown (UINT f,CPoint p);
WM_LBUTTONUP Nhả nút trái OnLButtonUp (UINT f, CPoint p);
WM_RBUTTONDOWN Nhấn nút phải OnRButtonDown (UINT f,CPoint p);
WM_RBUTTONUP Nhả nút phải OnRButtonUp (UINT f, CPoint p);
WM_LBUTTONDBLCLK Nhấn đúp nút trái OnLButtonDblClk (UINT f, CPoint p);
WM_RBUTTONDBLCLK Nhấn đúp nút phải OnRButtonDblClk (UINT f, CPoint p);
Ý nghĩa các tham số trong các hàm xử lý thông điệp trên
UINT f: trạng thái các phím gồm các giá trị {MK_CONTROL, MK_LBUTTON,
MK_MBUTTON, MK_RBUTTON, MK_SHIFT}
CPoint p: tọa độ điểm nhấn chuột trên cửa sổ gồm {x, y}
3.5- Một số thông điệp cơ bản
OnLButtonDown(UINT, CPoint{x,y})
WM_LBUTTONDOWN
OnLButtonUp( f=? , p={x,y} )
WM_LBUTTONUP
OnMouseMove( f=? , p={x,y} )
WM_MOUSEMOVE
OnRButtonDown( f=? , p={x,y} )
WM_RBUTTONDOWN
OnRButtonUp( f=? , p={x,y} )
WM_RBUTTONUP
3.5- Một số thông điệp cơ bản
Phát sinh do thực hiện các thao tác cơ bản trên cửa sổ như: đóng, dịch
chuyển, thay đổi kích thước,
Mẫu hàm xử lý
void OnSysCommand ( UINT id, LPARAM lp );
id là số hiệu lệnh, lp là tham số chứa thông tin của lệnh.
Bảng giá trị ý nghĩa tham số id ở trên
Nhắc lại một số lệnh cơ bản
GetWindowRect( LPRECT rect );
GetClientRect( LPRECT rect );
ShowScrollBar(UINT bar, BOOL redraw );
CreateSolidCaret( width, height );
ShowCaret();
SetCaretPos( POINT p );
SetClassLong( HWND, index, new );
id Ý nghĩa
61458 Dịch chuyển
61443 Kéo lên
61458 Kéo xuống
61441 Kéo trái
61442 Kéo phải
61445 Kéo góc phải trên
61444 Kéo góc trái trên
61447 Kéo góc trái dưới
61448 Kéo góc phải dưới
3.5- Một số thông điệp cơ bản