【问题标题】:MFC: Notification after a control is createdMFC:创建控件后的通知
【发布时间】:2018-12-18 01:12:21
【问题描述】:

我是 MFC 的新手。我选择通过 VS2017 中的向导创建一个办公风格的 MFC 应用程序。我现在想扩展 CMFCShellTreeCtrl,所以我创建了另一个以它作为基类的类。基础没问题。我的问题是我想做类似的事情:

whatever MyClass::FuncitonCalledAfterControlCreated(...)
{
  SetFlags(GetFlags() | SHCONTF_NONFOLDERS);
  ModifyStyle(0x0, TVS_CHECKBOXES);
}

但是我无法确定要覆盖的虚拟功能,或者我应该执行其中一项消息映射操作吗?我猜想不管它是什么,它对所有控件都是通用的?无论如何,合适的功能是什么?

TIA!!

【问题讨论】:

标签: mfc controls


【解决方案1】:

如果控件源自CWnd,则发出WM_CREATE,可以通过以下消息映射将其定向到控件:

ON_WM_CREATE()

和成员函数:

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

如果在对话框资源上,WM_CREATE 将不会发生。有人说您可以使用PreSubClassWindow,但在测试Create() 的情况下,该调用在CreateWindowEx 调用之前出现,因此不适用于设置TVS_CHECKBOX 样式。我没有尝试使用带有树控件的 CDialog 并检查调用堆栈。

【讨论】:

  • 创建控件之后不会发送WM_CREATE 消息。它在创建控件的过程中发送。来自文档:“消息在 [CreateWindowEx 或 CreateWindow] 返回之前发送。”.
  • "新窗口的窗口过程在窗口创建后、窗口变为可见之前收到此消息。"
  • 这 - 不幸的是 - 不完全正确:“如果应用程序返回 –1,则窗口被销毁,CreateWindowEx 或 CreateWindow 函数返回 NULL 句柄。” 不管这些细节如何,为了您的特定需求,WM_CREATE 处理程序是设置TVS_CHECKBOX 样式的合适位置。更深入的解释见The TVS_CHECKBOXES style is quirky, which is a polite way of saying that it is crazy。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 2015-05-27
相关资源
最近更新 更多