5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
|
|
1 | |
TextBox получает фокус, но печатать в нем не получается27.04.2011, 18:14. Показов 3876. Ответов 22
Метки нет (Все метки)
Такая проблема:
Создаю диалог с помощью DialogBox, на нем есть два текстовых поля и две кнопки. Надо чтобы при открытии этого диалога можно было сразу печатать в первом поле. В событии WM_INITDIALOG я делаю SetFocus на первое поле. Когда окно появляется, курсор стоит в этом поле, но про вводе текста ничего не происходит. Если кликнуть мышкой на этом поле и снова ввести текст, то он вводится нормально. В последствии можно переходить из поля в поле только с клавиатурой и все вводится нормально. Как добиться того, чтобы ввод был доступен уже при открытии окна?
0
|
27.04.2011, 18:14 | |
Ответы с готовыми решениями:
22
ListBox не получает фокус Другое окно Excel не получает фокус TextEdit не получает фокус внутри StackView Почему при переходе на TAB Label не получает фокус |
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(...),пропишите:
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 | |
10.05.2011, 15:41 | |
Помогаю со студенческими работами здесь
20
Если в textbox введено меньше 3 символов и фокус снимается с textbox, то вывод ошибки При нажатии на кнопку в элементе списка, сам элемент не получает фокус php получает только данные того editbox'а, в котором сейчас фокус Вызов автозаполнения когда элемент ввода получает фокус (jquery autocomplete plugin) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |