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

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

Пароль



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

Забыли пароль?
Запросите новый здесь.
Темы форума
187 - Bullet Heaven
Вчера, 20:39
 Mefistofel
187 - ?
21.11.2024
 Dan
Galactic Showdown -…
21.10.2024
 KregHek
Новый IGDC
5.08.2024
 rimush
186 - Strategy!
15.07.2024
 VoroneTZ
WoL
3.07.2024
 Darthman
Привет выжившие
21.05.2024
 GeePee
185 - RPG
9.02.2024
 Vaskrol
В каком банке открыт…
24.01.2024
 Darthman
185 - ?
30.12.2023
 Mefistofel
Сейчас на сайте
Гостей: 11
На сайте нет зарегистрированных пользователей

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Опубликовано 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 применить ПОСЛЕ создания окна, то окна ввода не будет видно, так же не будет видно вводимых символов. А если перед, то от функции нету толку, что теперь?
Bullet Heaven:Не участвую.
Demilivor
Avatar пользователя

Опубликовано 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 вызывал стандартную функцию окна :))))
Bullet Heaven:Не участвую.
Doj
Avatar пользователя

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

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

Старт: 23 ноября 2024г.
Финиш: 4 декабря 2024г.

Участники: 4
Недавние конкурсы:
 186 - Strategy
 185 - RPG XII
 184 - Arcade II
 183 - Novel
 182 - RPG XI
 Все конкурсы
Случайная игра
Мини-чат
Вам необходимо залогиниться.

Архив чата

26,203,758 уникальных посетителей

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