DOBON.NET DOBON.NETプログラミング掲示板過去ログ

コンボボックスのリストの非表示

環境/言語:[VS2005/VB.net or C#]
分類:[.NET]

Comboboxを継承したTextboxでユーザーコントロールを作成してます。
Comboboxの▼ボタン押下時に
リストor他のフォームを表示させたいと考えています。
どちらを表示させるかはプロパティ等で分岐させようとおもっています。

dropdownイベント等でフォームを開くことはできるのですが、
リスト(itemは追加してないので白い枠のみ)も同時に開いてしまいます。
これを抑制することは可能でしょうか?

以前↓の掲示板で質問していましたが、
回答がありませんでしたので解決済みにて
質問を閉じさせて頂きました

http://bbs.wankuma.com/index.cgi?mode=al2&namber=50840

以上よろしくお願いします。
■No27013に返信(ttzさんの記事)
> Comboboxを継承したTextboxでユーザーコントロールを作成してます。
> Comboboxの▼ボタン押下時に
> リストor他のフォームを表示させたいと考えています。

CB_SHOWDROPDOWN あたりをSendMessgeで送ってみたらどうですかね。
SendMessage(hwndCombo, CB_SHOWDROPDOWN, 0, 0);
http://www.river.sannet.ne.jp/yuui/WinDlg/control.html
ユーザーコントロールで作成してみてはどうでしょう?
(1)ユーザーコントロール上にコンボボックスを配置。
(2)ボタンをコンボのドロップダウンボタンに重ね前面に配置。
(3)プロパティでボタンの可視制御を行う。
(4)ボタンのイベントでフォームを開く

こんなんでどうでしょう?
>CB_SHOWDROPDOWN あたりをSendMessgeで送ってみたらどうですかね。
>SendMessage(hwndCombo, CB_SHOWDROPDOWN, 0, 0);
やじゅさんありがとうございます。
これはメッセージを送り「フォーム又はリストを開く」ということでしょうか?
▼ボタンクリック後の処理はOnDropDownあたりで分岐させて、
処理をしようと思っています。
問題はそこでリストも同時に表示してしまう事です。

WndProcでCBN_DROPDOWNやCBN_DROPDOWNを処理して
出来ないかと思い試行錯誤したのですが未だ実現できていません。
CBN_DROPDOWNでできそうだったのですが、
comboboxを配置したフォームを開いた時点でCBN_DROPDOWNが一度来てしまうのと
▼ボタンを押した時のボタンのbackcolorが変わらないようです。


>ユーザーコントロールで作成してみてはどうでしょう?
shuさんありがとうございます。
comboboxのボタンとbuttonコントロールの形が違うので
若干違和感があります。コーディングでなくすことは可能なのでしょうか…
しかし他に方法がなければshuさんの回答でいきたいと思います。



combobox.DropDownStyle = ComboBoxStyle.Simple
combobox.DropDownStyle = ComboBoxStyle.DropDownList
dropイベントでこういうふうにすれば、
無理やりながら思うような処理に近づいてはいるのですが、
当然ながらcomboboxがちらつく(ようにみえる)のと、
一度フォームを開いたあとは▼ボタンのクリックではなく
combobox自体のクリックでdropイベントが処理されて(?)しまいます。
> comboboxのボタンとbuttonコントロールの形が違うので
> 若干違和感があります。コーディングでなくすことは可能なのでしょうか…
そうしたら、さらにラベルまたはテキストボックスを追加しコンボの前面に配置、
今度はボタンを常時表示にしておいて、プロパティの内容でボタンクリック処理を分岐するっていうのはどうでしょう?
> comboboxのボタンとbuttonコントロールの形が違うので
> 若干違和感があります。コーディングでなくすことは可能なのでしょうか…

ComboBoxRenderer.DrawDropDownButton()メソッドはいかがでしょうか?

shuさんのユーザーコントロールのボタン部分を、
自作ボタンに置き換えればいけると思います。

Public Class ComboBoxButton
    Inherits Control

    Dim _state As VisualStyles.ComboBoxState = VisualStyles.ComboBoxState.Normal

    Protected Overrides Sub OnMouseEnter(ByVal e As System.EventArgs)
        Me._state = VisualStyles.ComboBoxState.Hot
        Me.Invalidate()
        MyBase.OnMouseEnter(e)
    End Sub
    Protected Overrides Sub OnMouseLeave(ByVal e As System.EventArgs)
        Me._state = VisualStyles.ComboBoxState.Normal
        Me.Invalidate()
        MyBase.OnMouseLeave(e)
    End Sub
    Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
        Me._state = VisualStyles.ComboBoxState.Pressed
        Me.Invalidate()
        MyBase.OnMouseDown(e)
    End Sub
    Protected Overrides Sub OnMouseUp(ByVal e As System.Windows.Forms.MouseEventArgs)
        Me._state = VisualStyles.ComboBoxState.Normal
        Me.Invalidate()
        MyBase.OnMouseUp(e)
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        ComboBoxRenderer.DrawDropDownButton(e.Graphics, New Rectangle(0, 0, Me.Width, Me.Height), Me._state)
        MyBase.OnPaint(e)
    End Sub

End Class
No27034
H.K.R.さん回答ありがとうございます。
こういう方法もあるんですね。
違和感なくコントロールを作成することができました。
他にも応用ができそうで、勉強になりました。

回答をくださった皆様ありがとうございました。
これにて解決とさせていただきます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板