将对象属性绑定到WTL控件的框架

时间:2008-09-22 17:10:16

标签: c++ wtl

我想有这样的事情:

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
}

有人见过这样的东西吗?

P.S。我不喜欢DDX,因为它很旧而且不灵活,我也不能使用getter和setter。

2 个答案:

答案 0 :(得分:2)

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然后调用一个函数。这将允许您为不同类型的variable重载函数(例如指针与引用/值)

答案 1 :(得分:0)

Cocoa Bindings提供了您想要的内容,但它们仅在Mac / Objective-C字中提供。 GNUstep是它的免费版本,但它仍然是Objective-C,而不是C ++。

然而,它可能是一个自己的框架的良好灵感,或进一步研究的良好起点。

相关问题