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

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
27.07.2016, 00:34
    #39280717
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как на VB.Net записать конструкцию *(HTREEITEM*)&rc = hTreeItem?
Не могу для 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
27.07.2016, 01:27
    #39280725
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как на VB.Net записать конструкцию *(HTREEITEM*)&rc = hTreeItem?
А не, все правильно делал.
В другом месте недоглядел
Код: 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
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как на VB.Net записать конструкцию *(HTREEITEM*)&rc = hTreeItem? / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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