
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を束ねようとしてるのですが普通なことでしょうか?
プログラムコーディングの基準?常識?がよくわからないのでお願いします。
コントロールも膨大になってきて見ずらいです。
通常はどのように見やすくするのでしょうか?
プログラム初心者なので分かり易い指摘でお願いします。
No.1ベストアンサー
- 回答日時:
★アドバイス
・致命的な間違いを指摘します。
WM_CTLCOLORSTATIC 内で BeginPaint、EndPaint は使ってはいけません。
その代わりに wParam を HDC にキャストすればデバイスコンテキストの
ハンドルがもらえます。分かっていますよね。
それなのに BeginPaint、EndPaint を記述しているのはおかしいです。
>ダイアログ画面を複数書いて値が重複するのは変だと思いますがどうなんですか?
↑
思いません。
ダイアログAでボタン1があった場合 IDC_BUTTON1 を使います。
ダイアログBでもボタン1があった場合 IDC_BUTTON1 を使います。
IDC_BUTTON1 がダイアログで重複していても問題ないですし、変とも思いません。
ただし、タブコントロールなどに使うダイアログをコントロールとした場合は
各画面ごとに ID を束ねるようにしたり、重複しないようにします。
これはタブコントロールやプロパティシートのダイアログ・プロシージャを
1つに共通化したいために重複をしないためです。
(あまりにもコントロールの数が多い場合はダイアログ毎にプロシージャを用意します)
・リソースIDの値を変更した場合はリビルドしないといけません。
上手くリビルドできない場合は *.obj、*.exe などのファイルを削除してから
ビルド(コンパイル)を行います。ファイルを複数に分割している場合はこのようにします。
回答ありがとうございます。
ほとんどが何処かのサイトから参考にして書いたのですが、
確かにHDCにキャストしてあるのにおかしいですね。
リビルドすればうまく行きました。
> (あまりにもコントロールの数が多い場合はダイアログ毎にプロシージャを用意します)
プロシージャを分ける場合はファイルも別にするのが普通なんですか?
別にしないと結局コードが長くて見ずらいですよね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コントロールの書式設定で、“コ...
-
ダイアログのスクロールバー
-
エクセルのコントロールツール...
-
フォームでPDFを表示させた...
-
MFCのプロジェクト作成時にコモ...
-
エクセル - リストボックスのマ...
-
VisualBasic 2010でVB6で使って...
-
DateTimePickerでに年月までし...
-
C#.NETでのCOMコンポーネント作...
-
VB.Net Tabコントロール中のす...
-
リストコントロール(MFC or API...
-
ActiveXコントロールを.NETにイ...
-
空のリストビューで1行おきに...
-
VC++でツリーコントロールの文...
-
WindowsMediaPlayer全画面表示...
-
VScrollBarの点滅を何とかしたい。
-
スピンボタンを右クリックして...
-
resource.h
-
エクセルで作った新しいウイン...
-
コンボボックス内の文字サイズ変更
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コントロールの書式設定で、“コ...
-
エクセルのコントロールツール...
-
スピンボタンを右クリックして...
-
ActiveXコントロールを.NETにイ...
-
DateTimePickerでに年月までし...
-
コモンダイアログコントロール...
-
フォームでPDFを表示させた...
-
EXCELVBA リストボックスで選択...
-
CEdit の内容が変わった時にメ...
-
regsvr32でActiveX登録を行ったocx
-
アイテムを点滅させる
-
TabControlとToolBarの背景色変更
-
VisualStudio MFC変数が追加で...
-
空のリストビューで1行おきに...
-
連続で印刷すると画像が更新さ...
-
VBAでリストボックス内で↑↓の操...
-
エクセル - リストボックスのマ...
-
MFC・ダイアログベースで、ダイ...
-
ワードのドロップダウンリスト
-
MFCのプロジェクト作成時にコモ...
おすすめ情報