初めまして、たかおかと申します。
VCでSDIアプリを作成しております。
メニュのボタンを押すと、ダイアログが順番に表示され各種設定をする仕様です。
(市販アプリのインストール時のように、「次へ」ボタンで設定するイメージです。)
あるダイアログで「1」が選択された場合は、次のダイアログでエディットボックス「A」「B」
を表示させ、「2」が選択された場合はエディット「A」を表示し「B」を非表示にしたいと思っ
ております。
EnableWindow(FALSE)を呼んだところ、ビルドはOKで実行時にエラーになりました。
以下は簡略化したコードです。
CInitDialog cid;
int iRet;
if(param == 2)
{
cid.GetDlgItem(IDC_EDIT2)->EnableWindow(FALSE);
}
iRet = cid.DoModal();
エディットボックスを非表示(または入力不可能)にする方法をご教示お願い致します。
できれば、コードを書く場所も教えてください。
環境
Windows2000
VisualC++6.0
MFC利用
宜しくお願い致します。
CInitDialogのOnInitDialog()で
GetDlgItem(IDC_EDIT2)->ShowWindow(SW_HIDE);
か
GetDlgItem(IDC_EDIT2)->EnableWindow(FALSE);
でいけると思います
ご参考までに
コンポーネトギャラリは使えますか?
Visual C++ Componentsの中にプロパティシートというのがあり
これのWizardが使えるかもしれません
DoModalする前にcid.GetDlgItem(IDC_EDIT2)->EnableWindow(FALSE);を呼んでも
エディットコントロールはおろかダイアログボックスすら表示されていないのですから
制御できません。
EnableWindowはウインドウとして表示された以降でないと使用できません。
表示前に状態を変えたいのであれば、EnableWindowではなくて
エディットボックスのウインドウスタイルを変更しないと駄目だと思います。
基本的にダイアログ内のコントロールを制御するのはダイアログに任せた方が
構成としてもすっきりすると思います。
ダイアログにモードを保持するメンバー変数でも作成して外部からはこれを設定するだけ
にし、
ダイアログのOnInitDialogでGetDlgItem(IDC_EDIT2)->EnableWindow(FALSE);する方が
いいのではないかと思います。
CDialog::OnInitDialogが呼び出された後であれば、コントロールの制御も可能です。
舌足らずだったので少し追加。
ダイアログのOnInitDialogでメンバー変数を参照してエディットボックスを無効にする
モードであれば、GetDlgItem(IDC_EDIT2)->EnableWindow(FALSE);する方がいいのでは
ないかと思います。
ご回答有難う御座いました。
OnInitDialog()を作成し、教えて頂いた二つの関数で非表示にすることができました。
GetDlgItem(IDC_EDIT2)->ShowWindow(SW_HIDE); // エディットそのものを非表示
GetDlgItem(IDC_EDIT2)->EnableWindow(FALSE); // エディットが灰色で入力不可
エディットボックスは数個あるので、ご指摘いただいたように
ダイアログのモードを保持するメンバ変数を作成して柔軟に対応できるようにしたいと思いま
す。
>DoModalする前にcid.GetDlgItem(IDC_EDIT2)->EnableWindow(FALSE);を呼んでも
>エディットコントロールはおろかダイアログボックスすら表示されていないのですから
>制御できません。
>EnableWindowはウインドウとして表示された以降でないと使用できません。
勉強になりました。詳しい解説有難う御座いました。