C++ 预处理器宏自动生成窗口消息循环

C++ 预处理器宏自动生成窗口消息循环,c++,winapi,c-preprocessor,C++,Winapi,C Preprocessor,我的项目设置中有一个窗口的构造函数,它看起来像这样。我的项目中有很多窗口,我不断地添加或删除一些东西 LRESULT CPicture::Msg(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { HANDLE_MSG(hWnd, WM_CREATE, OnCreate); HANDLE_MSG(hWnd, WM_PAINT, OnPaint);

我的项目设置中有一个窗口的构造函数,它看起来像这样。我的项目中有很多窗口,我不断地添加或删除一些东西

LRESULT CPicture::Msg(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    { 
        HANDLE_MSG(hWnd, WM_CREATE, OnCreate);
        HANDLE_MSG(hWnd, WM_PAINT, OnPaint);
        HANDLE_MSG(hWnd, WM_SIZE, OnSize);
        HANDLE_MSG(hWnd, WM_CLOSE, OnDestroy);

        default:
            return (DefWindowProc(hWnd, uMsg, wParam, lParam));
    }
}
以下是所有有效事件的示例

// Csx / Dsx
virtual BOOL OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct) {return FALSE;};
virtual void OnDestroy(HWND hWnd){};

// Painting
virtual void OnPaint(HWND hWnd){};
virtual BOOL OnEraseBkgnd(HWND hWnd, HDC hDC) {return FALSE;};

// Movement / Sizing
virtual void OnMove(HWND hWnd, int x, int y) {};
virtual void OnSize(HWND hWnd, UINT state, int nWidth, int nHeight){};
virtual void OnGetMinMaxInfo(HWND hWnd, LPMINMAXINFO lpMinMaxInfo){};

// Focus
virtual void OnSetFocus(HWND hWnd, HWND hWndOldFocus){};
virtual void OnKillFocus(HWND hWnd, HWND hWndNewFocus){};
。。。还有更多。是否可以使用预处理器宏来检测这些函数中的一个在子类中何时被重写,并自动将其处理程序添加到消息循环中


有人告诉我,我的
Msg()
即使没有定义也要处理每一条消息,这是一个非常糟糕的主意,因此我正在寻找一个简单的替代方案,用户不需要频繁地添加/删除事件定义。

使用标准预处理器不可能完全实现您想要的操作,但是按照Bo Persson的评论,你可以这样做:

class MessageHandler
{
public:
  virtual void Handle () = 0;
  static void Dispatch (int i) { m_messages [i]->Handle (); }
protected:
  MessageHandler (int i) { m_messages [i] = this; }
private:
  static map <int, MessageHandler *> m_messages;
};

map <int, MessageHandler *> MessageHandler::m_messages;

template <int i>
class MessageHandlerInstance : MessageHandler
{
protected:
  MessageHandlerInstance () : MessageHandler (i) { }
};

#define Handler(name,i) class name : public MessageHandlerInstance <i> { void Handle (); } name##Instance;

// these are the actual handlers for the messages
Handler (Msg1, 1);
void Msg1::Handle () { cout << "Msg1" << endl; }

Handler (Msg2, 2);
void Msg2::Handle () { cout << "Msg2" << endl; }

Handler (Msg3, 3);
void Msg3::Handle () { cout << "Msg3" << endl; }


int main ()
{
  // and this is how they're called
  MessageHandler::Dispatch (1);
  MessageHandler::Dispatch (2);
  MessageHandler::Dispatch (3);
}
class消息处理程序
{
公众:
虚空句柄()=0;
静态无效分派(inti){m_消息[i]>Handle();}
受保护的:
MessageHandler(inti){m_messages[i]=this;}
私人:
静态映射消息;
};
MapMessageHandler::m_消息;
模板
类MessageHandlerInstance:MessageHandler
{
受保护的:
MessageHandlerInstance():MessageHandler(i){}
};
#定义处理程序(名称,i)类名:publicmessageHandlerInstance{void Handle();}name##Instance;
//这些是消息的实际处理程序
处理器(Msg1,1);

使用McG1::(使用C++)CUT(CUT),不使用公共基类和虚拟函数是一个明显的主意吗?好的答案是完美的。你能建议我确定消息处理程序的最佳方法吗?可以使用向量代替数组吗?@ KvBeldEnnnCK:它使用了一个STD::MAP,所以你可以使用STD::MAP::find代替[]。并更改Dispatch方法,以返回找到/未找到的消息处理程序(或不传递给父级/传递给父级)的true/false。