|
|||||
|
|||||
|
||||||
MFCではDDX/DDVという機能が用意されていますが、
WTLにも同様にDDX/DDV機能が用意されています。
ただし、MFCのそれとは少し使用方法が異なります。
WTLはDDX/DDV機能を実装するためにCWinDataExchangeクラステンプレートを用意しています。
|
![]() | DDX | |||||||||||||||||
|
DDX(dialog data exchange)とは、ダイアログ上のコントロールの初期化や、
コントロールとのデータのやりとりを単純化するための仕組みです。 ここで言う「コントロールの初期化」とは、コントロールのサブクラス化や、 ウィンドウハンドルをコントロールクラスに設定することを意味します。 また、「コントロールとのデータのやりとり」とは、指定した変数の値をコントロールに設定したり、 逆にコントロールから取得した値を指定した変数に代入することを意味します。 次に示すのは、WTLのDDXを使用する例です。 1 からエディットコントロールに入力した値までの総和を求めます。 (例えば10を入力した場合、1+2+3+・・・+10を計算します。) なお、入力値の上限は100とします。 ![]()
まず、リソースを作成します。ダイアログにエディットコントロールとボタンコントロールを配置し、 それぞれの[ID]と[Caption]を次のように設定します。 なお、エディットコントロールの[プロパティ]では[Number]を[True]に設定します。
次に、stdafx.hヘッダでは、DDX/DDVを使用するためにatlddx.hヘッダをインクルードします。 CSampleProjectDialogクラスでは、基底クラスにCWinDataExchangeを追加し、
CEditクラスのインスタンスと、int型の変数を、
CSampleProjectDialogクラスのメンバ変数として宣言します。
このint型変数は、エディットコントロールに入力された数値を保持するための変数であり、
CSampleProjectDialogクラスのコンストラクタで 1 に初期化します。CEditクラスのインスタンスはDDXマップのDDX_CONTROL_HANDLEマクロによって初期化されます。
DDX_CONTROL_HANDLEマクロは、
第1引数に渡されたIDのコントロールのウィンドウハンドルを、
第2引数に渡されたオブジェクトに代入します。WTLのDDXはコントロールの初期化用に次のようなマクロを用意しています。
なお、これらのマクロが実行される(つまりコントロールクラスのインスタンスが初期化される)のは、 コントロールクラスのインスタンスにNULLが設定されていて、 かつ DoDataExchange(FALSE)を呼び出した時だけです。
今回の例では、WM_INITDIALOGメッセージハンドラ内でDoDataExchange(FALSE)を呼び出して、
CEditクラスのインスタンスであるm_edit_inputにエディットコントロールのウィンドウハンドルを設定します。CSampleProjectDialogクラスのDDXマップではさらに、
DDX_INTマクロを使ってエディットコントロールとint型変数を関連付けます。
これにより、DoDataExchange(FALSE)を呼び出した時は自動的にSetDlgItemInt()を呼び出して変数の値をエディットコントロールに設定し、
DoDataExchange(TRUE)を呼び出した時は自動的にGetDlgItemInt()を呼び出してエディットコントロールに入力された数値を変数に代入します。
DoDataExchange()は値の取得または設定に成功したときはTRUEを返し、
失敗したときはFALSEを返します。WTLのDDXはコントロールと変数の関連付け用に次のようなマクロを用意しています。
なお、コントロールと変数の間でデータの取得または設定が失敗したときは、 CWinDataExchangeのメンバ関数であるOnDataExchangeError()が呼び出されます。
CSampleProjectDialogクラスではこのOnDataExchangeError()をオーバーライドして、
メッセージボックスを表示します。最後に、リソースIDが IDC_BUTTON_SUMのWM_COMMANDメッセージハンドラとしてOnButtonSum()を追加します。
このハンドラ関数では、入力された値をチェックし、
有効な値であれば 1 から入力された値までの総和を計算してメッセージボックスで表示します。
|
||||||||||||||||||
![]() | DDV | |||||||
|
DDV(dialog data validation)とは、
ダイアログ上のコントロールに入力されたデータの正当性をチェックするための仕組みです。 DDXの例では、エディットコントロールに入力された数値の範囲チェックを OnButtonSum()で次のように行いました。
DDVを使用すると、このような値のチェック処理を簡略化できます。 次に示すのは、前述のDDXを使用したプログラムで値のチェックにDDVを使用する例です。
まず、DDXマップの DDX_INTマクロを、DDX_INT_RANGEマクロに変更します。
このマクロの第1、第2引数はDDX_INTマクロと同様、コントロールのIDとint型変数を指定します。
第3引数には値の最小値を、第4引数には値の最大値を指定します。これにより、 DoDataExchange()を呼び出して
コントロールに値を設定したりコントロールから値を取得する時に、
その値の範囲チェックが行われます。
正当な値のときは、DoDataExchange()はTRUEを返します。
不正な値のときはFALSEを返します。WTLは次のようなDDV機能付きDDXマクロを用意しています。
DDVによって値が不正であると判断された場合は、 CWinDataExchangeのメンバ関数であるOnDataValidateError()が呼び出されます。
CSampleProjectDialogクラスではこのOnDataValidateError()をオーバーライドして、
メッセージボックスを表示します。最後に、 OnButtonSum()から不要となった数値の範囲チェック処理を削除します。
|
||||||||