powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как на VB.Net записать конструкцию *(HTREEITEM*)&rc = hTreeItem?
3 сообщений из 3, страница 1 из 1
Как на VB.Net записать конструкцию *(HTREEITEM*)&rc = hTreeItem?
    #39280690
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первоисточник

TVM_GETITEMRECT message

Оригинальный код:
Код: plaintext
1.
2.
3.
4.
5.
RECT rc;

*(HTREEITEM*)&rc = hTreeItem;

SendMessage(hwndTreeView, TVM_GETITEMRECT, FALSE, (LPARAM)&rc);



Для x86 в принципе прокатывает-работает вот так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
   <StructLayout(LayoutKind.Sequential)>
  Public Structure RECT
    Dim Left As Integer
    Dim Top As Integer
    Dim Right As Integer
    Dim Bottom As Integer
  End Structure


   Dim rcNode As RECT
   rcNode.Left = hNode.ToInt32 'hNode as IntPtr
   SendMessage_RECT(Handle, TVM_GETITEMRECT, True, rcNode)


На x64 соответственно не работает (ну очевидно IntPtr 8 байт, а не 4 и должен ложиться в Left и Top)
В общем то у меня код x86, и мне типа достаточно, но не хотелось бы заведомое г. писать,
такие вещи сразу проверяю и под x64 тоже.

Как бы грамотно оформить?

Нужно именно VB.Net а не C#.
...
Рейтинг: 0 / 0
Как на VB.Net записать конструкцию *(HTREEITEM*)&rc = hTreeItem?
    #39280717
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу для x64 ничего придумать.
Пытался вот так

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  <StructLayout(LayoutKind.Explicit)>
  Public Structure RECT_XX
    <FieldOffset(0)>
    Dim Left As Integer
    <FieldOffset(4)>
    Dim Top As Integer
    <FieldOffset(8)>
    Dim Right As Integer
    <FieldOffset(12)>
    Dim Bottom As Integer
    <FieldOffset(0)>
    Dim LeftX64 As Long
  End Structure
rcNode.LeftX64 = hNode.ToInt64


но что-то не работает
Не могу понять что они имеют ввиду и как паковать IntPtr в RECT.
...
Рейтинг: 0 / 0
Как на VB.Net записать конструкцию *(HTREEITEM*)&rc = hTreeItem?
    #39280725
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А не, все правильно делал.
В другом месте недоглядел
Код: vbnet
1.
hNode = SendMessage_TVHITTESTINFO(Handle, TVM_HITTEST, 0, tvhip)


SendMessage_TVHITTESTINFO у меня Integer почему-то возвращала вместо IntPtr, поэтому hNode на x64 ошибочный получался

А запихивать IntPtr в RECT как они хотят можно так:


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
  <StructLayout(LayoutKind.Sequential)>
  Public Structure RECT
    Dim Left As Integer
    Dim Top As Integer
    Dim Right As Integer
    Dim Bottom As Integer
  End Structure

  <StructLayout(LayoutKind.Explicit)>
  Public Structure RECT_XX
    <FieldOffset(0)>
    Dim Left As Integer
    <FieldOffset(4)>
    Dim Top As Integer
    <FieldOffset(8)>
    Dim Right As Integer
    <FieldOffset(12)>
    Dim Bottom As Integer
    <FieldOffset(0)>
    Dim LeftX64 As Long
  End Structure

              Dim rcNode As RECT
              If Is64bitProcess() Then
                Dim rcNodeXX As RECT_XX
                rcNodeXX.LeftX64 = hNode.ToInt64
                rcNode.Left = rcNodeXX.Left : rcNode.Top = rcNodeXX.Top
              Else
                rcNode.Left = hNode.ToInt32
              End If
              SendMessage_RECT(Handle, TVM_GETITEMRECT, True, rcNode)



Все заработало.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как на VB.Net записать конструкцию *(HTREEITEM*)&rc = hTreeItem?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]