将对象属性绑定到WTL控件的框架
时间:2020-03-06 14:33:06 来源:igfitidea点击:
我想要这样的东西:
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。
解决方案
可可绑定完全提供我们想要的内容,但是仅在Mac / Objective-C语言中可用。 GNUstep是它的免费版本,但它仍然是Objective-C,而不是C ++。
但是,这可能对自己的框架有很好的启发,也可能是进一步研究的良好起点。
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",然后调用函数。这将允许我们针对不同类型的"变量"重载函数(例如,指针与参考值/值)