ダイアログの色を取得したい

[戻る]
あすか 2008/09/18(木) 16:39:50
はじめまして。
早速質問させていただきます。

OS:Windows2000 XP
VC6でダイアログベースです。

タイトルの通り、ダイアログの色を取得したいのですが、
方法を教えてください。
エディットボックスをダイアログと同じ色にしたいのです。

OnInitDialog()で
CWindowDC dc(this);
COLORREF a = dc.GetBkColor();
m_brEdit.CreateSolidBrush( a );

HBRUSH CIRUDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
    // TODO: この位置で DC のアトリビュートを変更してください
    switch( pWnd->GetDlgCtrlID())
    {
    // エディットボックス
    case IDC_EDIT:
        return (HBRUSH) m_brEdit;    // 背景色ブラシ
    default:
        break;
    }
    
    // TODO: デフォルトのブラシが望みのものでない場合には、違うブラシを返してください
    return hbr;
}

上記のようにやってみましたが、出来ませんでした。
よろしくお願いいたします。

Kerry 2008/09/18(木) 16:55:15
    // エディットボックス
    case IDC_EDIT:
        pDC->SetBkColor(GetSysColor(COLOR_BTNFACE));
        return (HBRUSH)(COLOR_BTNFACE + 1);    // 背景色ブラシ

これで実現できると思います。
エディットの場合、背景ブラシだけでなくテキストの背景色も設定して
やる必要があったと思います。

あすか 2008/09/18(木) 17:14:06
Kerryさんありがとうございます。

教えていただいた通りにしましたところ、
無事に、ダイアログの背景色と同じ色にすることが出来ました。

        pDC->SetBkColor(GetSysColor(COLOR_BTNFACE));

こちらは、ダイアログの色背景色を取得して、
エディットボックスのテキストが書かれる背景色として
セットしているのは理解できたのですが、

        return (HBRUSH)(COLOR_BTNFACE + 1);    // 背景色ブラシ

こちらの、(COLOR_BTNFACE + 1)は、ブラシの色を返せばよいのですよね?
この「+1」は、何でしょうか?
教えていただけると嬉しいです。

金魚ちゃん 2008/09/18(木) 18:06:14
>こちらの、(COLOR_BTNFACE + 1)は、ブラシの色を返せばよいのですよね?
>この「+1」は、何でしょうか?
return (HBRUSH)GetSysColorBrush( COLOR_BTNFACE ); // 背景色ブラシ
と同じです。

COLOR_BTNFACE などの定数は 0 から始まっています。
でも 0 を返すと NULL_BRUSH を意味してしまうので +1 にする仕組みです。
Windows 内部でシステムカラーのブラシは COLOR_BTNFACE などの定数に
+1 した値になっているのでしょう。きっと。

なお、質問にある[ダイアログの色を取得したい]とはどんな意味ですか?
ファイルなどのプロパティでエディットボックスが使ってあり、
背景もダイアログの色と合わせたいだけなら ES_READONLY スタイルを
付ければ良いんじゃない。

あすか 2008/09/19(金) 09:35:16
金魚ちゃんさん、ありがとうございます。

+1の意味は理解できました。

「ダイアログの色を取得したい」というのは、
エディットボックスの入力部分の色と、
ダイアログの背景色と合わせたかったので、
ダイアログのCDCから背景色を取得して、
エディットボックスの背景色にセットすればよいと考えたので、
「ダイアログの色を取得したい」となりました。

後、すみません、「ファイルなどのプロパティ」の意味が
分からないのですが、ES_READONLY スタイルだと、
入力も出来なくなるのですよね?
色は、ダイアログと同じにしたいのですが、
入力は可能としたいのです。
(的を得ない返答でしたらすみません)

PATIO 2008/09/19(金) 10:23:59
> 分からないのですが、ES_READONLY スタイルだと、
> 入力も出来なくなるのですよね?
> 色は、ダイアログと同じにしたいのですが、
> 入力は可能としたいのです。

ちょっと気になったので。
基本的なWindowsのインターフェイスでは
入力可能なエディットボックスの背景色をダイアログの背景色と
同じにはしないと思うので何も知らない人が見たら入力できない
エディットボックスかと勘違いしそうですね。
リーズナブルな理由があってやっているなら良いと思うのですが、
単なるデザイン的な話ならあんまりやらない方が良いような気はします。
まあ、したら駄目って話ではないのですけれど、
ユーザーフレンドリーでないような気がしたので書いてみました。

あすか 2008/09/19(金) 10:33:30
PATIOさん、ありがとうございます。

> 基本的なWindowsのインターフェイスでは
> 入力可能なエディットボックスの背景色をダイアログの背景色と
> 同じにはしないと思うので何も知らない人が見たら入力できない
> エディットボックスかと勘違いしそうですね。

おっしゃる通りだと私も感じました。
今、既存のVBで作成されたソフトをVCに置き換えています。
元々のものがそうなっていて、私もソースを見るまで、
そこに入力できるのを気づきませんでした。
同じ物をということなので、色を付けたいと相談させていただきました。

皆さん色々ありがとうございます。

あすか 2008/09/23(火) 11:38:02
[[解決]]
皆さんありがとうございました。

        pDC->SetBkColor(GetSysColor(COLOR_BTNFACE));
        return (HBRUSH)(COLOR_BTNFACE + 1);    // 背景色ブラシ

で問題は解決いたしました。

古いスレッドには追加発言できません。