Навигация
Поддержать материально
Steam Greenlight

Логотипы
Медальки
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Темы форума
192 - ?
Вчера, 20:24
 Mefistofel
191 - RPG XIII
27.02.2026
 Mefistofel
.ruby
22.02.2026
 stom
Насколько серьезно в…
19.02.2026
 VoroneTZ
191 - ?
14.02.2026
 PapkaI_Igrodel
Итоги 2025 года
11.02.2026
 Darthman
Создание игровых рес…
26.01.2026
 Darthman
190 - Horror
14.01.2026
 Mefistofel
190 - ?
5.12.2025
 Erewego
Будущее IGDC
16.11.2025
 kott
Сейчас на сайте
Гостей: 2
На сайте нет зарегистрированных пользователей

Пользователей: 1,794
новичок: stom
Обсуждение «Нажатая клавиша в EDIT»
Demilivor
Avatar пользователя

Опубликовано 10.07.2009 06:12 (17 лет назад)    #
Здравствуйте помогите пожалуйста.
как отследить введенный символ в Edit(Или хотяб нажатую клавишу)

Edit - стандартный hwnd класса окна "edit"

(Visual studio c++)
RPG XIIII:Не участвую.
Doj
Avatar пользователя

Опубликовано 10.07.2009 15:43 (17 лет назад)    #
Может переопределить оконную функцию у этого Edit и попробовать ловить WM_KEYDOWN/WM_CHAR ?
RPG XIIII:Не участвую.
Bce_OK
Avatar пользователя

Опубликовано 11.07.2009 00:43 (17 лет назад)    #
ну тоже самое уже сделано. на OnKeyDown там в параметр Key передается клавиша
RPG XIIII:Не участвую.
Demilivor
Avatar пользователя

Опубликовано 11.07.2009 06:35 (17 лет назад)    #
Все_ок
эм... в визуал студио Нет TEdit
это не борланд с++. где все для пользователя уже сделано.
Doj
А как переопределять оконную функцию у edit?

RPG XIIII:Не участвую.
Doj
Avatar пользователя

Опубликовано 11.07.2009 09:06 (17 лет назад)    #
Как-то так (я скорее всего в синтаксисе преобразования типов налажал):
(int)def_func_edit = SetWindowLong(edit, GWL_WNDPROC, (int)&new_func_edit);
Уточни в msdn.
RPG XIIII:Не участвую.
Demilivor
Avatar пользователя

Опубликовано 11.07.2009 09:53 (17 лет назад)    #
эм... все равно не понимаю :) В МСДН про edit... что то читал )) но она на аглийском )) не понял я про функцию setWindowlong
пожалуйста напишите код.. который будет отлавливать введение символов A и B если не A и B то отменить выполненные изменения EM_UNDO
Так просто будет понятно.
RPG XIIII:Не участвую.
Doj
Avatar пользователя

Опубликовано 11.07.2009 10:24 (17 лет назад)    #
В мсдн'е нужно читать не про edit, а про SetWindowLong:
http://msdn.microsoft.com/en-us/library/ms633591(VS.85).aspx

Кроме той строчки, что я тебе написал, еще нужно написать функцию new_func_edit, которая будет обрабатывать сообщения приходящие edit'у - пишется она совершенно идентично аналогичной функции для главного окна.
RPG XIIII:Не участвую.
Demilivor
Avatar пользователя

Опубликовано 11.07.2009 12:18 (17 лет назад)    #
насколько я понял...
стандартные события WM_XXXXXXX (например WM_KEYDOWN ) будут действовать на окне edit? значит можно удалить обработку в родительском окне?
в WM_COMAND
RPG XIIII:Не участвую.
Doj
Avatar пользователя

Опубликовано 11.07.2009 13:37 (17 лет назад)    #
стандартные события WM_XXXXXXX (например WM_KEYDOWN ) будут действовать на окне edit?

Да, когда edit будет в фокусе.
значит можно удалить обработку в родительском окне? в WM_COMMAND

Это зависит.
Но в отлове нажатия клавиш WM_COMMAND точно не сможет помочь.

редакция от Doj, 11.07.2009 13:38

RPG XIIII:Не участвую.
Demilivor
Avatar пользователя

Опубликовано 12.07.2009 00:29 (17 лет назад)    #
Спасибо Doj ))) буду тестить))
RPG XIIII:Не участвую.
Demilivor
Avatar пользователя

Опубликовано 12.07.2009 01:33 (17 лет назад)    #
Ну вот )))) был близко к решению поставленной задачи, но встретил проблему
EdHWND = CreateWindow( "edit", NULL,
eStyles, XPos, YPos, XLenght, YLenght,
Parent, (HMENU) eID, hInstance, NULL);
SetWindowLong( EdHWND, GWL_WNDPROC, (int)&EditWNDFunc );

Еслис SetWindowLong применить ПОСЛЕ создания окна, то окна ввода не будет видно, так же не будет видно вводимых символов. А если перед, то от функции нету толку, что теперь?
RPG XIIII:Не участвую.
Demilivor
Avatar пользователя

Опубликовано 12.07.2009 02:04 (17 лет назад)    #
Все! Тему можно закрывать.
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 вызывал стандартную функцию окна :))))
RPG XIIII:Не участвую.
Doj
Avatar пользователя

Опубликовано 12.07.2009 07:35 (17 лет назад)    #
Demilivor
По идее функция SetWindowLong должна вернуть указатель на старую функцию обработки (которую ты хранишь в oldEdF), поэтому можно обойтись без вызова GetWindowLong.
RPG XIIII:Не участвую.
Demilivor
Avatar пользователя

Опубликовано 12.07.2009 13:08 (17 лет назад)    #
Doj
Да, работает, еще раз спасибо.
RPG XIIII:Не участвую.
Перейти на форум:
Конкурсы
Открытые конкурсы:
RPG XIIII
Подведение результатов...

Старт: 31 января 2026г.
Финиш: 23 февраля 2026г.

Участники: 3
Недавние конкурсы:
 190 - Horror
 189 - Race V
 188 - RPG XIII
 187 - Bullet Heaven
 186 - Strategy
 Все конкурсы
Случайная игра
Голосование

Кто сделал лучшую RPG?

PapkaI_Igrodel
75% [3 Голосов]
Erewego
25% [1 Голос]

Голосов: 4
Начало: 24.02.2026 21:44

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

Архив чата

28,166,517 уникальных посетителей

Создано на базе русской версии PHP-Fusion copyright © 2003-2006 by Nick Jones.
Released as free software under the terms of the GNU/GPL license.