Thursday, March 5, 2009

OOP: ObjPaint-03 - Xử Lý Sự Kiện Chuột

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


Hình 1.1: Gọi cửa sổ ClassWizard

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_LBUTTONDOWN
+ Để con trỏ chuột lên WM_LBUTTONDOWN, rồi nhấn button AddFunction, rồi nhấn button EditCode.
Hà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.


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
()


CODE2: Khai báo MACRO chặn xử lý sự kiên trong file implementation ObjPaintView.CPP.

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