c++ - 将对象属性绑定(bind)到 WTL 控件的框架

标签 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
}

有人见过这样的东西吗?

附言我不喜欢 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/

相关文章:

c# - 如何将函数指针从 C# 传递到 C++ Dll?

c++ - 具有非默认构造函数的类,在一个类中 (C++)

c++ - 是否可以制作一个有形状的、alpha 混合的对话框?

c++ - std::pair 的哈希值,用于 unordered_map

带有参数死锁的 C++ CreateProcess

c++ - 为什么 CreatePointFont() 会为我返回 NULL?

c++ - 在 winapi、WTL 中使复选框的边框更细

winapi - PtInRect 与子窗口

c++ - 在导致 undefined symbol 错误的示例代码上使用 Boost 库?