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