Как отключить фокус редактирования элемента управления при первом запуске Dialog?

Привет всем, кто читает это. Спасибо заранее за ваше время.

Одна вещь перед вопросом: я не использую ни MFC, ни Windows Forms, только WinApi в C ++.

Ну, я делаю полиномиальный калькулятор в Visual C ++. Я добавил диалог, который был создан в ресурсах (.rc файл), используя метод drag’n’drop. Я полагаю, что не было бы такой проблемы, если бы я создал свой диалог с CreateWindowEx (но я не хочу).

Мой диалог имеет несколько элементов управления редактированием. Все хорошо, за исключением того, что, когда диалог запускается, один из элементов управления Edit получает фокус быть готовым к вводу с клавиатуры.

Я включил управление EN_KILLFOCUS (Edit отправляет его родителю, когда теряет фокус из-за выбора другого элемента управления).

Здесь я прочитал от контроля к wstring (строка широких символов — _UNICODE определено), используйте какой-то парсер для проверки этого wstring и удалите плохие символы, а затем поместите правильную строку в тот же элемент управления редактирования. Работает нормально, но вот источник моей проблемы:

Когда не было ввода, парсер возвращает string "0" (не NULL, строка просто установлена ​​на «0»), как будто элемент управления имел фокус, а затем потерял его даже до того, как я нажал на что-нибудь в диалоге.

В связи с этим и что-то другое (это то, что я должен выяснить), при запуске анализатор Dialog ставит это string "0" редактировать.

Я хочу, чтобы моя правка не могла принимать ввод с клавиатуры, пока я не нажму одну из правок (включая эту).
Если это невозможно, я хочу очистить весь текст в начале диалога (возможность ввода не является проблемой, я просто хочу запретить ввод парсера string "0" в начале)
Мой код:

В DlgProc у меня есть:

//up here is switch to manage all controls
case MyEditID:                // here is ID of one of my edits from resources
switch (HIWORD(wParam))
{
case EN_KILLFOCUS:        // edit lost focus - another control selected

if (LOWORD(wParam)==MyEditID)  //necessary to determine if
// one of allowed Edits sent this message
// because I have also other Edits
{
GetDlgItemText(hPanel, LOWORD(wParam), MyTempWcharArray, 100);
MyTempString.assign(MyTempWcharArray);

w1 = polynomial(MyTempWcharArray); // parser takes the string
// and removes bad chars in constructor
// polynomial is my class - you don't have to care of it
// w1 is declared before as object of polynomial class

MyTempString = w1.ConversionToString();
SetDlgItemText(hDialog, LOWORD(wParam), sw1);
}
break;
}
break;

имеет ли значение, какое целое число установлено в ID редактора?

я знаю SetFocus(), а также WM_SETFOCUS сообщение. В этом случае я просто не могу заставить это работать.

Если я не включил что-то важное, чтобы вы поняли мою точку зрения, пожалуйста, дайте мне знать. Извини я просто новичок в WinAPI Мир.

РЕДАКТИРОВАТЬ:
Для тех, у кого похожая проблема: Не делайте этого:
Я сделал обходной путь с глобальной переменной ProcessKillFocus, установленной в false, указывая, что инструкции по управлению сообщениями не должны обрабатываться, за исключением того, что в конце (непосредственно перед прерыванием;) я изменяю его на true, поэтому в следующий раз и позже он будет обработан:

case EN_KILLFOCUS:
if (ProcessKillFocus && LOWORD(wParam)==MyEditID)
{
// first time global ProcessKillFocus is false so all this is skipped
// 2nd time and later do all the stuff
}
ProcessKillFocus = true;
break;

Огромное спасибо Шейросу Адикари за то, что он легко понял мой вопрос !!!
Огромное спасибо патриотам за простой ответ на огромный беспорядочный вопрос !!!

ОТВЕТ:
Кстати: патриотизм, я попробовал это:

case WM_INITDIALOG:
SetFocus(GetDlgItem(hDialog, Desired_Control_ID));
return (INT_PTR)FALSE;
break;

ЭТО ПРОСТО РАБОТАЕТ !!!

3

Решение

Вы должны вернуть FALSE WM_INITDIALOG сообщение и установите правильный фокус самостоятельно.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector