|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
23.12.2022, 12:40 | #1 |
Форумчанин
Регистрация: 22.01.2014
Сообщений: 313
|
Сообщения окна Windows.
Здравствуйте! Хотел бы поинтересоваться по поводу следующего вопроса: "Если есть основное окно и
несколько дополнительно созданных окон и эти окна одинакового стиля, то получают ли дополнительно созданные окна сообщения WM_SETFOCUS/WM_KILLFOCUS ?" Дело в том, что почему то у меня параметр, который должен появиться в строке состояния, которая при получении/потере фокуса сообщает об это факте, не меняется, если я делаю окно активным. Если при создании(зависимых) окно я задаю им изначально WM_KILLFOCUS, то лишь при выделении одного окна(делаю его активным) меняется сообщение об этом факте, если делаю другое окно активным, то сообщение не меняется, почему? Получается только с основным окном, с ним всё работает замечательно. Очередь у них одна, так? Значит сообщения распределяются из очереди для нужного окна, я прав? Почему тогда так происходит с дочерними окнами. Если взять три окна 1 - это основное, родительское и два других окна, которые с ним связаны 2, 3. Тогда выделяя окно 2, строка состояния окна 1 сообщает об это факте, о потере фокуса, а окно 2 изначально имеет фокус, как так. Выделяя окно 3 у него как был фокус установлен так и остаётся, а фокус окна 2 не меняется, состояние всё ещё указывает, что оно имеет фокус ввода. Если выделить окно 1, то тут всё замечательно, всё работает, как надо. А если установить при регистрации класса окна стиль CS_CLASSDC, CS_OWNDC... это не изменить никак ситуацию, это влияет только на работу с графикой т.е. HDC или на окна управления тоже, они могу стать зависимыми? |
23.12.2022, 14:57 | #2 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
WM_SetFocus и WM_KillFocus это сообщения для окон с возможностью ввода данных (курсором ввода). Для реагирования на активацию обрабатывайте WM_ACTIVATE или AM_ACTIVATEAPP.
|
23.12.2022, 15:40 | #3 | |
Форумчанин
Регистрация: 22.01.2014
Сообщений: 313
|
Цитата:
Получается, если я создал три окна одного класса, то сообщения, которые получает функция этого класса обрабатываются для последнего окна т.е. если созданы окна 1, 2, 3, то отрабатывает так как положено только окно 3, а первые два окна, видимо, пролетают с сообщениями) Если создать процедуру для каждого окна, то всё отработает отлично, я прав? Если я создам в процедуре окна переменную int i; и создам n окон, то когда будет выбираться сообщение из очереди сообщений для, как я полагаю, 1, 2,...., n-ого окна, то для этого окна это будет своя int i; или нет? |
|
23.12.2022, 15:53 | #4 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
Чтобы сообщения WM_SETFOCUS и WM_KILLFOCUS работали так как вы ожидаете, тогда каждое из окно должно обладать фокусом ввода от клавиатуры. Не все окна обладают фокусом ввода. Вы используете не то сообщение для получения информации об активации (судя по описанию выше).
|
23.12.2022, 16:43 | #5 | ||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,528
|
Цитата:
Цитата:
конкретно используемое окно указывается в параметрах(wparam если не ошибаюсь) сообщения.
программа — запись алгоритма на языке понятном транслятору
|
||
24.12.2022, 08:55 | #6 |
Форумчанин
Регистрация: 22.01.2014
Сообщений: 313
|
|
24.12.2022, 17:23 | #7 |
Участник клуба
Регистрация: 17.04.2022
Сообщений: 1,833
|
Если вам надо, чтобы окна реагировали на активацию, тогда WM_ACTIVATE и проверяйте wParam != WA_INACTIVE.
Для окон обладающих фокусом ввода (мигающий курсор) сообщения WM_SETFOCUS активируют курсор в окне, а WM_KILLFOCUS - деактивирует. |
25.12.2022, 06:13 | #8 |
Форумчанин
Регистрация: 22.01.2014
Сообщений: 313
|
Не уверен, что точно понимаю, что имеется ввиду под активацией. Если это, по функционалу, тоже самое что и WM_SETFOCUS/WM_KILLFOCUS, то смысл этого мне не очевиден. Я попробовал и не впечатлился этими функциями, короче говоря, решил более примитивными средствами.
|
25.12.2022, 09:06 | #9 |
Форумчанин
Регистрация: 22.01.2014
Сообщений: 313
|
Интересно, почему вот так может происходить?
Окно1.jpg Сами окна создаю в функции основного окна, панель инструментов в сообщении WM_CREATE: дочернего окна. Код:
|
26.12.2022, 11:38 | #10 |
Форумчанин
Регистрация: 22.01.2014
Сообщений: 313
|
Не знаю можно ли это назвать полноценным решением, но коль других советов нет, то я решил так: создал массив hToolbar[NUMBERWINDOWS] дескрипторов панелей инструментов, и все панели создались, как и положено, а до этого был один дескриптор, видимо, каждое следующее окно затирает какие-то параметры предыдущего, осталось понять какие, почему так происходит!
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Всплывающие сообщения windows | Fakov | Общие вопросы Delphi | 4 | 23.08.2020 08:38 |
Как перехватить оконные сообщения чужого окна? | winner13 | Общие вопросы Delphi | 2 | 14.01.2016 21:02 |
Вывод окна сообщения с пятым словом выделенного фрагмента | merick | Microsoft Office Word | 0 | 31.10.2015 14:14 |
хендл окна сообщения | vanektoo | Общие вопросы Delphi | 3 | 07.11.2008 22:41 |
Как при скрытом чужом окне сделать его дочерние окна(сообщения) видимыми ? | Starwarrior | Win Api | 1 | 20.03.2007 09:51 |