tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルCOMBOBOXのBackColorについて
記事No5642
投稿日: 2007/06/14(Thu) 10:35
投稿者SAN
初めまして、SANと申します。
早速ですが、質問します。
ComboBoxのBackColorについて不明な点があります。

ComboBox.DropDownStyle = ComboBoxStyle.DropDown
ComboBox.BackColor = Color.White
ComboBox.Enabled = False
とした時、画面上でComboBoxのBackColorがWhiteではありません。

ComboBox.DropDownStyle = ComboBoxStyle.DropDownList
ComboBox.BackColor = Color.White
ComboBox.Enabled = False
上記のように、DropDownListに変更すると、Whiteで表示されます。

ComboBoxの内容を変更したいので、DropDownにしたいのですが
周りのコントロールとBackColorが違うので、不自然になってしまいます。

DropDownの場合でも、BackColorをWhiteにする方法をご存知ないでしょうか?

※EnabledがTrueの場合は、もちろんBackColorはWhiteで、問題ありません。

[ツリー表示へ]
タイトルRe: COMBOBOXのBackColorについて
記事No5643
投稿日: 2007/06/14(Thu) 14:19
投稿者y4yama
> ※EnabledがTrueの場合は、もちろんBackColorはWhiteで、問題ありません。
勉強させていただいてます。 VB2005で確認しました
ComboBox.Enabled = False は絶対条件として考えます

1.正統派なら、Tipsにオーナードローによる方法がありますが・・
2.ずるいことを試してみたのですが
  ComboBox1.Enabled = False
  bkStr1 = ComboBox1.Text
  ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
としておき、.Enabled = Trueになる時にDropDownにしてComboBox1.Text = bkStr1

>ComboBoxの内容を変更したいので
AddしておくならDropDownListでも表示が残るからいいかと・・

[ツリー表示へ]
タイトルRe: COMBOBOXのBackColorについて
記事No5644
投稿日: 2007/06/14(Thu) 14:51
投稿者魔界の仮面弁士
Disabled = False なコンボボックスで、背景色が白色というのは、かなり違和感が……。
# まぁ、単に私がそういうアプリを見たことが無いというだけなんですが。(^^;

> ComboBox.BackColor = Color.White
[アプリケーション]-[XP Visual スタイルを有効にする]のチェックを外したら、
DropDown でも(枠の部分だけ)色が維持されましたが…無理がありますね。

> DropDownの場合でも、BackColorをWhiteにする方法をご存知ないでしょうか?
おそらく無いと思います。無理にやるとすると…。

案1) Enabled = False にするときだけ、DropDownList に変更する。
案2) DropDownList と TextBox を組み合わせたコンボボックスを自作する。
案3) System.Windows.Forms.ComboBox+ComboBoxChildNativeWindow オブジェクトを直接操作。

[ツリー表示へ]
タイトル無茶してみた
記事No5646
投稿日: 2007/06/14(Thu) 15:30
投稿者魔界の仮面弁士
> 案3) System.Windows.Forms.ComboBox+ComboBoxChildNativeWindow オブジェクトを直接操作。

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    ComboBox1.DropDownStyle = ComboBoxStyle.DropDown
    ComboBox1.BackColor = Color.White

    DisableComboBox(ComboBox1)
End Sub

Private Sub DisableComboBox(ByVal comboBox As ComboBox)
    'コンボボックス自体を使用不可にする。
    comboBox.Enabled = False

    Dim field As FieldInfo = comboBox.GetType().GetField("childEdit", _
        BindingFlags.GetField Or BindingFlags.NonPublic Or BindingFlags.Instance)
    Dim childEdit As NativeWindow = DirectCast(field.GetValue(comboBox), NativeWindow)
    If childEdit IsNot Nothing Then
        '内部テキストボックスのみ、使用可能に戻す。
        EnableWindow(childEdit.Handle, True)
    End If
End Sub

Private Declare Auto Function EnableWindow Lib "user32" (ByVal hWnd As IntPtr, _
    <MarshalAs(UnmanagedType.Bool)> ByVal bEnable As Boolean) As _
    <MarshalAs(UnmanagedType.Bool)> Boolean

[ツリー表示へ]
タイトル【解決】COMBOBOXのBackColorについて
記事No5647
投稿日: 2007/06/15(Fri) 10:20
投稿者SAN

>y4yamaさん
> >ComboBoxの内容を変更したいので
> AddしておくならDropDownListでも表示が残るからいいかと・・
回答ありがとうございます。
今回は、書き換え可能ですが。ADDはしないようです ^^;
Enabled = Falseの場合にAddして、Enabled =TrueにしたときRemoveをすれば
問題はないと思いますが、きちんとコーディングしないと
不具合が出そうで少し不安です。

>魔界の仮面弁士さん
> > 案3) System.Windows.Forms.ComboBox+ComboBoxChildNativeWindow オブジェクトを直接操作。
回答ありがとうございます。
このような方法があるとは知りませんでした。
正しい動作で実現できました。
今回はこの方法を使用します。

お二人とも迅速な回答ありがとうございます。
大変助かりました^^

[ツリー表示へ]
タイトル駄目ですよ
記事No5648
投稿日: 2007/06/15(Fri) 10:34
投稿者魔界の仮面弁士
> > > 案3) System.Windows.Forms.ComboBox+ComboBoxChildNativeWindow オブジェクトを直接操作。
> 今回はこの方法を使用します。

うわわわ。
冗談で書いたコードなので、こんな方法を採用してはいけません。(書かなきゃ良かった…)

undocumented な非公開メンバを直接操作するという『無茶な処理』なので、
どんな不具合がおきるか分かった物ではありませんよ。
.NET Framework のバージョンによっては、使えなくなる可能性さえありますし。



充分に検証した上で、自己責任で使う分には止めはしませんが、できることなら、
他の方法で対応した方が「安全」でしょう。

# 個人的には、「案4) Windows の仕様だとして諦める」を追加したいところ。

[ツリー表示へ]
タイトルRe: 【解決】COMBOBOXのBackColorについて
記事No5649
投稿日: 2007/06/15(Fri) 12:52
投稿者y4yama
魔界の仮面弁士さまのコメントは、重要だと思いました
> 正しい動作で実現できました。
私も同様で、うまいなぁ〜と思ってましたデス

ソフトの見てくれは、大切な商品価値かとも感じまして、
輪をかけたサル知恵ですが
> 今回は、書き換え可能ですが。ADDはしないようです ^^;
全く同じ大きさのDropDownListの1ItemのみのComboBoxDummyを
Enabled = Falseの場合にのみ、ComboBox1の上に.Showするというのが被害がないかな、とか

ありがとうございました。色々と勉強になりました。

[ツリー表示へ]