Управление контролом через идентификатор GetDlgCtrlID

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 14.01.2009 (Ср) 13:51

Управление контролом через идентификатор GetDlgCtrlID

Сообщение giaber » 04.10.2017 (Ср) 14:43

Для манипуляций с контролом(окном) мы используем hwnd, а можно ли манипулировать контролом, в частности вписать в него текст (контрол Edit класса) SendMessage-м, используя идентификатор, полученный через GetDlgCtrlID ?
1.
Ну, например, обычно такого типа я делаю:
Call SendMessage(hwnd, WM_SETTEXT, 0, "Hello, World")

а вот что-то типа:
Call SendMessage(CtrlID, WM_SETTEXT, 0, "Hello, World")

возможно?

2. или функция, обратная GetDlgCtrlID(HWND) - получить hwnd контрола, указав идентификатор (ранее полученный через GetDlgCtrlID) ?
3. У меня установлена некая программа. Идентификатор определённого контрола, полученный через GetDlgCtrlID, скажем 1234567. Если установить эту же прогу на другом компе, будет ли идентификатор этого же контрола таким же? Как этот CtrlID вообще работает?

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Управление контролом через идентификатор GetDlgCtrlID

Сообщение VBTerminator » 04.10.2017 (Ср) 19:11

giaber писал(а):... или функция, обратная GetDlgCtrlID(HWND) - получить hwnd контрола, указав идентификатор (ранее полученный через GetDlgCtrlID)?


Да, есть такая, GetDlgItem(). Передаёте в неё дескриптор диалога и идентификатор элемента управления, и в ответ получаете дескриптор этого элемента.

На Visual Basic сигнатура этой функции будет выглядеть так:

Код: Выделить всё
Private Declare Function GetDlgItem Lib "user32.dll" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Управление контролом через идентификатор GetDlgCtrlID

Сообщение giaber » 04.10.2017 (Ср) 22:50

VBTerminator - спасибо за подсказку!

Пытался разобраться с темой GetDlgItem и GetDlgCtrlID - не смог найти инфу вот о чём: контрол имеет дескриптор hWnd и идентификатор, который я могу получить при помощи GetDlgCtrlID, hWnd присваивается новый при каждом запуске программы, а идентификатор остаётся один и тот же при запусках программы. Но! Тут есть 2 варианта:
1. Идентификатор контрола "вшит" в программу/в контрол и при установке одной и той же программы на разных компах всегда будет один и тот же для данного контрола
2. Идентификатор контрола как бы "создаётся" и присваивается контролу при инсталяции программы, и, хотя на данном компе он при запусках программы неизменен, при инсталяции этой же программы на другой комп будет создан заново и будет иным

Более конкретно, в моём случае: делаю макрос для CorelDRAW, для дальнейших манипуляций мне нужен конкретный контрол (класса Edit), таких контролов в интерфейсе до десятка и они ничем не отличаются друг от друга, но на моём компе я знаю идентификатор нужного мне контрола (получен с помощью GetDlgCtrlID) и могу прописать в коде: при нажатии на кнопку запуска макроса при помощи GetDlgItem и известного мне идентификатора найти hWnd контрола и дальше делать с контролом то, что мне нужно, но будет ли у другого пользователя этот контрол иметь тот же идентификатор, будет ли макрос находить этот контрол (при условии что одна и та же версия CorelDRAW и у меня и у другого пользователя) ?

Так каков механизм работы индентификатора?

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: Управление контролом через идентификатор GetDlgCtrlID

Сообщение VBTerminator » 05.10.2017 (Чт) 0:13

Идентификаторы элементов управления жёстко прописываются при описании диалога в файле ресурсов. Такой способ гарантированно используется, если это диалоговые окна самой программы, а не плагинов.

Однако диалог можно создавать и во время выполнения программы (на лету) с помощью функции CreateWindowEx(). В этом случае идентификаторы передаются через параметр hMenu этой функции, а потому гипотетически могут изменяться с каждым запуском программы. На практике же никто так не делает, потому что идентификаторы и их назначение находятся под полным контролем программиста а потому задаются константами.

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Управление контролом через идентификатор GetDlgCtrlID

Сообщение giaber » 05.10.2017 (Чт) 0:40

VBTerminator - ну просто ОГРОМНОЕ вам спасибо!!! Всё буквально разжевали. Спасибо!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 16

    TopList