|
Опубликовано 10.07.2009 06:12 (15 лет назад) # |
Здравствуйте помогите пожалуйста.
как отследить введенный символ в Edit(Или хотяб нажатую клавишу)
Edit - стандартный hwnd класса окна "edit"
(Visual studio c++) |
|
|
|
Опубликовано 10.07.2009 15:43 (15 лет назад) # |
Может переопределить оконную функцию у этого Edit и попробовать ловить WM_KEYDOWN/WM_CHAR ? |
|
|
|
Опубликовано 11.07.2009 00:43 (15 лет назад) # |
ну тоже самое уже сделано. на OnKeyDown там в параметр Key передается клавиша |
|
|
|
Опубликовано 11.07.2009 06:35 (15 лет назад) # |
Все_ок
эм... в визуал студио Нет TEdit
это не борланд с++. где все для пользователя уже сделано.
Doj
А как переопределять оконную функцию у edit?
|
|
|
|
Опубликовано 11.07.2009 09:06 (15 лет назад) # |
Как-то так (я скорее всего в синтаксисе преобразования типов налажал):
(int)def_func_edit = SetWindowLong(edit, GWL_WNDPROC, (int)&new_func_edit);
Уточни в msdn. |
|
|
|
Опубликовано 11.07.2009 09:53 (15 лет назад) # |
эм... все равно не понимаю :) В МСДН про edit... что то читал )) но она на аглийском )) не понял я про функцию setWindowlong
пожалуйста напишите код.. который будет отлавливать введение символов A и B если не A и B то отменить выполненные изменения EM_UNDO
Так просто будет понятно. |
|
|
|
Опубликовано 11.07.2009 10:24 (15 лет назад) # |
В мсдн'е нужно читать не про edit, а про SetWindowLong:
http://msdn.microsoft.com/en-us/library/ms633591(VS.85).aspx
Кроме той строчки, что я тебе написал, еще нужно написать функцию new_func_edit, которая будет обрабатывать сообщения приходящие edit'у - пишется она совершенно идентично аналогичной функции для главного окна. |
|
|
|
Опубликовано 11.07.2009 12:18 (15 лет назад) # |
насколько я понял...
стандартные события WM_XXXXXXX (например WM_KEYDOWN ) будут действовать на окне edit? значит можно удалить обработку в родительском окне?
в WM_COMAND |
|
|
|
Опубликовано 11.07.2009 13:37 (15 лет назад) # |
стандартные события WM_XXXXXXX (например WM_KEYDOWN ) будут действовать на окне edit?
Да, когда edit будет в фокусе.
значит можно удалить обработку в родительском окне? в WM_COMMAND
Это зависит.
Но в отлове нажатия клавиш WM_COMMAND точно не сможет помочь.
редакция от Doj, 11.07.2009 13:38 |
|
|
|
Опубликовано 12.07.2009 00:29 (15 лет назад) # |
Спасибо Doj ))) буду тестить)) |
|
|
|
Опубликовано 12.07.2009 01:33 (15 лет назад) # |
Ну вот )))) был близко к решению поставленной задачи, но встретил проблему
EdHWND = CreateWindow( "edit", NULL,
eStyles, XPos, YPos, XLenght, YLenght,
Parent, (HMENU) eID, hInstance, NULL);
SetWindowLong( EdHWND, GWL_WNDPROC, (int)&EditWNDFunc );
Еслис SetWindowLong применить ПОСЛЕ создания окна, то окна ввода не будет видно, так же не будет видно вводимых символов. А если перед, то от функции нету толку, что теперь?
|
|
|
|
Опубликовано 12.07.2009 02:04 (15 лет назад) # |
Все! Тему можно закрывать.
EdHWND = CreateWindow( "edit", NULL,
eStyles, XPos, YPos, XLenght, YLenght,
Parent, (HMENU) eID, hInstance, NULL);
oldEdF = (WNDPROC)GetWindowLong(EdHWND, GWL_WNDPROC);
SetWindowLong( EdHWND, GWL_WNDPROC, (int)&EditWNDFunc );
Я вместо oldEdF вызывал стандартную функцию окна :)))) |
|
|
|
Опубликовано 12.07.2009 07:35 (15 лет назад) # |
Demilivor
По идее функция SetWindowLong должна вернуть указатель на старую функцию обработки (которую ты хранишь в oldEdF), поэтому можно обойтись без вызова GetWindowLong. |
|
|
|
Опубликовано 12.07.2009 13:08 (15 лет назад) # |
Doj
Да, работает, еще раз спасибо. |
|
|