gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:02:06 25 4
gpt4 key购买 nike

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

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);
}

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

关于c++ - 预处理器宏自动生成窗口消息循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11152567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com