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