【发布时间】:2017-01-18 14:09:24
【问题描述】:
我第一次尝试创建子类控件,但我觉得我做错了什么。该控件是一个Button,我放置在设计器中。这是它的类:
class TTTField : public CButton
{
public:
BEGIN_MSG_MAP_EX(TTTField)
MSG_WM_INITDIALOG(OnInitDialog);
END_MSG_MAP()
TTTField operator=(const CWindow& btn);
private:
const BOOL OnInitDialog(const CWindow wndFocus, const LPARAM lInitParam);
};
到目前为止没有什么特别的。
但是,我无法真正实现在此控件中接收 Windows 消息。这很糟糕,考虑到尝试对控件进行子类化的主要原因是它应该是一个具有可重用、自定义 Paint 行为的可重用类。我想覆盖某些消息处理程序,同时保留那些我没有明确要求的常规 CButton 例程。
如您所见,我实现了一个消息映射,但消息没有进来。
这就是我尝试设置此类实例的方式:
TTTField fld;
是我的主对话框类的成员变量。在这堂课中,我添加了以下 DDX_MAP:
BEGIN_DDX_MAP(TTTMainDialog)
DDX_CONTROL_HANDLE(IDC_BTN, fld)
END_DDX_MAP()
IDC_BTN 是设计器上按钮的 ID。
在 TTTField 的赋值运算符重载中,我有以下内容:
TTTField TTTField::operator=(const CWindow& btn)
{
Attach(btn);
return *this;
}
我觉得这种运算符重载可能是我的问题的根源,但我就是无法找到一个正确解释整个主题的网站,而不使用似乎已经过时 20 年的代码。
我在这里做错了什么?我现在真的迷路了。
【问题讨论】:
-
我很好奇,您从哪里读到表明按钮会收到
WM_INITDIALOG消息的信息?WM_NCCREATE和WM_CREATE消息,当然。但是用于对话的消息?嗯嗯嗯。除非我弄错了,否则在 CodeProject 上有无数关于 CButton 类的子类化的文章。 (我没有 MFC - 我更喜欢光着背) -
@enhzflep 是的,关于消息的事情是真的。我只是将其更改为 WM_CREATE 但仍然没有得到任何东西
-
你看过CP的东西吗?这是我从谷歌搜索“CButton CodeProject”codeproject.com/Articles/1911/CButton-with-icon 中找到的第一个 - 请注意提到在 VS2010 中将 VC6 中的返回值从 UINT 更改为 LRESULT 的评论
-
@Sossenbinder 有点跑题了,那是你头像上的柴犬吗?
-
@enhzflep:尽管你的 cmets 在
WM_INITDIALOG,但这不是 MFC。它是 WTL,就 "bare-back" 而言,生成的代码几乎就是这样。 (你不能从代码中真正看出这一点,因为它是错误的。不过,正确的代码会泄露它。请参阅答案。)