PHẦN 3: XỬ LÝ SỰ KIỆN CHUỘT
1. Chặn sự kiện chuột WM_LBUTTONDOWN trên vùng Client
1.1. Gọi cửa sổ ClassWiazrd
Có thể thực hiện bước này ở 2 dạng:
+ Menu: View / ClassWizard
+ Phím tắt: Ctrl + W
1.2. Bổ sung hàm chặn xử lý WM_LBUTTONDOWN.
Hình 1.2: Cửa sổ ClassWizard để thêm hàm chặn sự kiện
Có thể thực hiện bước này ở 2 dạng:
+ Double click trực tiếp lên message WM_LBUTTONDOWNHàm chặn sự kiện chuột mới tạo ra năm trong vùng viền đỏ của Hình 1.3.
+ Để con trỏ chuột lên WM_LBUTTONDOWN, rồi nhấn button AddFunction, rồi nhấn button EditCode.
Hình 1.3: Hàm CObjPaintView::OnLButtonDown
Việc chặn xử lý sự kiện WM_LBUTTONDOWN sẽ tạo ra 3 đoạn lện sau:
CODE1: Khai báo hàm chặn sự kiện trong file HEADER ObjPaintView.h.
// Generated message map functions
protected:
//{{AFX_MSG(CObjPaintView)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CObjPaintView, CView)
//{{AFX_MSG_MAP(CObjPaintView)
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
CODE3: Định nghĩa xử lý hàm xử lý sự kiên trong file implementation ObjPaintView.CPP.
///////////////////////////////////////////////////////////////////
// CObjPaintView message handlers
void CObjPaintView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call
CView::OnLButtonDown(nFlags, point);
}
1.3 Bổ sung xử lý cho sự kiện WM_LBUTTONDOWN.
Dữ kiện ban đầu: Trong hướng dẫn Phần 2, chúng ta đã có được một đối tượng CLine m_ln1 được lưu trữ trong lớp CObjPaintDoc.
Giả định: Khi nhấn chuột, chúng ta sẽ thay đổi tọa độ bắt đầu của đối tượng CLine m_ln1 trong lớp CObjPaintDoc và để cập nhật hình vẽ thì gọi hàm cập nhật vùng CLIENT.
///////////////////////////////////////////////////////////////////////// CObjPaintView message handlers
void CObjPaintView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call}
//Khoi gan gia tri bat dau cua LINE
GetDocument()->m_ln1.m_pt1.x = point.x;
GetDocument()->m_ln1.m_pt1.y = point.y;
//Goi cap nhat vung CLIENT ==> MFC tu dong goi ham OnDraw
Invalidate();
CView::OnLButtonDown(nFlags, point);
Như vậy, sau khi thêm các lệnh cho sự kiện click chuột, chương trình cuối cùng đã có thể vẽ đối tượng linh động một phần (PT1 trong LINE). Để đối tượng LINE linh động hoàn toàn theo thao tác vẽ, cần phải xử lý tiếp sự kiện WM_LBUTTONUP.
WM_LBUTTONUP sẽ xác định điểm PT2 của Line để có một đối tượng LINE hoàn toàn linh hoạt.
Hình 1.4: Hàm xử lý sự kiện WM_LBUTTONDOWN
2. Chặn sự kiện chuột WM_LBUTTONUP trên vùng Client
Tiếp trục thực hiện chặn sự kiện chuột WM_LBUTTONUP thao các bước tiến hành như phần 1.
Giả định: Khi nhấn chuột, chúng ta sẽ thay đổi tọa độ bắt đầu của đối tượng CLine m_ln1 trong lớp CObjPaintDoc và để cập nhật hình vẽ thì gọi hàm cập nhật vùng CLIENT.
///////////////////////////////////////////////////////////////////////// CObjPaintView message handlers
void CObjPaintView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call}
//Khoi gan gia tri ket thuc cua LINE
GetDocument()->m_ln1.m_pt2.x = point.x;
GetDocument()->m_ln1.m_pt2.y = point.y;
//Goi cap nhat vung CLIENT ==> MFC tu dong goi ham OnDraw
Invalidate();
CView:: OnLButtonUp (nFlags, point);
No comments:
Post a Comment