CEdit состояние
От: reider  
Дата: 20.11.20 05:54
Оценка:
Доброго времени суток.
Подскажите как понять готов ли контрол для ввода?
Иными словами хочу понять, как проверить какому контролу будут направляться команда WM_CHAR
Re: CEdit состояние
От: qaz77  
Дата: 20.11.20 07:00
Оценка:
Здравствуйте, reider, Вы писали:

R>Подскажите как понять готов ли контрол для ввода?

R>Иными словами хочу понять, как проверить какому контролу будут направляться команда WM_CHAR

Клавиатурный ввод поступает окну, которое в данный момент владеет фокусом ввода.
Получить такое окно для текущего потока можно функцией WinAPI: HWND GetFocus() или в MFC: static CWnd* CWnd::GetFocus().

Окно при этом должно быть видимо и доступно (enabled).
Также часть клавиатурного ввода может быть перехвачена акселераторами непосредственно в цикле обработки сообщений.
Но то, что транслируется в WM_CHAR обычно не перехватывают.

В MFC можно, например, так сделать:
CEdit* pEditInFocus = DYNAMIC_DOWNCAST(CEdit, CWnd::GetFocus());
if (pEditInFocus) { ... }
Отредактировано 20.11.2020 7:01 qaz77 . Предыдущая версия .
Re[2]: CEdit состояние
От: reider  
Дата: 20.11.20 09:37
Оценка:
Здравствуйте, qaz77, Вы писали:

Q>Здравствуйте, reider, Вы писали:


R>>Подскажите как понять готов ли контрол для ввода?

R>>Иными словами хочу понять, как проверить какому контролу будут направляться команда WM_CHAR

Q>Клавиатурный ввод поступает окну, которое в данный момент владеет фокусом ввода.

Q>Получить такое окно для текущего потока можно функцией WinAPI: HWND GetFocus() или в MFC: static CWnd* CWnd::GetFocus().

Q>Окно при этом должно быть видимо и доступно (enabled).

Q>Также часть клавиатурного ввода может быть перехвачена акселераторами непосредственно в цикле обработки сообщений.
Q>Но то, что транслируется в WM_CHAR обычно не перехватывают.

Q>В MFC можно, например, так сделать:

Q>
Q>CEdit* pEditInFocus = DYNAMIC_DOWNCAST(CEdit, CWnd::GetFocus());
Q>if (pEditInFocus) { ... }
Q>

Спасибо. Это понял.
Сформулирую вопрос так, как определить что CEdit сейчас отрисовывает каретку?
Т.е. если я нажму правой клавишей то появляется мигающая каретка...
Если не щёлкать на контрол то каретку он не отрисывывает.
SetFocus пробовал, но при этом каретка не появляется
Re[3]: CEdit состояние
От: qaz77  
Дата: 20.11.20 09:46
Оценка:
Здравствуйте, reider, Вы писали:

R>Сформулирую вопрос так, как определить что CEdit сейчас отрисовывает каретку?

R>Т.е. если я нажму правой клавишей то появляется мигающая каретка...
R>Если не щёлкать на контрол то каретку он не отрисывывает.
R>SetFocus пробовал, но при этом каретка не появляется

Каретка отображается только при активном родительском окне.
См. SetActiveWindow и SetForegroundWindow.

При мышиных событиях над контролом посылается WM_MOUSEACTIVATE, что по умолчанию приводит к активизации окна-рамки или диалога.

Вообще, каретка — такой же глобальный объект, как указатель мыши.
Надо рассматривать ее поведение с учетом окон других процессов.
Отредактировано 20.11.2020 9:49 qaz77 . Предыдущая версия .
Re[3]: CEdit состояние
От: VladFein США  
Дата: 25.11.20 01:04
Оценка:
Здравствуйте, reider, Вы писали:

R>Если не щёлкать на контрол то каретку он не отрисывывает.

R>SetFocus пробовал, но при этом каретка не появляется

WM_NEXTDLGCTL message
Re[4]: CEdit состояние
От: reider  
Дата: 25.11.20 13:46
Оценка:
Здравствуйте, VladFein, Вы писали:

VF>Здравствуйте, reider, Вы писали:


R>>Если не щёлкать на контрол то каретку он не отрисывывает.

R>>SetFocus пробовал, но при этом каретка не появляется

VF>WM_NEXTDLGCTL message


Спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.