- ベストアンサー
ダイアログのチェックボックスについて
はじめまして pioと申します。 プログラミングは、素人なので表現力に欠けると思いますが よろしくお願いします。 ---------------------------------------------------- リソースでダイアログを作り、 チェックボックスをつけました。 チェックボックスの数が4つまでは、正常に動作しています。 ところが 5つ目を作成後 5つ目が動作しません。 5つ目というのは、ソースの上から順番に数えて5つ目という意味です。 ソースに書く順番を変えると4つ目までは どのチェックボックスも正常に動きます。 ダイアログに使えるチェックボックスの数は、決まっているのでしょうか。 また、このような経験がある方がいらっしゃいましたらアドバイスいただけると幸いです。 以上、よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
hdialog = GetParent(hDiaog); はおかしいと思われます。 以降のhCheck_1 = GetDlgItem(hdialog, IDC_CHECK_1);は hCheck_1 = GetDlgItem(hDiaog, IDC_CHECK_1); でないと正常な値が取得できないと思われます。 ハンドルが間違えているので正常に取得できていないだけではないでしょうか? >ダイアログに使えるチェックボックスの数は、決まっているのでしょうか。 OSのリソースがなくならない限りは無限に使えます。 >チェックボックスの数が4つまでは、正常に動作しています。 >ところが 5つ目を作成後 5つ目が動作しません。 4つまでの時と5つ以降の時とではチェックボックスを追加した以外の修正はしていませんか?
その他の回答 (3)
- linus1974
- ベストアンサー率19% (71/370)
ちょっと補足します。 VC++ですよね?ということは、グローバル 変数でなくて、メンバ変数かもしれないです。 そのあたりも明確にしていただけると わかるかもしれません。
お礼
linus1974さん、keibou21さん どうもありがとうございました。 恥ずかしいことに、途中でreternしていました。
- linus1974
- ベストアンサー率19% (71/370)
>ダイアログが呼び出されて、チェックをつけた場合 >変数にその状態が、入力される。 >したがって、ダイアログを閉じて、再度ダイアログを開いたときには >その前の状態が、有効になっているはずなのですが、 >5番目だけがチェックをして、ダイアログを閉じて、再度ダイアログを開いても、その前の状態が表現され >せん。 すみません、全然意味がわかりません。 まず外部仕様を明確にしていただけませんか? 変数がどうとか言うのは内部の問題ですよね。 外部仕様が明らかにならないと、 何が問題なのかよくわかりません。 親画面にチェックボックスがあって、 ボタンを押すとダイアログ(子画面)が 開き、それに応じた情報が表示されるのですか? それからメソッドの変数の意味が 書いてないと理解できません。 どれがグローバル変数なのですか?その役割は?
補足
レスありがとうございます。 独学でほとんど、知識が無くメソッドという言葉がわからなく、 ネットを見て調べていましたが、短時間で理解できるわけもなく 外部仕様だけ補足させていただきます。 (私の頭の中には、グローバルかローカルの変数しかありません^^;) メインウィンドウにボタンがありまして、それを押すとダイアログが開きます。 ダイアログは、いろいろな初期設定を入力するために用意しました。 (初期設定なので、この値を使って他の関数で計算したりしますが、 この値自体は、どの窓にも表示しません。 値として、殆どをグローバル変数に格納します。また外部ファイルに保存、読み込みの予定) チェックボックスは、その中のひとつです。 使い方は、 □音を鳴らす(チェックなしは、ならさない) □リストビューを表示しない(チェックなしは、表示) □このグループの設定を変更不可にする のような感じで使用します。 2択選択で、オンorオフをチェックボックスにて表現しようと考えております。 チェックを押したイベントが発生したときに、 このオン、オフの状態を変数にオンなら1,オフなら0という形で持たせます。 また、オン、オフの状態は、ほかの関数で状態を知りたいのでグローバルで宣言しています。 グローバル変数は→dwCheck_1~dwCheck_5 //リソース 書くチェックボックス(コモンコントロール)のID #define IDC_CHECK_1 1001 #define IDC_CHECK_2 1002 #define IDC_CHECK_3 1003 #define IDC_CHECK_4 1004 #define IDC_CHECK_5 1005 //グローバル変数(他省略) DWORD dwCheck_1,dwCheck_2,dwCheck_3,dwCheck_4,dwCheck_5; //メインウィンドウからメインウィンドウプロシージャまで省略 //なおメインウィンドウプロシージャでダイアログを開くボタンが押された //イベントが発生したときに、下記のダイアログを処理するプロシージャを呼びます。 CALLBACK MyDlgProc(HWND hDiaog, UINT msg, WPARAM wp, LPARAM lp) static HWND hCheck_1,...,hCheck_5; switch (msg) { case WM_INITDIALOG: hdialog = GetParent(hDiaog); //チェックボックスのハンドル取得 hCheck_1 = GetDlgItem(hDiaog, IDC_CHECK_1); ~ hCheck_5 = GetDlgItem(hDiaog, IDC_CHECK_5); //ダイアログを開いたとき、各項目にチェックの状態を入れる。 if (dwCheck_1 == 1)Button_SetCheck(hCheck_1, BST_CHECKED); else Button_SetCheck(hCheck_1, BST_UNCHECKED); 途中3つ省略させていただきます。 if (dwCheck_5 == 1)Button_SetCheck(hCheck_5, BST_CHECKED); else Button_SetCheck(hCheck_5, BST_UNCHECKED); case WM_COMMAND: switch (LOWORD(wp)) { case IDC_CHECK_1: if (Button_GetCheck(hCheck_1) == BST_CHECKED) dwCheck_1 = 1; else dwCheck_1 = 0; } InvalidateRect(hMain, NULL, TRUE); return TRUE; 途中3つ省略させていただきます。 case IDC_CHECK_5: if (Button_GetCheck(hCheck_5) == BST_CHECKED) dwCheck_5 = 1; else dwCheck_5 = 0; InvalidateRect(hMain, NULL, TRUE); return TRUE; 以後省略 昔作ったDosプログラムの窓バージョンを作成しようと思っています。 今の段階は、まだ、外観を作っている段階で、 ボタンが押された、文字が入力されたなどといった、イベントが発生したときに、その値を格納するといった事を書いているところです。
- linus1974
- ベストアンサー率19% (71/370)
たぶんこの表現でわかる人はいないと 思われます。 ・正常に動作するとは、具体的には どういうことでしょうか? チェックボックスでチェックして ボタンを押したりするんですよね? そのイベントメソッドの中身を出せるなら 出したほうが回答が得られやすいと思います。
補足
こんばんは linus1974さん はじめまして、回答ありがとうございます。 ごめんなさい おっしゃるとおりです。 >>・正常に動作するとは、具体的には >>どういうことでしょうか? ダイアログが呼び出されて、チェックをつけた場合 変数にその状態が、入力される。 したがって、ダイアログを閉じて、再度ダイアログを開いたときには その前の状態が、有効になっているはずなのですが、 5番目だけがチェックをして、ダイアログを閉じて、再度ダイアログを開いても、その前の状態が表現されません。 また、初期状態にチェックを入れる状態にしても(変数=1)チェックされていません。 変数に値が格納されてないのか、5番目のみ機能していないのか。 行っている処理は、グローバルで変数を用意して。 チェックが入っていればその値を1,無ければ0という形にしています。 また、ボタンを押して全情報を取得じゃなくて,チェックが入ればすぐに、その情報が格納できるようになっております。 ダイアログを処理している関数を下記に表記します (必要箇所以外は 省いています。) タブが無効のようでインデントできなくて申し訳ないです。 CALLBACK MyDlgProc(HWND hDiaog, UINT msg, WPARAM wp, LPARAM lp) switch (msg) { case WM_INITDIALOG: hdialog = GetParent(hDiaog); hCheck_1 = GetDlgItem(hdialog, IDC_CHECK_1); hCheck_2 = GetDlgItem(hdialog, IDC_CHECK_2); hCheck_3 = GetDlgItem(hdialog, IDC_CHECK_3); hCheck_4 = GetDlgItem(hdialog, IDC_CHECK_4); hCheck_5 = GetDlgItem(hdialog, IDC_CHECK_5); if (dwCheck_1 == 1) Button_SetCheck(hCheck_1, BST_CHECKED); else Button_SetCheck(hCheck_1, BST_UNCHECKED); 途中3つ省略させていただきます。 if (dwCheck_5 == 1) Button_SetCheck(hCheck_5, BST_CHECKED); else Button_SetCheck(hCheck_5, BST_UNCHECKED); case WM_COMMAND: switch (LOWORD(wp)) { case IDC_CHECK_1: if (Button_GetCheck(hCheck_1) == BST_CHECKED) { dwCheck_1 = 1; } else { dwCheck_1 = 0; } InvalidateRect(hMain, NULL, TRUE); return TRUE; 途中3つ省略させていただきます。 case IDC_CHECK_5: if (Button_GetCheck(hCheck_5) == BST_CHECKED) { dwCheck_5 = 1; } else { dwCheck_5 = 0; } InvalidateRect(hMain, NULL, TRUE); return TRUE; 以後省略
補足
keibou21さん レスありがとうございます。 申し訳ありません。記入ミスです。 >>ダイアログに使えるチェックボックスの数は、決まっているのでしょうか。 >OSのリソースがなくならない限りは無限に使えます。 なるほど、私の書き方が 悪いのですね^^; >>チェックボックスの数が4つまでは、正常に動作しています。 >>ところが 5つ目を作成後 5つ目が動作しません。 >4つまでの時と5つ以降の時とではチェックボックスを追加した以外の修正はしていませんか? コピーアンドペーストで、変数のみ入力しなおした。 他の動作は、書いておりません。 ダイアログを作成するイベント、 case WM_INITDIALOG: 以下にハンドルを取得後、チェックボックスの状態を設定していますが ここに書いている4つ目までは、 私の期待通り→チェックをした状態でダイアログを閉じて、 再度ダイアログを表示したときに、その前に閉じた状態が復元されますが 5番目だけがチェックをつけて閉じても、再度開いたときはチェックが外れています。 また、初期状態でチェックを入れる様にしても、チェックが外れています。 ためしに、5番目に書いたものを一番に書き、1番目を5番目に書いて処理される順番を変更すると、 今度は 1番はじめに持ってきたのは、動き5番目にもって行った物が 動きません。 明日 再度見直してみます。