ON_BN_CLICKED调用非成员函数
ON_BN_CLICKED Call Non-Member Function
ON_BN_CLICKED
宏接受一个按钮 ID 和一个成员函数指针。单击按钮时调用成员函数。
我有一个成员函数,foo
,我把它的指针传递给了ON_BN_CLICKED
:
ON_BN_CLICKED(1485, &foo)
但是 foo
只是直接在 class 外部调用我的业务逻辑函数:
void presentation::foo() {
business->foo();
}
我想设置ON_BN_CLICKED
直接调用这个业务逻辑函数。这可能吗?
你可以,但我不鼓励。如果您正在考虑提高性能,编译器可能会优化额外的调用。如果你分解 ON_BN_CLICKED
宏,你会看到它最终成为 BEGIN_MESSAGE_MAP
...END_MESSAGE_MAP
数组中的一个数组条目,其中有 CCmdTarget
函数指针.所以,如果你的 business
class 是从 CCmdTarget
派生的,你可以避免一些转换问题并直接调用它。一种更简单的方法可能是让您自己的 WM_COMMAND
处理 and/or 不依赖于消息映射机制并执行您自己的 window 过程。但这同样是大量工作却收效甚微。
ON_BN_CLICKED
宏接受一个按钮 ID 和一个成员函数指针。单击按钮时调用成员函数。
我有一个成员函数,foo
,我把它的指针传递给了ON_BN_CLICKED
:
ON_BN_CLICKED(1485, &foo)
但是 foo
只是直接在 class 外部调用我的业务逻辑函数:
void presentation::foo() {
business->foo();
}
我想设置ON_BN_CLICKED
直接调用这个业务逻辑函数。这可能吗?
你可以,但我不鼓励。如果您正在考虑提高性能,编译器可能会优化额外的调用。如果你分解 ON_BN_CLICKED
宏,你会看到它最终成为 BEGIN_MESSAGE_MAP
...END_MESSAGE_MAP
数组中的一个数组条目,其中有 CCmdTarget
函数指针.所以,如果你的 business
class 是从 CCmdTarget
派生的,你可以避免一些转换问题并直接调用它。一种更简单的方法可能是让您自己的 WM_COMMAND
处理 and/or 不依赖于消息映射机制并执行您自己的 window 过程。但这同样是大量工作却收效甚微。