LastUpdate: 2019/06/05 23:45:31
void CGetDlgItemDlg::OnOK()
{
// TODO: この位置にその他の検証用のコードを追加してください
// CDialog::OnOK();
CWnd* pWnd = this->GetDlgItem(IDC_STATIC);
pWnd->SetWindowText("aiueo");
}
この例では、SetWindowText は、CWnd
クラスが使用可能なメソッドであるから良いが、コントロール固有な物になるとダウンキャストが必要となり、好ましくない。
また、ラベルはダイアログ上にあるわけだから、ダイアログ内のメンバーであかの如くアクセスできたらカッコいいじゃん。
リソースエディタで見ると確かにダイアログ上にラベルが存在しているが、ダイアログのヘッダファイルを見てもラベルのメンバー変数は存在しない。
どうも、ラベルとダイアログとは別々に管理されているように思われる。じゃあ不可能かというと、ダイアログクラス内にラベルを示すメンバー変数を持てば良い事になるらしい。
次に、ラベルをダイアログのメンバー変数として管理できるように改良してみましょう。
ラベルを選択→右クリック→プロパティーを開く
IDをディフォルトのものから任意の名称に変更する。
ラベルを選択→右クリック→ClassWizardを開く
[メンバ変数]タブを選択し、IDC_STATIC1に対する[変数の追加]を行なう。
「メンバ変数の追加」ダイアログ上で、メンバー変数名(m_Static1)、カテゴリ(コントロール=CStatic型のメンバ変数となる)を入力する
これで、ラベルに関連付けられた変数、m_Static1が設定されました。
ソース上で確認してみましょう。
ヘッダーには、CStatic型のm_Static1が追加されています。
一方、cppファイルでは、IDC_STATIC1とm_Static1の関連付けが行われています。
DoDataExchangeメソッドは、ダイアログのOnInitDialogメソッドの中から起動されています。つまりダイアログの初期化中にm_Static1の関連付けが行われています。
一方、m_Static1は、ラベル型のポインタでなく実体となっています。ここが不思議に思ったんです〜。
どうやら、CStatic型というのは、ラベルそのものを示すクラスではなく、ラベルの管理領域へアクセスする為のアダプタークラスの働きを示すもののようです。
きっとラベルのハンドルを内部で保持していて、SendMessageを行なうだけの働きと考えられます。アダプターであるなら、ポインタである必要はありませんねー。
この辺のシクミはMFCフレームワークに関する事なので、C++とは全く関係ない所なので、複雑怪奇であります。
これで、お膳立てはできましたので、冒頭のコーディングを次のように書き換えることができます。
void CGetDlgItemDlg::OnOK()
{
// TODO: この位置にその他の検証用のコードを追加してください
// CDialog::OnOK();
this->m_Static1.SetWindowText("aiueo");
}
きれいですね〜。
2004/06/01