我想要这样的东西:
class Foo {
private:
int bar;
public:
void setBar(int bar);
int getBar() const;
}
class MyDialog : public CDialogImpl<MyDialog> {
BEGIN_MODEL_MAPPING()
MAP_INT_EDITOR(m_editBar, m_model, getBar, setBar);
END_MODEL_MAPPING()
// other methods and message map
private:
Foo * m_model;
CEdit m_editBar;
}
另外,如果我可以提供我的自定义验证,那就太好了:
MAP_VALIDATED_INT_EDITOR(m_editBar, m_model, getBar, setBar, validateBar)
...
bool validateBar (int value) {
// custom validation
}
有人见过这样的东西吗?
附言我不喜欢 DDX,因为它很旧而且不灵活,而且我不能使用 getter 和 setter。
最佳答案
DDX 映射只是一系列if
语句,因此您可以轻松编写自己的DDX 宏。
#define DDX_MAP_VALIDATED_INT_EDITOR(control, variable, getter, setter, validator)\
if(nCtlID==control.GetDlgCtrlID())\
{\
if(bSaveAndValidate)\
{\
int const value=control.GetDlgItemInt();\
if(validator(value))\
{\
variable->setter(value);\
}\
else\
{\
return false;\
}\
}\
else\
{\
control.SetDlgItemInt(variable->getter());\
}\
}
这是未经测试的,但如果您将它放在 DDX 映射中,则应该按照您的示例工作。它应该给你这个想法。当然,您可以将其提取到一个函数中,这就是标准 DDX 宏所做的:它们只是执行外部 if
,然后调用一个函数。这将允许您为不同类型的变量
(例如指针与引用/值)重载函数
关于c++ - 将对象属性绑定(bind)到 WTL 控件的框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/116154/