Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2022, 12:40   #1
apofioz
Форумчанин
 
Регистрация: 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 или на окна управления тоже, они могу стать зависимыми?
apofioz вне форума Ответить с цитированием
Старый 23.12.2022, 14:57   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

WM_SetFocus и WM_KillFocus это сообщения для окон с возможностью ввода данных (курсором ввода). Для реагирования на активацию обрабатывайте WM_ACTIVATE или AM_ACTIVATEAPP.
macomics вне форума Ответить с цитированием
Старый 23.12.2022, 15:40   #3
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Для реагирования на активацию обрабатывайте WM_ACTIVATE или AM_ACTIVATEAPP.
Что имеется ввиду, определить дескриптор окна? Т.е. Эти сообщения срабатывают, когда окна создаются или когда они получают/теряют фокус ввода. Я полагал, что если создаются окна, то это что-то, что похожее на отдельный объект, как если бы создать n-ое количество классов у них свои данные для каждого объекта свои))
Получается, если я создал три окна одного класса, то сообщения, которые получает функция этого класса обрабатываются для последнего окна т.е. если созданы окна 1, 2, 3, то отрабатывает так как положено только окно 3, а первые два окна, видимо, пролетают с сообщениями)
Если создать процедуру для каждого окна, то всё отработает отлично, я прав?
Если я создам в процедуре окна переменную int i; и создам n окон, то когда будет выбираться сообщение из очереди сообщений для, как я полагаю, 1, 2,...., n-ого окна, то для этого окна это будет своя int i; или нет?
apofioz вне форума Ответить с цитированием
Старый 23.12.2022, 15:53   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Чтобы сообщения WM_SETFOCUS и WM_KILLFOCUS работали так как вы ожидаете, тогда каждое из окно должно обладать фокусом ввода от клавиатуры. Не все окна обладают фокусом ввода. Вы используете не то сообщение для получения информации об активации (судя по описанию выше).
macomics вне форума Ответить с цитированием
Старый 23.12.2022, 16:43   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Если создать процедуру для каждого окна
Цитата:
и эти окна одинакового стиля
процедуры создаются не для окна, а стилякласса окна.
конкретно используемое окно указывается в параметрах(wparam если не ошибаюсь) сообщения.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 24.12.2022, 08:55   #6
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Вы используете не то сообщение для получения информации об активации
Какое тогда то, WM_ACTIVATE, что ли?
apofioz вне форума Ответить с цитированием
Старый 24.12.2022, 17:23   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Какое тогда то, WM_ACTIVATE, что ли?
Если вам надо, чтобы окна реагировали на активацию, тогда WM_ACTIVATE и проверяйте wParam != WA_INACTIVE.
Для окон обладающих фокусом ввода (мигающий курсор) сообщения WM_SETFOCUS активируют курсор в окне, а WM_KILLFOCUS - деактивирует.
macomics вне форума Ответить с цитированием
Старый 25.12.2022, 06:13   #8
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Если вам надо, чтобы окна реагировали на активацию, тогда WM_ACTIVATE и проверяйте wParam != WA_INACTIVE.
Не уверен, что точно понимаю, что имеется ввиду под активацией. Если это, по функционалу, тоже самое что и WM_SETFOCUS/WM_KILLFOCUS, то смысл этого мне не очевиден. Я попробовал и не впечатлился этими функциями, короче говоря, решил более примитивными средствами.
apofioz вне форума Ответить с цитированием
Старый 25.12.2022, 09:06   #9
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Интересно, почему вот так может происходить?
Окно1.jpg

Сами окна создаю в функции основного окна, панель инструментов в сообщении WM_CREATE: дочернего окна.
Код:
LRESULT CALLBACK PopProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	//.......................
case WM_CREATE:
	{
		hMainMenu = CreateMenu();
		SetMenu(hwnd, hMainMenu);

		hFileMenu = CreatePopupMenu(File, 4, MFT_STRING,
			MFS_ENABLED, CM_FILE_NEW);
		hEditMenu = CreatePopupMenu(Edit, 3, MFT_STRING,
			MFS_ENABLED, CM_EDIT_CUT);
		hViewMenu = CreatePopupMenu(View, 3, MFT_STRING,
			MFS_ENABLED, CM_VIEW_REDOW);
		AttachToMainMenu(hMainMenu, hFileMenu, TEXT("FILE"), 0);
		AttachToMainMenu(hMainMenu, hEditMenu, TEXT("EDIT"), 1);
		AttachToMainMenu(hMainMenu, hViewMenu, TEXT("VIEW"), 2);

		DrawMenuBar(hwnd);

		but[0].fsStyle = TBSTYLE_SEP;

		but[1].iBitmap = STD_FILENEW;
		but[1].idCommand = CM_FILE_NEW;
		but[1].fsState = TBSTATE_ENABLED;
		but[1].fsStyle = TBSTYLE_BUTTON;

		but[2].iBitmap = STD_FILEOPEN;
		but[2].idCommand = CM_FILE_OPEN;
		but[2].fsState = TBSTATE_ENABLED;
		but[2].fsStyle = TBSTYLE_BUTTON;
		
		//.......
		
		but[8].iBitmap = STD_REPLACE;
		but[8].idCommand = CM_VIEW_REPLACE;
		but[8].fsState = TBSTATE_ENABLED;
		but[8].fsStyle = TBSTYLE_BUTTON;

		but[9].iBitmap = STD_UNDO;
		but[9].idCommand = CM_VIEW_UNDO;
		but[9].fsState = TBSTATE_ENABLED;
		but[9].fsStyle = TBSTYLE_BUTTON;

		hToolbar = CreateToolbarEx(hwnd, WS_CHILD | WS_VISIBLE |
			WS_DLGFRAME, 0,
			ID_TOOLBAR, HINST_COMMCTRL,
			IDB_STD_LARGE_COLOR,
			but, 10, 0, 0, 0, 0,
			sizeof(TBBUTTON));
		return 0;
	}
	case WM_SIZE:
	{
		MoveWindow(hToolbar, 0, 0, 0, 0, TRUE);
		return 0;
	}
	//...................
}
CreatePopupMenu и AttachToMainMenu - это самопальные функции, первая создаёт группу меню и возвращает дескриптор этой группы строк. Вторая подключает временное/всплывающее меню к главному меню.
apofioz вне форума Ответить с цитированием
Старый 26.12.2022, 11:38   #10
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Не знаю можно ли это назвать полноценным решением, но коль других советов нет, то я решил так: создал массив hToolbar[NUMBERWINDOWS] дескрипторов панелей инструментов, и все панели создались, как и положено, а до этого был один дескриптор, видимо, каждое следующее окно затирает какие-то параметры предыдущего, осталось понять какие, почему так происходит!
apofioz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Всплывающие сообщения 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