Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вызов собственного контекстного меню для "IP address control"

28K
07 июля 2008 года
Tirpitz
32 / / 05.05.2008
При попытке обрабатывать щелчок правой кнопой мыши на элементе управления "IP address control" оказалось, что сообщение WM_RBUTTONUP посылается процедуре обработки сообщений этого элемента управления только тогда, когда щелчок был сделан, например, на разделительной точке между двумя октетами IP-адреса. А сами октеты - это, похоже, четыре отдельных "Edit box". Но как тогда до них добраться и заменить их стандартное контекстное меню ("Копировать", "Вставить" и т.д.) на свое?
3.7K
07 июля 2008 года
0nni
326 / / 24.06.2008
Никогда бы не поверил если бы сам по проверил - это действительно 4 edit-а :eek:
Могу посоветовать функции GetWindow и GetWindowEx и еще вот эту штуку Borland\Delphi7\Bin\WS32.EXE
3.7K
07 июля 2008 года
0nni
326 / / 24.06.2008
И кстати для вызова меню лучше использовать сообщение WM_CONTEXTMENU
28K
08 июля 2008 года
Tirpitz
32 / / 05.05.2008
Пробовал найти все дочерние окна функцией EnumChildWindows(), но получил только один HWND - для последнего октета. Что такое первые три октета - пока неизвестно. Буду разбираться дальше.
3.7K
08 июля 2008 года
0nni
326 / / 24.06.2008
Цитата: Tirpitz
Пробовал найти все дочерние окна функцией EnumChildWindows(), но получил только один HWND - для последнего октета. Что такое первые три октета - пока неизвестно. Буду разбираться дальше.



Хм, а у меня получилось, только почему-то в обратном порядке:

Код:
var edit1, edit2, edit3, edit4, IpEdit : Cardinal;
begin
  IpEdit := CreateWindow('SysIPAddress32',
                         nil,
                         WS_VISIBLE or WS_CHILD,
                         5, 5, 135, 25,
                         handle,
                         0,
                         HInstance,
                         nil);
  edit1 := GetWindow(IpEdit, GW_CHILD);
  edit2 := GetWindow(edit1, GW_HWNDNEXT);
  edit3 := GetWindow(edit2, GW_HWNDNEXT);
  edit4 := GetWindow(edit3, GW_HWNDNEXT);

  SetWindowText(edit1, 'd');
  SetWindowText(edit2, 'c');
  SetWindowText(edit3, 'b');
  SetWindowText(edit4, 'a');
28K
09 июля 2008 года
Tirpitz
32 / / 05.05.2008
Последнее сообщение от 0nni вселило уверенность, что все-таки можно побороть IP address control. Почитал в MSDN про GetWindow(), и вот что там написано в разделе Remarks:
Цитата:
The EnumChildWindows function is more reliable than calling GetWindow in a loop.

Почитав и про функцию EnumChildWindows(), я понял почему получал только один HWND вместо четырех: возвращаемым значением моей функции, в которую по очереди передаются хэндлы дочерних окон, я сделал 0. А в описании EnumChildWindows() сказано:

Цитата:
EnumChildWindows continues until the last child window is enumerated or the callback function returns FALSE

В общем, поменял возвращаемое значение с 0 на TRUE и получил четыре вызова своей функции с четырьмя хэндлами в обратном порядке - для 4-го, 3-го, 2-го и 1-го октетов. Кстати, если послать сообщение IPM_GETADDRESS, то в DWORD'е, адрес которого указывпется в параметре lParam посылаемого сообщения, IP адрес будет записан также в обратном порядке: 1-ый октет в битах 24-31, 2-ой - в битах 16-23, 3-ий - в битах 8-15, и 4-ый - в битах 0-7. Возможно, это как-то связано с тем, что в вычислительной технике используется порядок байтов Little Endian, а в сетях - Big Endian.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог