Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Получение имени класса - 2 Добавлено: 17.08.04 01:25  

Автор вопроса:  De.MON
Я уже задавал вопрос на эту тему. Тогда сошлись на том, что без знания дескриптора получить имя класса невозможно.

Мне нужно получить имя класса меню. Для получения его дескриптора я написал следующий код:

Option Explicit

Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Declare Function IsMenu Lib "user32" (ByVal hMenu As Long) As Long

Private Sub Form_Load()
Dim hMenu As Long
Dim hSubMenu As Long
Dim lngRet As Long
Dim strClassName As String

hMenu = GetMenu(Me.hwnd)
If IsMenu(hMenu) = 0 Then
  MsgBox "Incorrect hWnd", vbInformation
  Exit Sub
End If

hSubMenu = GetSubMenu(hMenu, 0)

If IsMenu(hSubMenu) = 0 Then
  MsgBox "Incorrect hWnd", vbInformation
  Exit Sub
End If

'Дескриптор подменю получается, всё нормально. Но когда далее пытаюсь выполнить такой код:

strClassName = String(256, vbNullChar)
lngRet = GetClassName(hSubMenu, strClassName, 256)
'У меня lngRet=0, strClassName не изменяется!
strClassName = Left$(strClassName, lngRet)
Debug.Print strClassName

End Sub

Подскажите, в чём дело? Что-то в коде не так?

Ответить

  Ответы Всего ответов: 3  

Номер ответа: 1
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #1
Добавлено: 17.08.04 02:22
 Лучше MSDN читай. GetClassName требует hWnd(логический номер окна), а не hSubMenu(логический номер подменю). hWnd может иметь только окно, созданное с помощью CreateWindowEx, а hSubMenu создаётся с помощью CreateMenu + InsertMenuItem.

 Т.е. окнонные функции не работают ни с чем другим кроме hWnd.

 Функция, создающая окно, требует в себе одним из параметров имя класса окна. Либо уже известного (BUTTON, COMBOBOX, EDIT, LISTBOX ... и т.д.) либо созданного заранее оконного класса и зарегистрированного с помощью RegisterClassEx
 А функкция CreateMenu вообще работает без параметров. Т.е. само понятие класс для него не предусмотрено.

 Так как меню не поддерживает имена классов(в отличие от окна), то можешь просто узнать является ли твой дескриптор указателем на меню с помощью IsMenu.

 Вобщем вывод: Для окон используются только оконные функции, а для меню только функции меню. Другие варианты не поддерживаются потому что окно и меню - это несовместимые между собой объекты.

Ответить

Номер ответа: 2
Автор ответа:
 De.MON



Вопросов: 8
Ответов: 9
 Профиль | | #2 Добавлено: 17.08.04 17:13
С этим ясно, спасибо.

Тогда вопрос №2: а как динамически создать пункт меню (вопрос, наверное, тупой - но всё же...)? CreateObject я использовать не могу, т.к. не знаю имени класса (VB.Menu не катит).

А MSDN у меня нет :-(

Ответить

Номер ответа: 3
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #3
Добавлено: 18.08.04 10:39
http://www.mentalis.org/apilist/InsertMenuItem.shtml

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам