データベース講座の参考:複数列のComboBoxについて への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 刈谷勇  (社会人) 投稿日時 2009/5/26 18:22:20
neptuneさん、魔界の仮面弁士さんありがとうございます。

選択されているListItem(DrawItemといったほうがいいのかな?)のまわりが、グレーの枠で囲まれるようになるのですね。

>ComboBox の DropDownStyle プロパティを、DropDownList に設定するとわかるかと思います。
はじめは、DropDownの設定でテストしていました。でも、DropDownListにしても気がつかなかったかも・・・(今までDropDownListの選択しているItemの周りにフォーカスがあることを気づいていなかったもので)


>なお、あのサンプルでは myBrush 変数の解放処理が漏れていますので、修正しておいた方が良いかと。
こちらの件もありがとうございます。サンプルを参考にし、自分のコードも修正しました。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/5/25 23:29:04
> データベース講座の参考
.NET 編の第五回ですね?
http://homepage1.nifty.com/rucio/main/VBdotNet/Database/Database5.htm

> e.DrawFocusRectangle()とは、どういう処理をしているのでしょうか?
ComboBox の DropDownStyle プロパティを、DropDownList に設定するとわかるかと思います。

なお、あのサンプルでは myBrush 変数の解放処理が漏れていますので、修正しておいた方が良いかと。


Protected Overrides Sub OnDrawItem(ByVal e As DrawItemEventArgs)
    Dim isSelected As Boolean = CBool(e.State And DrawItemState.Selected)

    Dim backgroundColor As Color
    If isSelected Then
        backgroundColor = Color.White
    Else
        backgroundColor = ForeColor
    End If

    e.DrawBackground()
    Dim LineLeft As Integer = e.Bounds.X + ListWidth1
    Using myBrush As New SolidBrush(backgroundColor)
        Dim Row As DataRowView = DirectCast(Me.Items(e.Index), DataRowView)
        Dim ItemString1 As String = CStr(Row(ListMember1))
        Dim ItemString2 As String = CStr(Row(ListMember2))
        Dim Rect As RectangleF

        Rect = New RectangleF(e.Bounds.X, e.Bounds.Y, LineLeft, e.Bounds.Height)
        e.Graphics.DrawString(ItemString1, e.Font, myBrush, Rect)

        e.Graphics.DrawLine(Pens.Black, LineLeft, e.Bounds.Y, LineLeft, e.Bounds.Y + e.Bounds.Height)

        Rect = New RectangleF(LineLeft + 1, e.Bounds.Y, e.Bounds.Width - LineLeft - 1, e.Bounds.Height)
        e.Graphics.DrawString(ItemString2, e.Font, myBrush, Rect)
    End Using
    If isSelected Then
        e.DrawFocusRectangle()
    End If
End Sub
投稿者 neptune  (社会人) 投稿日時 2009/5/25 23:25:33
連投すみません。
上の引用はMFCのメンバになってますが、APIでも同じ理屈になると思いますので追記しておきます。
投稿者 neptune  (社会人) 投稿日時 2009/5/25 23:22:22
こんにちは

私も、描画系はさっぱりなんですが、
APIに、DrawFocusRectってのがありますが、DrawFocusRectangleはこれのframework判の
関数みたいですから、どこにフォーカスがあるかの明示(描画)を行っているみたいですね。

「VisualC++でソフトを作ろう」
http://www.geocities.jp/chiakifujimon/bgcolor/section3_4.html
から引用させていただきます。

一部引用・・・
///////////////////////////////
CDC* pDC = CDC::FromHandle(lpDIS->hDC);
----------------------
フォーカスのみを得ている時 
pDC->DrawFocusRect(focusRect)
フォーカスを描画するCDCクラスメンバ 
--------------
ボタンが押されている時 
pDC->DrawEdge(btnRect,EDGE_SUNKEN,BF_RECT);
ボタンの境界部分を描画するCDCクラスの関数.第2引数にEDGE_SUNKENを指定することで,
ボタンが押されている場合として描画される.
pDC->DrawFocusRect(focusRect)
フォーカスを描画するCDCクラスメンバ 
---------------
ボタンが無効状態の時 
DrawCaption(pDC, btnRect, GetDisabledColor(), strCaption);
無効状態のキャプションを描画.引数にGetDisableColor()を使用して無効状態のキャプション色を使用していることに注目. 
///////////////////引用終わり/////////////
投稿者 刈谷勇  (社会人) 投稿日時 2009/5/25 21:06:44
いつもお世話になります。

データベース講座の参考:複数列のComboBoxを見ながらカスタムコントロールを作成しています。
その中でOnDrawItemイベントをオーバーライドしている部分の最後から2行目のe.DrawFocusRectangle()とは、どういう処理をしているのでしょうか?

コメントアウトしてみたのですが動作が変わったような感じもありませんし、ヘルプを見たのですが「フォーカスを示す四角形を描画します」とあるのですが、そのフォーカスが何を指すのかがわかりません。

描画系はほとんどやったことがなく、基本的なことなのかもしれませんがよろしくお願いします。