【问题标题】:Splitting the main message map (BEGIN_MSG_MAP_EX) into two files将主消息映射 (BEGIN_MSG_MAP_EX) 拆分为两个文件
【发布时间】:2014-11-10 09:51:42
【问题描述】:

我正在试验 WTL,我想将一个大的消息映射分成两个或多个文件。例如,我想将托盘图标逻辑移动到一个单独的文件中。我知道CHAIN_MSG_MAPCHAIN_MSG_MAP_MEMBER,但是在这种情况下我应该使用什么?

另外,我如何才能从第二类访问窗口句柄?

【问题讨论】:

  • 查看代码后,我不确定我尝试实现的目标是否可行。是否可以有两个文件(可能有两个类),而两个文件都有一个 m_hWnd 成员,它指的是同一个窗口?
  • 可能的。但它仍然过于宽泛。
  • 好吧,以托盘图标为例。在WM_CREATE 上,我初始化NOTIFYICONDATA,调用Shell_NotifyIcon(NIM_ADD)。在"TaskbarCreated" 上,我重新创建了它。右键单击,我会显示一个菜单。等我可以将所有这些功能干净地移动到单独的文件中吗?我找到了这个类,它通过创建一个额外的窗口(不太优雅的 IMO)解决了这个任务:naughter.com/ntray.html
  • 我建议使用一个消息映射,但将处理程序划分为单独的文件,除非对消息映射也有特殊要求。

标签: winapi atl wtl


【解决方案1】:

您可能正在寻找类似的东西(未经测试;我的 WTL 相当生锈;警告购买者)。

class TrayIconHandler : public CWindow, public CMessageMap {
public:  
  BEGIN_MSG_MAP(TrayIconHandler)
  // Message handlers to taste
  END_MSG_MAP()
};

class MainWindow : public CWindowImpl<MainWindow> {
public:
  BEGIN_MSG_MAP(MainWindow)
    MESSAGE_HANDLER(WM_CREATE, OnCreate)
    // Other message handlers
    CHAIN_MSG_MAP_MEMBER(tray_icon_)
  END_MSG_MAP()

  LRESULT OnCreate(UINT, WPARAM, LPARAM, BOOL&) {
    tray_icon_.m_hWnd = m_hWnd;
  }
private:
  TrayIconHandler tray_icon_;
};

当然,这两个类可能位于不同的源文件和/或头文件中。

【讨论】:

    猜你喜欢
    • 2017-01-11
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    相关资源
    最近更新 更多