[delphi-users:4306] ComboBoxの背景色が灰色っぽい(Windows10上)

2,723 views
Skip to first unread message

OE

unread,
Nov 5, 2015, 3:53:18 AM11/5/15
to delphi...@freeml.com
[開発環境 XE7 Windows7(64)]
[クライアント Windows10(64)]
[VCLフォームアプリケーション]

こんにちは、OEです。
すでにどなたかが記事にされてる事だと思い検索しているのですが、
恥ずかしいことに見つけられません…。どなたか教えて下さい。


フォームにComboBoxを配置しStyleをcsDropDownList にしました。

この実行ファイルをWindows10で実行すると、
コンボボックスの背景色が濃いめの灰色っぽい色になります。
ドロップダウンは可能で変更ももちろんできるのですが、
色的に「灰色のため切替不可」に感じてしまいます。

一方、Windows7では背景色は白なので感覚的に「切替可能」とわかります。

この状況は、Windows10での仕様なのでしょうか。
それとも、Delphi側で何か制御しないと背景色白にならないのでしょうか。
csDropDown にすれば背景色白になりますが、編集は不可にしたいので、
csDropDownList を使いたいところです。


何か良い方法がありましたら教えて下さい。
よろしくお願いいたします。


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
Powered by freeml -- http://www.freeml.com/ --
------------------------------------------------------[freeml byGMO]--

DEKO

unread,
Nov 5, 2015, 4:39:55 AM11/5/15
to delphi...@freeml.com
こんにちは。

> Windows7では背景色は白なので感覚的に「切替可能」とわかります。

ん?Vista も Windows 7 もクラシック表示またはテーマ未使用でない限り
背景はグレーだったと思いますが...?
https://www.google.co.jp/search?q=Windows7+Combobox&hl=ja&source=lnms&tbm=isch&sa=X&ved=0CAgQ_AUoAWoVChMI9NqaiP34yAIVoeOmCh2xOA-n

> この状況は、Windows10での仕様なのでしょうか。

仕様です。テーマ色での描画ですね。
ちなみに Enabled = False だともっと濃いグレーです。

> 何か良い方法がありましたら教えて下さい。

クラシック表示にするのは論外でしょうから、
TColorBox みたいにオーナードローしましょう。

オーナードローと言っても OnDrawItem を記述するのではなく、
TComboBox の Style プロパティを csOwnerDrawFixed にするだけです。

# オーナードローですがデフォルト描画はされますので、
# お望みの挙動になるかと思います。

--
by DEKO
-----------------------------
http://ht-deko.com/
de...@ht-deko.minim.ne.jp
-----------------------------

DEKO

unread,
Nov 5, 2015, 4:44:52 AM11/5/15
to delphi...@freeml.com
[Vcl.StdCtrls.TComboBox.Style (DocWiki)]
http://docwiki.embarcadero.com/Libraries/ja/Vcl.StdCtrls.TComboBox.Style

--
by DEKO
-----------------------------
http://ht-deko.com/
de...@ht-deko.minim.ne.jp
-----------------------------


ML??????: http://www.freeml.com/delphi-users

OE

unread,
Nov 5, 2015, 5:53:18 AM11/5/15
to delphi...@freeml.com
> DEKOさん

開発はクラシック、動作確認Win7はテーマ未使用…
という環境でいつも使っているので、今まで全く知らずでした。(^^;

お陰さまで解決しました。
ありがとうございました。


-----------------------------------------------
// FormにComboBoxを貼り、
// ComboBox1のOnDrawItemにComboBox1DrawItemを割り当てる

type
TForm1 = class(TForm)
ComboBox1: TComboBox;
procedure FormCreate(Sender: TObject);
procedure ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.Style :=csOwnerDrawFixed;
ComboBox1.Items.Add('あいうえお');
ComboBox1.Items.Add('かきくけこ');
ComboBox1.Items.Add('さしすせそ');
ComboBox1.ItemIndex:=0;
ComboBox1.TabStop :=false;
end;
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
CB :TComboBox;
begin
CB :=Control as TComboBox;
with CB.Canvas do begin
FillRect(Rect);
Textout(4 ,Rect.Top+2,CB.Items[Index]);
//他にもここに書き込めばカスタマイズできる
end;
end;

end.



MLホームページ: http://www.freeml.com/delphi-users

DEKO

unread,
Nov 5, 2015, 6:01:32 AM11/5/15
to delphi...@freeml.com
> procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;

ありゃ?デフォルト描画だけじゃダメでしたか?
OnDrawItem のイベントハンドラを書かなくとも
問題は解決すると思ったのですが...。

--
by DEKO
-----------------------------
http://ht-deko.com/
de...@ht-deko.minim.ne.jp
-----------------------------


OE

unread,
Nov 5, 2015, 7:36:25 AM11/5/15
to delphi...@freeml.com
あ・・・

> オーナードローと言っても OnDrawItem を記述するのではなく、
> TComboBox の Style プロパティを csOwnerDrawFixed にするだけです。

これの意味をようやく理解しました。

オーナードローとか検索してやってるうちに、
OnDrawItem書いてしまっていてデキテデキタって喜んで終わってました。

OnDrawItem のイベントハンドラを書かなくてもOKでした。
ありがとうございました。
Reply all
Reply to author
Forward
0 new messages