1

私はこのようなものが欲しいです:

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
}

誰もこのようなものを見たことがありますか?

PS DDX は古くて柔軟性がなく、getter と setter を使用できないため、好きではありません。

4

2 に答える 2

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(たとえば、ポインターと参照/値)

于 2008-10-02T10:33:25.680 に答える
0

Cocoa Bindingsはまさにあなたが望むものを提供しますが、それらは Mac / Objective-C ワードでしか利用できません。GNUstepはその無料バージョンですが、C++ ではなく、Objective-C のままです。

ただし、独自のフレームワークの良いインスピレーションになるか、さらなる研究の良い出発点になる可能性があります。

于 2008-09-23T09:54:45.763 に答える