Laut der Headerdatei "Commctrl.h" gibt zwei verschiedene TVM_GETITEM Nachrichten:
#ifdef UNICODE
#define TVM_GETITEM TVM_GETITEMW
#else
#define TVM_GETITEM TVM_GETITEMA
#endif
Siehe dazu: http://www.thescripts.com/forum/thread621199.html (weiter unten)
Wenn man nun die Message TVM_GETITEMA (anstatt die Std. Unicode Msg TVM_GETITEMW) benutzt und den Code etwas modifiziert, funktioniert das ganze auch mit der COM TreeView-Komponente:
Option Strict On
Option Explicit On
Imports System.Runtime.InteropServices
Partial Public Class MainForm
Public Const TV_FIRST As Integer = 4352
Public Const TVSIL_NORMAL As Integer = 0
Public Const TVSIL_STATE As Integer = 2
Public Const TVM_SETIMAGELIST As Integer = TV_FIRST + 9
Public Const TVM_GETNEXTITEM As Integer = TV_FIRST + 10
Public Const TVIF_HANDLE As Integer = 16
Public Const TVIF_STATE As Integer = 8
Public Const TVIF_IMAGE As Integer = 2
Public Const TVIS_STATEIMAGEMASK As Integer = 61440
Public Const TVM_SETITEM As Integer = TV_FIRST + 13
Public Const TVGN_ROOT As Integer = 0
'// Public Const TVM_GETITEM As Integer = TV_FIRST + 62
'// TVM_GETITEMA (TV_FIRST + 12)
Public Const TVM_GETITEM As Integer = TV_FIRST + 12
Public Const MY_MAXLVITEMTEXT As Integer = 127
Private Const TVIF_TEXT As Int32 = &H1
<StructLayout(LayoutKind.Sequential, Pack:=8, CharSet:=CharSet.Auto)> _
Public Structure TVITEM
Dim mask As Integer
Dim hItem As IntPtr
Dim state As Integer
Dim stateMask As Integer
Dim pszText As IntPtr
Dim cchTextMax As Integer
Dim iImage As Integer
Dim iSelectedImage As Integer
Dim cChildren As Integer
Dim lParam As IntPtr
End Structure
<DllImport("user32.dll")> _
Public Overloads Shared Function SendMessage _
(ByVal hWnd As IntPtr, ByVal Msg As Integer, _
ByVal wParam As Integer, ByVal lParam As Integer) As Integer
End Function
<DllImport("User32.dll", CharSet:=CharSet.Auto)> _
Public Overloads Shared Function SendMessage _
(ByVal hWnd As IntPtr, ByVal msg As Integer, _
ByVal wParam As Integer, ByRef lParam As TVITEM) As Integer
End Function
Private Declare Function LocalAlloc _
Lib "kernel32.dll" (ByVal wFlags As Int32, ByVal wBytes As Int32) As Int32
Public Sub New()
' The Me.InitializeComponent call is required for Windows Forms
' designer support.
Me.InitializeComponent()
'
' TODO : Add constructor code after InitializeComponents
'
End Sub
Sub FillTreeView()
With Me.AxTreeView1
.Nodes.Add(, "root", "root", "node0")
.Nodes.Add(, "root", , "node1")
End With
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button1.Click
Dim tvi As New TVITEM
Dim hWnd As IntPtr = New IntPtr(Me.AxTreeView1.hWnd) _
'Me.TreeView1.Handle
Dim pszText As IntPtr = IntPtr.Zero
Dim buffer As String = Nothing
Dim hRoot As IntPtr = IntPtr.op_Explicit(SendMessage(hWnd, _
TVM_GETNEXTITEM, TVGN_ROOT, 0))
tvi.hItem = hRoot
tvi.state = 0
SendMessage(hWnd, TVM_GETITEM, 0, tvi)
pszText = New IntPtr(LocalAlloc(&H40, MY_MAXLVITEMTEXT))
tvi.mask = TVIF_TEXT
tvi.hItem = hRoot
tvi.cchTextMax = MY_MAXLVITEMTEXT
tvi.pszText = pszText
SendMessage(hWnd, TVM_GETITEM, 0, tvi)
'// buffer = Marshal.PtrToStringUni(tvi.pszText, MY_MAXLVITEMTEXT)
buffer = Marshal.PtrToStringAnsi(tvi.pszText, MY_MAXLVITEMTEXT)
Debug.WriteLine(buffer)
MessageBox.Show(buffer)
End Sub
Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
FillTreeView()
End Sub
End Class (frag mich aber bitte nicht warum das so ist ) |