- PR -

コンボボックスの概観について

1
投稿者投稿内容
ポルポル
会議室デビュー日: 2007/05/22
投稿数: 12
投稿日時: 2008-02-06 17:51
お世話になります。

現在VB2005を使用して、フォームにコンボボックスを配置したWindowsアプリケーション
を作成しています。

【コンボのプロパティ】
ComboBox.DropDownStyle = DropDownList
ComboBox.FlatStyle = Flat

上記のようにプロパティを設定した場合に、コンボボックスの概観(外枠)は
白線となるのですが、これを黒線にしたいです。
プロパティではできそうになかったので、System.Windows.Forms.ComboBox
を継承したコントロールを作成し、その中でonPaintメソッドをオーバーライドしようと
考えたのですが、onPaint自体に入っていないようでした。

Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e) ←ブレークポイントがヒットしませんでした。
  ※ここでControlPaintクラスを使用して描画の予定
End Sub

コンボボックスの外枠を黒線にしたいと思っています。
ご存知の方、ご教授お願い致します。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2008-02-06 18:48
こんばんは。

引用:

ポルポルさんの書き込み (2008-02-06 17:51) より:

コンボボックスの外枠を黒線にしたいと思っています。



フラットスタイルのコンボボックス外枠は
白線(システムカラー)固定で描画してしまっているので、
どこかのプロパティをいじっても変更できなさそうです。

OnPaintをオーバーライドしても、ComboBoxクラス内でそもそも呼び出していないので無駄です。
自前で描画するにはタイミング的に、WndProcをオーバーライドするしかないでしょう。
ただしWindowsAPIの知識が必要となります。

コード:

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Select Case m.Msg
            Case WM_NC_PAINT
                MyBase.WndProc(m)

		' 非クライアント領域への描画

            Case WM_PAINT
                MyBase.WndProc(m)

		' クライアント領域への描画

            Case Else
                MyBase.WndProc(m)
        End Select




WindowsAPIの知識がないのであれば、カスタムコントロール(継承コントロール)ではなく
ユーザーコントロール(System.Windows.Forms.UserControlの継承クラス)にして
ごまかすのがよいかと思います。
ポルポル
会議室デビュー日: 2007/05/22
投稿数: 12
投稿日時: 2008-02-07 08:34
Tdnr_Symさん返答ありがとうございます

引用:

Tdnr_Symさんの書き込み (2008-02-06 18:48) より:

OnPaintをオーバーライドしても、ComboBoxクラス内でそもそも呼び出していないので無駄です。
自前で描画するにはタイミング的に、WndProcをオーバーライドするしかないでしょう。
ただしWindowsAPIの知識が必要となります。




OnPaintは呼ばれていなかったのですね・・・。常に発生するものだと思っていました。
WndProcのオーバーライドについては、@IT当のページで読んだりしていますが、
WindowsAPIの知識はあまりありません。

ユーザーコントロールの方も検討してみます。(これを機会にAPIについて調べてみます)
ありがとうございました。
otf
ベテラン
会議室デビュー日: 2006/08/04
投稿数: 91
投稿日時: 2008-02-08 17:40
ComboBoxのインスタンスに
SetStyle(ControlStyles.UserPaint, true);
と設定するとOnPaintが呼ばれるようになりますよ。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2008-02-08 18:04
こんばんは。

引用:

otfさんの書き込み (2008-02-08 17:40) より:
ComboBoxのインスタンスに
SetStyle(ControlStyles.UserPaint, true);
と設定するとOnPaintが呼ばれるようになりますよ。



あっ。ごめんなさい。私、大ウソ言ってました。
otfさんのおっしゃるとおりOnPaintが呼ばれる流れがありました。
ちゃんと調べて回答したつもりだったんですが。

ControlStyles.UserPaintを設定すると、
コンボボックス全体を描画してやらないといけないのかな?
otf
ベテラン
会議室デビュー日: 2006/08/04
投稿数: 91
投稿日時: 2008-02-08 19:49
引用:

Tdnr_Symさんの書き込み (2008-02-08 18:04) より:
ControlStyles.UserPaintを設定すると、
コンボボックス全体を描画してやらないといけないのかな?



ComboBoxRendererでなんとかなるかなと思ったけどこれFlat対応してなかったですね。
やっぱりこの方法だと全体を描写する手間はかかるかもしれません。
1

スキルアップ/キャリアアップ(JOB@IT)