現在ダイアログベースのプログラムを作っていますが。
ダイアログ上のコントロールを全てではないのですが、使用可にしたり不可にしたりした
いのです。C++Builder,delphi,VBなんかはControlsプロパティで取得できますがMFCでそ
のようなことは出来ないのでしょうか?
EnableWindow でできます。
もとい IsWindowEnabled です。
void C~Dlg::OnButton1()
{
CWnd *pCancel = GetDlgItem (IDCANCEL);
CWnd *pCtrl = GetTopWindow();
do {
if (pCtrl != pCancel) pCtrl->EnableWindow (FALSE);
} while (pCtrl = pCtrl->GetNextWindow());
}
上記のコードは、ダイアログ上のボタンを押すと
キャンセルボタン以外のコントロールが無効になるという物です。
参考になるでしょうか?
なんだか何を聞かれているのかわからなくなってきましたので、整理します。
コントロールのウィンドウハンドルを取得する。 GetDlgItem
コントロールを使用可にしたり不可にしたり…。 EnableWindow
コントロールが有効か無効か(使用可か不可か)知る。 IsWindowEnabled
ん?全てのコントロールのウィンドウハンドルを配列で取得したいんですよね?
> コントロールのウィンドウハンドルを取得する。 GetDlgItem
> コントロールを使用可にしたり不可にしたり…。 EnableWindow
> コントロールが有効か無効か(使用可か不可か)知る。 IsWindowEnabled
追加として
最初のコントロールのウィンドウハンドルを取得 GetTopWindow
次のコントロールのウィンドウハンドルを取得 GetNextWindow
ですかね。
>ん?全てのコントロールのウィンドウハンドルを配列で取得したいんですよね?
>ダイアログ上のコントロールを全てではないのですが、使用可にしたり不可にしたりした
とありますから、全てではないのでは?
> とありますから、全てではないのでは?
ん~~、言葉のあやですね(^^;
サンプルではそのつもりで、キャンセルボタン以外になっています。
もし、取得したいコントロールのIDが分かっているのなら
int nCtrl[] = {
IDC_EDIT1,
IDC_EDIT2,
IDC_BUTTON1,
};
等としておいて、
for (int i = 0; i < (sizeof (nCtrl) / sizeof (nCtrl[0])); i++) {
GetDlgItem (nCtrl[i])->EnableWindow (FALSE);
}
みたいな感じですかね。
しかし、「Controlsプロパティ」と聞いて連想したのが
コントロールの総なめだったので...。
>ん~~、言葉のあやですね(^^;
そのとおりですね。
「CDialog上に配置したコントロールを配列で取得したい」のタイトルからすれば、
「何らかの配列を使ってハンドルを取得する」とも、
「複数のハンドルを配列に取得する」とも取れるように思います。
前者はこじつけですけど。
>しかし、「Controlsプロパティ」と聞いて連想したのが
>コントロールの総なめだったので...。
私はコントロール配列っぽいもの?かと連想しました。
まあ、必要な情報はでそろった感じがしますし、
あとはKAZさんの反応を待つといったところでしょうか。
こんな短期間に一生懸命考えてくださりありがとうございました。
>キャンセルボタン以外のコントロールが無効になるという物です
というやつでまさに完璧でした。これなら下位クラスを派生させてもIDやコントロールの
変数を配列で持つ必要もなくエレガントです。
解決したというチェックを忘れていました。すいません。