ページ 11

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

Posted: 2011年11月20日(日) 20:48
by MoNoQLoREATOR
ウインドウを作成して文字を表示する所まではできたのですが、背景色を変更することができませんでした。

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

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

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

Posted: 2011年11月20日(日) 21:32
by softya(ソフト屋)
えーとウィンドウ・メッセージを送れば変更できたはず・・・。
日頃MFCなので、ちょっと調べてみます。

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

Posted: 2011年11月20日(日) 21:36
by みけCAT
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

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

Posted: 2011年11月20日(日) 21:53
by taketoshi
私も以前書いたプログラムで同様の処理を施していました

載せておきます。

コード:

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

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

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

Posted: 2011年11月20日(日) 21:54
by softya(ソフト屋)
みけCATさんのWM_CTLCOLORSTATICメッセージの手法で良いと思います。

WM_CTLCOLORSTATICメッセージで、lParam が該当コントールのウィンドウハンドルと一致するときに
SetBkColor( (HDC)wParam, RGB(255,0,0) );
とすれば変更できるはずです。

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

Posted: 2011年11月20日(日) 23:48
by ISLe
SetBkColorは文字の背景色です。
コントロールの背景は、WM_CTLCOLORSTATICメッセージに返すブラシ(ハンドル)で塗り潰されます。

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

Posted: 2011年11月20日(日) 23:52
by softya(ソフト屋)
ISLe さんが書きました:SetBkColorは文字の背景色です。
コントロールの背景は、WM_CTLCOLORSTATICメッセージに返すブラシ(ハンドル)で塗り潰されます。
失礼しました。自分のMFCのコードも確認した所ブラシになってました。taketoshi さんのコードでお願いします。

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

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

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

Posted: 2011年11月21日(月) 21:45
by softya(ソフト屋)
MoNoQLoREATOR さんが書きました:該当の子ウインドウかどうかの判別方法がわかりません。
コールバック関数を宣言する段階では子ウインドウのウインドウハンドルはまだ定まっていないと思いますが?
CreateWindowの第8引数に指定した識別番号と返ってきた子ウインドウのウインドウハンドルがかけ離れているのは何故でしょう。識別番号を指定した意味がないのでは?
定まっていないですね。とりあえずウインドウハンドルはNULLで良いかと思います。
ウインドウハンドルはポインタなので識別番号とは食い違いますよ。

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

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

コード:

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);
    }
}

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

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

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

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

Posted: 2011年11月21日(月) 22:48
by softya(ソフト屋)
コールバックWindowProcはメインウィンドウでコールバックしますので、子ウインドウであるコントールのハンドル値は仮にNULLで良いんじゃないでしょうか?って意味です。

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

Posted: 2011年11月22日(火) 01:00
by ISLe
  1. GetDlgItem([メイン(親)ウィンドウのハンドル], コントロールID)の戻り値と(HWND)lParamが一致するかどうか
  2. GetWindowLongPtr((HWND)lParam, GWLP_ID)の戻り値とコントロールIDが一致するかどうか
どちらかでコントロールを特定できます。

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

Posted: 2011年11月22日(火) 07:23
by taketoshi
>ちなみにHWND_CONTROL::hStaticは何を意味しているのですか?

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

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

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

Posted: 2011年11月22日(火) 17:22
by ISLe
taketoshi さんが書きました:ISLeさんの方法でも出来そうですね。
ダイアログテンプレートを使っても同じなのでオススメです。

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

Posted: 2011年11月22日(火) 19:51
by MoNoQLoREATOR
>>softya(ソフト屋)さん
なるほどそういう意味でしたか。

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

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


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