STATIC子ウィンドウの背景色を設定したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

STATIC子ウィンドウの背景色を設定したい

#1

投稿記事 by MoNoQLoREATOR » 13年前

ウインドウを作成して文字を表示する所まではできたのですが、背景色を変更することができませんでした。

↓ソースコード
► スポイラーを表示
ウインドウをコントロールするクラスの汎用化や整理は後にするとして、とりあえず背景色を設定できるようにしたいです。

ご教授よろしくお願い致します。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: STATIC子ウィンドウの背景色を設定したい

#2

投稿記事 by softya(ソフト屋) » 13年前

えーとウィンドウ・メッセージを送れば変更できたはず・・・。
日頃MFCなので、ちょっと調べてみます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: STATIC子ウィンドウの背景色を設定したい

#3

投稿記事 by みけCAT » 13年前

WM_CTLCOLORSTATICをうまく使えばいいはずですが・・・
とりあえず自分が作ったプログラムの一部をそのまま載せます。

コード:

		case WM_CTLCOLORSTATIC:
			id=GetWindowLong((HWND)lParam,GWL_ID);
			SetBkColor((HDC)wParam,GetSysColor(COLOR_3DFACE));
			if(id>=10000 && id<=10008) {
				if(id==10008 && isheizitu)
					SetTextColor((HDC)wParam,RGB(128,128,128));
				else if(id==10004 &&
						(!bukatuon && !(!isheizitu && config.kyuuzitumustclubon)))
					SetTextColor((HDC)wParam,RGB(128,128,128));
				else SetTextColor((HDC)wParam,RGB(0,0,0));
				if(id==10000+selected && enabledraw) {
					SetBkColor((HDC)wParam,RGB(255,0,0));
					return (LRESULT)redbrush;
				}
			} else if(id==STATIC_SYUBETU) {
				if(isheizitu)SetTextColor((HDC)wParam,RGB(0,0,0));
				else SetTextColor((HDC)wParam,RGB(255,0,0));
			} else if(id==STATIC_TAISYOU) {
				if(taisyoured)SetTextColor((HDC)wParam,RGB(255,0,0));
				else SetTextColor((HDC)wParam,RGB(0,0,0));
				SetBkColor((HDC)wParam,RGB(255,255,255));
				return (LRESULT)GetStockObject(WHITE_BRUSH);
			} else if(id==STATIC_MARUBATU) {
				SetBkColor((HDC)wParam,RGB(255,255,255));
				return (LRESULT)GetStockObject(WHITE_BRUSH);
			}
			return (LRESULT)h3DFaceBrush;
全文はこちらにあります。
http://dixq.net/forum/blog.php?u=536&b=1972
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

taketoshi
記事: 222
登録日時: 14年前
住所: 日本国

Re: STATIC子ウィンドウの背景色を設定したい

#4

投稿記事 by taketoshi » 13年前

私も以前書いたプログラムで同様の処理を施していました

載せておきます。

コード:

	//スタティックコントロールの背景色処理
	case WM_CTLCOLORSTATIC:
		hdc = (HDC)wParam ;
		//ハンドルの照会処理
		if (HWND_CONTROL::hStatic == (HWND)lParam)
		{
			hBrush = CreateSolidBrush(RGB(192,192,192));			
			return (BOOL)hBrush;
		}
		break;
lParamにウインドウハンドルが格納されているのでそれを調べて合致するならば背景色を描写しています。
hdcはなんで取得してるんだろう・・・・。必要ないかもしれない。

最後にブラシの削除をお忘れなく。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: STATIC子ウィンドウの背景色を設定したい

#5

投稿記事 by softya(ソフト屋) » 13年前

みけCATさんのWM_CTLCOLORSTATICメッセージの手法で良いと思います。

WM_CTLCOLORSTATICメッセージで、lParam が該当コントールのウィンドウハンドルと一致するときに
SetBkColor( (HDC)wParam, RGB(255,0,0) );
とすれば変更できるはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: STATIC子ウィンドウの背景色を設定したい

#6

投稿記事 by ISLe » 13年前

SetBkColorは文字の背景色です。
コントロールの背景は、WM_CTLCOLORSTATICメッセージに返すブラシ(ハンドル)で塗り潰されます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: STATIC子ウィンドウの背景色を設定したい

#7

投稿記事 by softya(ソフト屋) » 13年前

ISLe さんが書きました:SetBkColorは文字の背景色です。
コントロールの背景は、WM_CTLCOLORSTATICメッセージに返すブラシ(ハンドル)で塗り潰されます。
失礼しました。自分のMFCのコードも確認した所ブラシになってました。taketoshi さんのコードでお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: STATIC子ウィンドウの背景色を設定したい

#8

投稿記事 by MoNoQLoREATOR » 13年前

該当の子ウインドウかどうかの判別方法がわかりません。
コールバック関数を宣言する段階では子ウインドウのウインドウハンドルはまだ定まっていないと思いますが?
CreateWindowの第8引数に指定した識別番号と返ってきた子ウインドウのウインドウハンドルがかけ離れているのは何故でしょう。識別番号を指定した意味がないのでは?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: STATIC子ウィンドウの背景色を設定したい

#9

投稿記事 by softya(ソフト屋) » 13年前

MoNoQLoREATOR さんが書きました:該当の子ウインドウかどうかの判別方法がわかりません。
コールバック関数を宣言する段階では子ウインドウのウインドウハンドルはまだ定まっていないと思いますが?
CreateWindowの第8引数に指定した識別番号と返ってきた子ウインドウのウインドウハンドルがかけ離れているのは何故でしょう。識別番号を指定した意味がないのでは?
定まっていないですね。とりあえずウインドウハンドルはNULLで良いかと思います。
ウインドウハンドルはポインタなので識別番号とは食い違いますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

taketoshi
記事: 222
登録日時: 14年前
住所: 日本国

Re: STATIC子ウィンドウの背景色を設定したい

#10

投稿記事 by taketoshi » 13年前

提示されたソースコードを、次のように書き直してビルドしたところ、色が付きました
僕はあまり他の方の書いたソースを分析する能力に乏しくちょっと乱暴ですけど、ヒントになりませんか?
ウインドウハンドルさえ識別出来ればお望みの通りに仕上がると思います。

コード:

LRESULT CALLBACK WindowProc(HWND hwnd,UINT uiMsg,WPARAM wParam,LPARAM lParam){
    HDC hdc = (HDC)wParam ;
 
    switch(uiMsg){
 
    case WM_CTLCOLORSTATIC:

 
 
////////////////////////////////////////////////////////////////////////////////////////////
 //ここを変更。メインウインドウのハンドル以外なら強制的になんでも描写
		if(hwnd != (HWND)lParam){
        // 背景色を水色に設定
            hBrush = CreateSolidBrush(RGB(0,128,192));            
            return (BOOL)hBrush;

		}
 
 
/////////////////////////////////////////////////////////////////////////////////////////////
 

    default:
 
        return DefWindowProc(hwnd, uiMsg, wParam, lParam);
    }
}
添付ファイル
test.jpg
test.jpg (35.59 KiB) 閲覧数: 7829 回

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: STATIC子ウィンドウの背景色を設定したい

#11

投稿記事 by MoNoQLoREATOR » 13年前

>> softya(ソフト屋)さん
『とりあえずウインドウハンドルはNULLで良いかと思います。』というのは、CreateWindowの第8引数にはNULLを指定しておけばよいという意味ですか?

>>taketoshiさん
特定の子ウインドウの背景色を設定できるようにしたいです。
ちなみにHWND_CONTROL::hStaticは何を意味しているのですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: STATIC子ウィンドウの背景色を設定したい

#12

投稿記事 by softya(ソフト屋) » 13年前

コールバックWindowProcはメインウィンドウでコールバックしますので、子ウインドウであるコントールのハンドル値は仮にNULLで良いんじゃないでしょうか?って意味です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: STATIC子ウィンドウの背景色を設定したい

#13

投稿記事 by ISLe » 13年前

  1. GetDlgItem([メイン(親)ウィンドウのハンドル], コントロールID)の戻り値と(HWND)lParamが一致するかどうか
  2. GetWindowLongPtr((HWND)lParam, GWLP_ID)の戻り値とコントロールIDが一致するかどうか
どちらかでコントロールを特定できます。

taketoshi
記事: 222
登録日時: 14年前
住所: 日本国

Re: STATIC子ウィンドウの背景色を設定したい

#14

投稿記事 by taketoshi » 13年前

>ちなみにHWND_CONTROL::hStaticは何を意味しているのですか?

私の場合は、HWND_CONTROLというクラスを作っていて、ウインドウハンドルを保存・管理しています
そのクラスを継承して、スタティックウインドウを作りウインドウハンドルを保存しています。
そしてスコープ解決演算子を用いて、特定のスタティックウインドウを指定しています。

ISLeさんの方法でも出来そうですね。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: STATIC子ウィンドウの背景色を設定したい

#15

投稿記事 by ISLe » 13年前

taketoshi さんが書きました:ISLeさんの方法でも出来そうですね。
ダイアログテンプレートを使っても同じなのでオススメです。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: STATIC子ウィンドウの背景色を設定したい

#16

投稿記事 by MoNoQLoREATOR » 13年前

>>softya(ソフト屋)さん
なるほどそういう意味でしたか。

>>ISLeさん
GetWindowLongPtr()関数を使用する方法をためしたところ、うまくいきました!
ありがとうございます。

>>taketoshiさん
たしかに、ハンドルを管理するクラスを作るとハンドルが多くなっても管理しやすそうですね。


無事背景色を設定できるようになりました。本当にありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る