2010年5月21日金曜日

TreeViewコントロールの不具合

.Net 3.5までのTreeViewコントロールは追加した項目の最終行が見切れたり表示しない現象が発生します。.Net 4.0では発生しない事を確認しました。

次の様な簡単なテストプログラムを準備します。
(MSDNフォームに投稿したコードと同じです。→MSDNフォーラム)

2010年5月20日木曜日

XML+XSLT→HTML覚え書き

xsltを使った変換コードを覚え書きとする。

   Private m_trnsStyleSheet As Xsl.XslCompiledTransform

        Dim _xStyleSheet As XDocument = XDocument.Parse(My.Resources.stylesheet)
        m_trnsStyleSheet = New Xsl.XslCompiledTransform()
        m_trnsStyleSheet.Load(_xStyleSheet.CreateReader())
        '↑この部分は時間がかかるので初回のみ動作させること



        Dim _strwrtHTML As New System.Text.StringBuilder
        Using _wrtHTML As XmlWriter = _
                   XmlWriter.Create(_strwrtHTML, m_trnsStyleSheet.OutputSettings)
            '                                                           XML+XSLT→HTML
            m_trnsStyleSheet.Transform(mXMLElement.CreateReader(), Nothing, _wrtHTML)
            ctlWeb.DocumentText = _strwrtHTML.ToString()
        End Using


XmlWriterでStringBuilderが使えるので、非常に簡潔になった

2010年5月17日月曜日

ListBox : 項目が存在しないエリアを選択しても選択されないように

なんで.Netのコントロールは、細かい動作に不具合が多いのだろう

ListBox(CheckedListBox)のコントロールの動きについて、項目がListBoxの高さ一杯まで埋まっていない場合、項目がないエリアをクリックすると、選択された動作(SelectedIndexChangedイベント発生)し、違和感がある。
VB6のコントロールでは、こんな動作しなかったのに....
おかげで、ListBoxを利用した抽出画面にお客さんからクレーム来たよ(泣)

VB6と同様に項目が存在しないエリアを選択しても選択されないようにするには...

2010年5月16日日曜日

WebBrowser : .Document.Write()は使わない方がよい

WebBrowserコントロールにテキストを設定する手段として、.DocumenetTextにHTMLテキストを設定する手法が一般的である。

しかし、この方法ではHTMLテキストを設定した直後から DocumentComplete()イベントが発生するまで .DocumentTextは以前の設定された内容になっている

また、DocumentComplete()を待たずに、DocumentTextに連続してHTMLテキストを設定すると、2回目以降に設定したテキストが無視される。


さて、設定した内容を即時反映するにはどうすればよいか?
都合の良いことに Write() というメソッドが存在する。

2010年5月15日土曜日

ListBoxがOwnerDrawVariableの時、マウスホイールで逆スクロール対策

ListBoxコントロールで
DrawMode = Windows.Forms.DrawMode.OwnerDrawVariable
を設定した時、マウスホイールのスクロールが一瞬逆スクロールしている現象の対策

    Private Function HIWORD(ByVal intValue As Integer) As Integer
        If (intValue And &H80000000) = &H80000000 Then
            Return (intValue >> 16)
        End If
        Return ((intValue >> 16) And &HFFFF)
    End Function
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Select Case m.Msg
            Case &H20A                                                                          'WM_MOUSEWHEEL
                Dim _d As Integer = HIWORD(m.WParam.ToInt32())
                For _count As Integer = 1 To SystemInformation.MouseWheelScrollLines            'マウスホイールスクロール量(1行ずつ)
                    Me.TopIndex = Math.Max(0, Me.TopIndex + If(_d < 0, 1, -1))
                    Me.Invalidate()
                    Me.Update()
                Next
                Return
        End Select
        MyBase.WndProc(m)
    End Sub

まぁ、1行ずつスクロールするという事だ。

GDI+でパターンの拡大縮小

GDI+でパターンの拡大/縮小を行う場合、水平、垂直方向に0.5ドットずれて実行されるので、オフセット値を操作する事

'描画モードをニアレストネイバーに設定します
e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.NearestNeighbor
'ピクセルオフセットを設定します
e.Graphics.PixelOffsetMode = PixelOffsetMode.Half