Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/19: Рейтинг темы: голосов - 19, средняя оценка - 4.89
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
1

TextBox получает фокус, но печатать в нем не получается

27.04.2011, 18:14. Показов 3876. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Такая проблема:

Создаю диалог с помощью DialogBox, на нем есть два текстовых поля и две кнопки.
Надо чтобы при открытии этого диалога можно было сразу печатать в первом поле.

В событии WM_INITDIALOG я делаю SetFocus на первое поле.
Когда окно появляется, курсор стоит в этом поле, но про вводе текста ничего не происходит.
Если кликнуть мышкой на этом поле и снова ввести текст, то он вводится нормально. В последствии можно переходить из поля в поле только с клавиатурой и все вводится нормально.

Как добиться того, чтобы ввод был доступен уже при открытии окна?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.04.2011, 18:14
Ответы с готовыми решениями:

ListBox не получает фокус
Привет. У меня при получении и потере ЛистБоксом фокуса должен выполняться код. Код я написал в...

Другое окно Excel не получает фокус
В файле "Обработка.xls" - макрос В ячейке задается имя книги "Продажи рубли" Присваивается...

TextEdit не получает фокус внутри StackView
Привет! Внутри StackView есть компонент внутри которого есть TextEdit с установленным фокусом true....

Почему при переходе на TAB Label не получает фокус
Несколько вопросов как с помощью клавиши ТАВ переключиться на оюъъект Label(TAB index я...

22
85 / 61 / 69
Регистрация: 15.03.2007
Сообщений: 6,906
27.04.2011, 18:59 2
Лучше это делать с помощью события WM_NEXTDLGCTL
http://weblogs.asp.net/oldnewthing/archive/2004/08/02/205624.aspx
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
30.04.2011, 14:47  [ТС] 3
Заменил вызов, вместо SetFocus(hwndControl)
вставил SendMessage(hdlg, WM_NEXTDLGCTL, (WPARAM)hwndControl, TRUE);
резултат тот же, курсор стоит в нужном сонтроле, но вносить данные нельзя.
Есть другое решение? Может этот вызов надо поместить в другое место, не в WM_INITDIALOG ?
0
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
01.05.2011, 01:43 4
Предлагаю поставить SetFocus(hwndControl) в WM_SHOWWINDOW
0
0 / 2 / 1
Регистрация: 14.02.2011
Сообщений: 100
01.05.2011, 07:29 5
что возвращает OnInitDialog?
Поменяй возвращаемое на FALSE.
0
0 / 2 / 1
Регистрация: 14.02.2011
Сообщений: 100
01.05.2011, 08:56 6
Прошу прощения.
Сразу не въехал в вопрос, мой ответ справедлив только при использовании CDialog из MFC.
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
07.05.2011, 11:35  [ТС] 7
К сожалению помещение SetFocus в событие WM_SHOWWINDOW не дало никакого результата, текст бокс по-прежнему не принимает ввод.
Что интересно, я поместил в событие WM_SHOWWINDOW обычный MessageBox. Так вот после того как он закрывается контроли на моей форме начинают принимать ввод.
Получается, что MessageBox перехватывает активность и возвращает его моей форме после закрытия (это понятно). Вопрос, почему моя форма не активизируется сама?
Я даже пробовал делать SetFocus на саму форму, но это тоже не помогло.
Помогите, проблема не критическая, но довольно раздражающая.
0
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
07.05.2011, 15:28 8
Забавно,сообразить в чем дело пока не могу.Проверил у себя.Фокус попадает на эдит, на диалог.Проверял в Mfc,Api.
Предлагаю Вам сгенерить новый проект и проверить на нем.А потом сравнить со своим созданием диалога.
Или код создания сюда на форум.Будем все вместе разбираться.
0
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
07.05.2011, 16:00 9
А может по завершению функции в которой вызывается Ваш диалог с едитом,фокус возвращаеться в радительское окно или ещё куда?
По какой месаге зоздаёться диалог с едитом?
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
07.05.2011, 16:24  [ТС] 10
Я запускаю свой диалог из программы-сервиса, у которого есть доступ работы с десктопом.
Так как у этой программы нет основного окна, я открываю свой диалог без параметра hWnd родительского окна.
Может ли быть в этом проблема, если да то как обойти ее?

Пример запуска:

int iRes = DialogBox(hInstance, MAKEINTRESOURCE(IDD_DLG), NULL, (DLGPROC)DlgProc);
0
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
07.05.2011, 17:24 11
Так давайте поподробнее.Что-то я не пойму.У Вас вообще нет никаких окон?
Вот,к примеру если на Api не регистрировать ни одного WNDCLASS и ни каких окон,то ни DialogBox ни CreateDialog не пройдут.
Тогда,как у Вас диалог появляеться?
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
07.05.2011, 17:38  [ТС] 12
Никаких окон я не регистрирую и не создаю.
Программа запускается в качестве Service с функции main (даже не WinMain).
В процессе выполнения создаются несколько потоков.
По требованию одного из потоков может быть открыт диалог. (вызов см. выше).
Чтобы получить Instance текущей программы делаю:

HMODULE hInstance = GetModuleHandle(NULL);
и вызываю
int iRes = DialogBox(hInstance, MAKEINTRESOURCE(IDD_DLG), NULL, (DLGPROC)DlgProc);

после чего поток продолжает свое выполнение.
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
07.05.2011, 17:40  [ТС] 13
Да хотел добавить, что диалог создается и прекрасно выполняет все что надо, вот только не получает фокус.
0
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
07.05.2011, 20:17 14
То что у Вас все работает,но только фокус не попадает - это я понял.
Просто у меня как я не делал всегда фокус на диалоге.
Может,что-то не так в DLGPROC.Хотя,мало вероятно.
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
08.05.2011, 13:55  [ТС] 15
Так что же мне делать?
0
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
09.05.2011, 01:15 16
'Сухори сушить.'

Давайте 'потыркаемся':
1.Ф-цию int iRes = DialogBox(hInstance, MAKEINTRESOURCE(IDD_DLG), NULL, (DLGPROC)DlgProc);
поставте её куда-нибуть в другое место,например в main.Посмотрите,что произойдёт...
2.Ещё попробуйте int iRes = DialogBox(hInstance, MAKEINTRESOURCE(IDD_DLG), NULL, NULL);,что там получиться.
3.Запустите таймер на несколько секунд,чтоб скажем через 5 сек. после WM_SHOWWINDOW ,срабатывала ф-ция SetFocus(...);

Должен фокус попасть на диалог.
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
09.05.2011, 20:30  [ТС] 17
Происходит нечто невероятное:
Я взял следующие две строки

HMODULE hInstance = GetModuleHandle(NULL);
int pswCheck = DialogBox(hInstance, MAKEINTRESOURCE(IDD_DLG),
NULL, (DLGPROC)DlgProc);

и перетаскивал их из функции в функцию, из потока в поток (их у меня несколько) и всегда при открытии текст бокс имеет фокус и можно вносить данные в него, и только там где надо он не срабатывает.
Пытался дублировать вызов DialogBox один за другим - при первом вызове ввода нет, после закрытия диалога появляется второй в котором ввод работает ?!

Эти две строки стоят первыми в функции вызываемой при CreateThread.
Создание потока ничем не отличается от других потоков, в которых этот вызов работал хорошо.

К стати, моя програма получает зарос на открытие этого диалога (создание потока) от другой программы по TCP. Сама вызываемая програма имеет подобный эффект. При открытии окна курсор имеет знак часов (хотя ни один контроль не устанавливает такой) и окно не активное. После того как кликаю мышкой на окне оно активизируется и часы пропадают.
Но связи я не вижу, т.к. запрос идет не напрямую а через сокет.

Что происходит ???????????
0
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
10.05.2011, 01:53 18
Так 'тырканье' привело к неожиданным результатам
Фиг его знает,что происходит.Я то не вижу
Есть ещё одна мысль - а ля 'тырканье'.
Перед DialogBox(...),пропишите:
C++
1
2
3
MSG msg;
while (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{TranslateMessage(&msg);DispatchMessage(&msg);}
Может поможет.
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
10.05.2011, 14:32  [ТС] 19
Не помогло.
0
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
10.05.2011, 15:41 20
Так,хорошо.
А если сделать не через DialogBox(...),а через CreateDialog(...).
Что будет ?
0
10.05.2011, 15:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.05.2011, 15:41
Помогаю со студенческими работами здесь

Если в textbox введено меньше 3 символов и фокус снимается с textbox, то вывод ошибки
если в textbox введено меньше 3 символов и пользователь вышел за границы textbox то вывести ошибку...

При нажатии на кнопку в элементе списка, сам элемент не получает фокус
Здравствуйте, у меня в окне отображается список, каждый элемент списка визуализирует сущность: ...

php получает только данные того editbox'а, в котором сейчас фокус
Тупой наверно вопрос, но все же. Я столкнулся с такой проблемой - у меня несколько editbox'сов в...

Вызов автозаполнения когда элемент ввода получает фокус (jquery autocomplete plugin)
Помогите с задачей: Нужно чтобы плагин autocomplete вызывался не только при наборе первых...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru