2008-10-14 32 views
5

Tôi đã chỉ tự hỏi những gì (nếu có) sự khác biệt là giữa hai bẫy tin nhắn sau đây trong MFC cho chức năng, OnSize (..).Thông báo bẫy trong MFC - Whats sự khác biệt?

1 - Qua tin nhắn bản đồ:

BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd) 
... 
    ON_WM_SIZE() 
.. 
END_MESSAGE_MAP() 

2 - Qua afx_message:

afx_msg type OnSize(...); 

Họ dường như được sử dụng thay thế cho nhau, cái nào nên được sử dụng hay không nó phụ thuộc vào các yếu tố khác?

Trả lời

12

Cả hai phần là cần thiết để thêm trình xử lý tin nhắn vào một lớp. Bản đồ thư phải được khai báo bên trong lớp của bạn, cùng với các khai báo cho bất kỳ hàm xử lý thư nào (ví dụ: OnSize).

class CClassWnd : public CBaseClassWnd { 
    ... 
    afx_msg void OnSize(UINT nType, int cx, int cy); 
    DECLARE_MESSAGE_MAP 
}; 

afx_msg chỉ là macro giữ chỗ trống - không thực sự làm bất kỳ điều gì, nhưng luôn được bao gồm theo quy ước.

Bản đồ thông điệp sau đó được xác định trong tập tin cpp của lớp:

BEGIN_MESSAGE_MAP(CClassWnd, CBaseClassWnd) 
    ON_WM_SIZE() 
END_MESSAGE_MAP() 

Những macro tạo ra một bảng tra cứu cho các lớp cho phép các thông điệp nhận được cửa sổ để được cử đến các chức năng xử lý tương ứng. Macro ON_WM_SIZE cho phép thông số wParamlParam tin nhắn trong thông báo WM_SIZE được giải mã thành các giá trị có ý nghĩa hơn cho hàm xử lý thông báo (nType, cxcy trong trường hợp này). MFC cung cấp macro cho hầu hết các thông báo cửa sổ (WM_LBUTTONDOWN, WM_DESTROY, v.v ...).

Bạn có thể tìm thêm thông tin về cách bản đồ thông báo hoạt động trong MFC here trên MSDN.

3

afx_msg chỉ là một macro trống, về cơ bản chỉ ở đó để biểu thị rằng phương thức là trình xử lý tin nhắn MFC cho mục đích dễ đọc. Ngay cả với afx_msg ở đó bạn vẫn cần phải có một mục trong bản đồ thông báo.

+0

Rất vui khi biết điều đó, điều mà tôi đã tự hỏi trong một thời gian. Có lẽ tôi chỉ có quá nhiều thời gian trên tay mình ...;) –

0

Một số thông báo Windows đã được xử lý bởi MFC, vì vậy trong những trường hợp này, bạn có thể lấy đi chỉ bằng cách thêm phương thức vào lớp dẫn xuất của bạn.

Ví dụ lớp CWnd (như làm nhiều lớp MFC khác) đã ánh xạ một vài thông điệp của Windows vào đó là bản đồ thông báo (ví dụ: ON_WM_DRAWITEM, ON_WM_MEASUREITEM, ON_WM_ENTERIDLE vv, vv).

Nhưng mọi thư khác chưa được ánh xạ bởi MFC sẽ cần phải có cả phương thức lớp và mục nhập trong bản đồ thư để nó hoạt động.

Các vấn đề liên quan