電子書籍の厳選無料作品が豊富!

win32、VC++2005で開発しております。

resource.h内の#defineで切ってあるIDの番号が重なっていたため
各コントロールの色を変更しようとすると同時に他のコントロールの色も変化してしまいました。

かなりのコントロール量だったのでExcelで開いて一気にインクリメントして再ロードするとコントロールの色が散らばってしまいました・・・

この方法はまずかったでしょうか?
色の変更は
case WM_CTLCOLORSTATIC :
i = GetWindowLong( (HWND)lParam, GWL_ID );
hdc = BeginPaint(hDlg, &ps);
if ( i == IDC_ICHI_S ) { //位置出し
SetTextColor( (HDC)wParam, RGB( 255, 255, 255 ) );
SetBkColor( (HDC)wParam, RGB( 0, 0, 255 ) );
return (LRESULT)CreateSolidBrush( RGB( 0, 0, 255 ));
}
if ( i == IDC_NIN_S ) { //任意(未知)の器械点セット
SetTextColor( (HDC)wParam, RGB( 255, 255, 255 ) );
SetBkColor( (HDC)wParam, RGB( 0, 128, 0 ) );
return (LRESULT)CreateSolidBrush( RGB( 0, 128, 0 ));
}
EndPaint(hDlg, &ps);
こんな感じでやってます。

resource.hのID名は変更してませんのでダイアログはちゃんと開きます。
resource.hの#defineの値は自動で割り振られたと思いますが、ダイアログ画面を複数書いて値が重複するのは変だと思いますがどうなんですか?
また、見やすいように各画面ごとにIDを束ねようとしてるのですが普通なことでしょうか?
プログラムコーディングの基準?常識?がよくわからないのでお願いします。
コントロールも膨大になってきて見ずらいです。
通常はどのように見やすくするのでしょうか?
プログラム初心者なので分かり易い指摘でお願いします。

A 回答 (1件)

★アドバイス


・致命的な間違いを指摘します。
 WM_CTLCOLORSTATIC 内で BeginPaint、EndPaint は使ってはいけません。
 その代わりに wParam を HDC にキャストすればデバイスコンテキストの
 ハンドルがもらえます。分かっていますよね。
 それなのに BeginPaint、EndPaint を記述しているのはおかしいです。
>ダイアログ画面を複数書いて値が重複するのは変だと思いますがどうなんですか?
 ↑
 思いません。
 ダイアログAでボタン1があった場合 IDC_BUTTON1 を使います。
 ダイアログBでもボタン1があった場合 IDC_BUTTON1 を使います。
 IDC_BUTTON1 がダイアログで重複していても問題ないですし、変とも思いません。
 ただし、タブコントロールなどに使うダイアログをコントロールとした場合は
 各画面ごとに ID を束ねるようにしたり、重複しないようにします。
 これはタブコントロールやプロパティシートのダイアログ・プロシージャを
 1つに共通化したいために重複をしないためです。
 (あまりにもコントロールの数が多い場合はダイアログ毎にプロシージャを用意します)
・リソースIDの値を変更した場合はリビルドしないといけません。
 上手くリビルドできない場合は *.obj、*.exe などのファイルを削除してから
 ビルド(コンパイル)を行います。ファイルを複数に分割している場合はこのようにします。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

ほとんどが何処かのサイトから参考にして書いたのですが、
確かにHDCにキャストしてあるのにおかしいですね。

リビルドすればうまく行きました。

> (あまりにもコントロールの数が多い場合はダイアログ毎にプロシージャを用意します)
プロシージャを分ける場合はファイルも別にするのが普通なんですか?
別にしないと結局コードが長くて見ずらいですよね?

お礼日時:2008/09/18 22:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!