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

タグの編集
投稿者 刈谷勇  (社会人) 投稿日時 2009/5/25 21:06:44
いつもお世話になります。

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

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

描画系はほとんどやったことがなく、基本的なことなのかもしれませんがよろしくお願いします。
投稿者 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()を使用して無効状態のキャプション色を使用していることに注目. 
///////////////////引用終わり/////////////
投稿者 neptune  (社会人) 投稿日時 2009/5/25 23:25:33
連投すみません。
上の引用はMFCのメンバになってますが、APIでも同じ理屈になると思いますので追記しておきます。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 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
投稿者 刈谷勇  (社会人) 投稿日時 2009/5/26 18:22:20
neptuneさん、魔界の仮面弁士さんありがとうございます。

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

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


>なお、あのサンプルでは myBrush 変数の解放処理が漏れていますので、修正しておいた方が良いかと。
こちらの件もありがとうございます。サンプルを参考にし、自分のコードも修正しました。