MFC 訊息映射預設一個訊息對應一個處理函數。若需一個訊息觸發多個處理邏輯且保證順序,可採用 責任鏈模式:
// 抽象處理者
class IMessageHandler {
public:
virtual ~IMessageHandler() {}
virtual bool Handle(UINT msg, WPARAM wp, LPARAM lp) = 0;
void SetNext(IMessageHandler* next) { next_ = next; }
protected:
IMessageHandler* next_ = nullptr;
};
// 具體處理者
class DrawHandler : public IMessageHandler {
public:
bool Handle(UINT msg, WPARAM wp, LPARAM lp) override {
if (msg == WM_PAINT) { /* 繪圖邏輯 */ return true; }
return next_ ? next_->Handle(msg, wp, lp) : false;
}
};
class LogHandler : public IMessageHandler { ... }
// 視窗類別掛載鏈頭
class MyWnd : public CWnd {
IMessageHandler* chainHead_;
afx_msg LRESULT OnMyMessage(WPARAM wp, LPARAM lp) {
return chainHead_->Handle(WM_MY_MSG, wp, lp) ? 0 : DefWindowProc(...);
}
};
參考:責任鏈模式 C++ 實現。