首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >预处理器宏自动生成窗口消息循环

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

Stack Overflow用户
提问于 2012-06-22 16:19:45
回答 1查看 139关注 0票数 0

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

代码语言:javascript
运行
复制
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));
    }
}

下面是所有有效事件的示例;

代码语言:javascript
运行
复制
// 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()处理每一条消息,即使它没有定义,这真的是一个糟糕的想法,所以我正在寻找一个简单的替代方案,它不会因为不断地添加/删除事件定义而对用户造成繁重。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-22 17:04:45

使用标准预处理器不可能做你想做的事情,但是根据Bo Persson的评论,你可以这样做:

代码语言:javascript
运行
复制
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);
}

它需要一些错误检查-如果没有定义消息处理程序,则Dispatch调用将失败。此外,您可能会将模板类移动到#define中,但这会使#define变得更大。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11152567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档