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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2022, 11:30   #1
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию Работа с объектами управления Windows!

ЗДРАВСТВУЙТЕ! Снова возникли трудности следующего характера, имеется вот такая сверхзадача)
Задача6.png
По клику мышки кнопка с надписью "Клавиши отжаты" исчезает, кнопка с надписью "Клавиша нажата" появляется, но исчезать не хочет оно и понятно окно не получает сообщения WM_LBUTTONUP/WM_RBUTTONUP, а как сделать так, чтобы кнопка отреагировала, я не знаю. Собственно, чисто интуитивно я понимаю, что в блоке WM_COMMAND нужно обработать аналог WM_LBUTTONUP/WM_RBUTTONUP, но как..., я ведь не кликаю по кнопке, а наоборот отпускаю клавишу мыши, что-то в голову ничего не приходит. да и со всеми сообщениями, оповещениями объектов управления Windows не могу до конца разобраться... Объекты управления имеют свои классы, значит у них имеются свои функции т.е. если я посылаю сообщение
Код:
SendMessage(hButton, BM_*, 0, 0L)
, то мне нужно ловить оповещение BN_* и могу ли я отправить такое SendMessage(hButton, WM_LBUTTONDOWN, 0, 0L), если да, то как это отрабатывать, функция объекта управления вернёт родительской функции WM_LBUTTONDOWN или что?

Вот код:
Код:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	static HWND hButton1, hButton2;
	static int  cxButton = 120, cyButton = 20;
	static int cxClient, cyClient, left, top;
	static RECT rc;
	switch (msg)
	{
	case WM_CREATE:
		GetClientRect(hwnd, &rc);
		cxClient = rc.right;
		cyClient = rc.bottom;
		hButton1 = CreateWindow(szButtonClass,
			TEXT("Keys unpushed"),
			WS_CHILD | WS_VISIBLE |
			BS_PUSHBUTTON,
			cxClient - cxButton,
			top, cxButton, cyButton,
			hwnd, (HMENU)ID_BUTTON1,
			hInstance, NULL);
		hButton2 = CreateWindow(szButtonClass,
			TEXT("Key pushed"),
			WS_CHILD | BS_PUSHBUTTON,
			0, 0,
			cxButton, cyButton,
			hwnd, (HMENU)ID_BUTTON1,
			hInstance, NULL);
		ShowWindow(hButton2, SW_HIDE);
		return 0;
	case WM_SIZE:
		cxClient = LOWORD(lParam);
		cyClient = HIWORD(lParam);
		return 0;
	case WM_MOVE:
		left = LOWORD(lParam);
		top = HIWORD(lParam);
		return 0;
	case WM_LBUTTONDOWN:
	case WM_RBUTTONDOWN:
		ShowWindow(hButton1, SW_HIDE);
		MoveWindow(hButton2, LOWORD(lParam) - (cxButton >> 1),
			HIWORD(lParam) - (cyButton >> 1),
			cxButton, cyButton, TRUE);
		ShowWindow(hButton2, SW_SHOW);

		//SetFocus(hButton2);
		return 0;
	case WM_LBUTTONUP:
	case WM_RBUTTONUP:
		ShowWindow(hButton2, SW_HIDE);
		ShowWindow(hButton1, SW_SHOWNORMAL);
		
		return 0;
	case WM_COMMAND:
	{
		switch (LOWORD(wParam))
		{
			case ID_BUTTON2:
			{
				
				return 0;
			}
			case ID_BUTTON1:
			{
				return 0;
			}
			default:
				break;
		}
		return 0;
	}
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd, msg, wParam, lParam);
}
apofioz вне форума Ответить с цитированием
Старый 13.09.2022, 11:43   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

См. TrackMouseEvents
macomics вне форума Ответить с цитированием
Старый 13.09.2022, 13:18   #3
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
См. TrackMouseEvents
Как и в прошлый раз, та же самая функция, как оказалось можно было решить куда элегантнее. Я таких функций не изучал, в том материале, который я прошёл на данный момент её точно нет. Уверен, что есть куда более простое решение.
Я на данный момент решил так:
Код:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	static HWND hButton1, hButton2;
	static int  cxButton = 120, cyButton = 20;
	static int cxClient, cyClient, left, top;
	static RECT rc;
	switch (msg)
	{
	case WM_CREATE:
		GetClientRect(hwnd, &rc);
		cxClient = rc.right;
		cyClient = rc.bottom;
		hButton1 = CreateWindow(szButtonClass,
			TEXT("Keys unpushed"),
			WS_CHILD | WS_VISIBLE |
			BS_PUSHBUTTON,
			cxClient - cxButton,
			top, cxButton, cyButton,
			hwnd, (HMENU)ID_BUTTON1,
			hInstance, NULL);
		hButton2 = CreateWindow(szButtonClass,
			TEXT("Key pushed"),
			WS_CHILD | BS_PUSHBUTTON,
			0, 0,
			cxButton, cyButton,
			hwnd, (HMENU)ID_BUTTON2,
			hInstance, NULL);
		ShowWindow(hButton2, SW_HIDE);
		return 0;
	case WM_SIZE:
		cxClient = LOWORD(lParam);
		cyClient = HIWORD(lParam);
		return 0;
	case WM_MOVE:
		left = LOWORD(lParam);
		top = HIWORD(lParam);
		return 0;
	case WM_LBUTTONDOWN:
	case WM_RBUTTONDOWN:
		ShowWindow(hButton1, SW_HIDE);
		MoveWindow(hButton2, LOWORD(lParam) - (cxButton >> 1),
			HIWORD(lParam) - (cyButton >> 1),
			cxButton, cyButton, TRUE);
		
		SetCapture(hwnd);
		ShowWindow(hButton2, SW_SHOW);
		
		return 0;
	case WM_LBUTTONUP:
	case WM_RBUTTONUP:
		ShowWindow(hButton2, SW_HIDE);
		ShowWindow(hButton1, SW_SHOWNORMAL);
		ReleaseCapture();
		return 0;
	
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd, msg, wParam, lParam);
}
Но, по возможности, хотелось бы увидеть ещё варианты и разобраться с органами управления, все эти сообщения, уведомления брр...
apofioz вне форума Ответить с цитированием
Старый 13.09.2022, 13:55   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

А что вам не нравится в TrackMouseEvent. После вызова этой функции вы просто продолжите получать сообщения от мыши даже когда курсор будет вне окна или над другим окном. Пока вы в очередной раз не вызовете эту функцию, чтобы отменить получение сообщений от мыши вне рамок клиентской области окна.

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

Хотя вы используете SetCapture и ReleaseCapture, а они в свою очередь ссылаются на TrackMouseEvent.

Последний раз редактировалось macomics; 13.09.2022 в 13:57.
macomics вне форума Ответить с цитированием
Старый 14.09.2022, 05:21   #5
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Хотя вы используете SetCapture и ReleaseCapture
Да, я об этом знаю, а хотелось бы что-либо увидеть с сообщениями мыши и кнопки, пример бы, на тему взаимодействия сообщений кнопки и мыши, если такое возможно.


Цитата:
Сообщение от macomics Посмотреть сообщение
А что вам не нравится в TrackMouseEvent.
Я написал, что не нравится выше.
apofioz вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с COM объектами в UAPP Windows 10 baikal C# (си шарп) 0 07.11.2015 06:14
Прошу помочь - передача управления между объектами внутри формы IgorSHV Microsoft Office Excel 3 22.10.2015 19:12
Рaбота з объектами ядра Windows. andriy1992p Win Api 10 03.09.2011 22:28
работа с объектами управления форм (кнопки) kursant95 Microsoft Office Excel 3 28.01.2011 14:17
Работа с объектами Windows c0zak Помощь студентам 6 06.11.2009 14:05