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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2022, 09:02   #11
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Вы не обходные пути ищите, а пытаетесь набрести на выход из леса возможных неправильных решений.
macomics вне форума Ответить с цитированием
Старый 28.10.2022, 09:11   #12
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Как вариант. Создайте окно без рамки и используйте DrawCaption.

Еще на Pascal нашел вот такое обсуждение похожей проблемы на GameDev
macomics вне форума Ответить с цитированием
Старый 28.10.2022, 09:15   #13
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
пытаетесь набрести на выход из леса возможных неправильных решений.
Не один я.
apofioz вне форума Ответить с цитированием
Старый 28.10.2022, 09:25   #14
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Еще на Pascal нашел вот такое обсуждение похожей проблемы на GameDev
Это имеется ввиду DwmExtendFrameIntoClientArea() и.т.д. я про это вчера читал, но врубиться не могу, как с помощью этого функционала решит поставленную задачу, куда пихать DwmDefWindowProc(), если это единственный вариант, то можно попробовать.
apofioz вне форума Ответить с цитированием
Старый 28.10.2022, 10:37   #15
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Я ПРАВИЛЬНО ПОНЯЛ ТО, ЧТО ТАМ НАПИСАНО ИЛИ НЕ СОВСЕМ?
Код:
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	static TCHAR szMyCap[] = TEXT("This my Title");
	static int cxRect, cyCap, cxClient, cyClient, cyFrame, cxFrame, cxBorder, cxChar;
	static long Res;

	switch (msg)
	{
	case WM_CREATE:
	{
		TEXTMETRIC tm;
		HDC hdc = GetDC(hwnd);
		GetTextMetrics(hdc, &tm);
		ReleaseDC(hwnd, hdc);

		cxChar = tm.tmAveCharWidth;

		cxRect = _tcslen(szMyCap) * cxChar * 3;
		cyFrame = GetSystemMetrics(SM_CYFRAME);
		cxFrame = GetSystemMetrics(SM_CXFRAME);
		cxBorder = GetSystemMetrics(SM_CXBORDER);
		cyCap = GetSystemMetrics(SM_CYCAPTION);

		RECT rcWindow;
		GetWindowRect(hwnd, &rcWindow);

		/*SetWindowPos(hwnd, 0, rcWindow.left, rcWindow.top,
			RECTWIDTH(rcWindow), RECTHEIGHT(rcWindow),
			SWP_FRAMECHANGED);
		fCallDWP = true;
		lRet = 0;*/

		return 0;
	}
	case WM_NCACTIVATE:
	{
		MARGINS margins = { 0 };
		margins.cyTopHeight = 32;
		DwmExtendFrameIntoClientArea(hwnd, &margins);
		break;
	}
	//case WM_MOVE:
	case WM_SIZE:
	{
		SetWindowPos(hwnd, 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE |
			                              SWP_NOSIZE | SWP_NOZORDER);
		return 0;
	}
	case WM_NCCALCSIZE:
	{
		if (wParam == 0)
		{
			Res = DefWindowProc(hwnd, msg, wParam, lParam);
		}
		else
		{
			LPRECT(lParam)->right  -= cxFrame;
			LPRECT(lParam)->bottom -= cxFrame;
			LPRECT(lParam)->left   += cyFrame;
			Res = 0;
		}
		break;
	}
	case WM_NCPAINT:
	{
		HRGN hReg = (HRGN)wParam;

		HDC hdc = GetDCEx(hwnd, hReg, DCX_WINDOW | DCX_INTERSECTRGN);
		

		UINT oldcolor = SetTextColor(hdc, RGB(255, 0, 0));
		UINT oldbk = SetBkColor(hdc, TRANSPARENT);
		
		TextOut(hdc, cyCap+cyFrame, 3 * cyFrame / 2, szMyCap, _tcslen(szMyCap));
		HPEN hPenG = CreatePen(PS_SOLID, 1, RGB(0, 255, 0));
		HPEN hPenB = CreatePen(PS_SOLID, 1, RGB(0, 0, 255));

		HPEN hOldPenG = (HPEN)SelectObject(hdc, hPenG);
		int left = cyCap + cyFrame + cxRect;
		Rectangle(hdc, left + 10, 3 * cyFrame / 2, left + cxRect, cyCap);

		HPEN hOldPenB = (HPEN)SelectObject(hdc, hPenB);
		Ellipse(hdc, left + 11, 3 * cyFrame / 2, left + 11 + cxRect - 1, cyCap - 1);
		SetTextColor(hdc, oldcolor);
		SetBkColor(hdc, oldbk);
		

		SelectObject(hdc, hOldPenG);
		SelectObject(hdc, hOldPenB);
		DeleteObject(hPenG);
		DeleteObject(hPenB);

		ReleaseDC(hwnd, hdc);
		break;
	}
	
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd, msg, wParam, lParam);
}
apofioz вне форума Ответить с цитированием
Старый 28.10.2022, 11:29   #16
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Не понимаю, что делать в WM_NCHITTEST:
Код:
case WM_NCHITTEST:
	{
		Res = !DwmDefWindowProc(hwnd, msg, wParam, lParam, &lRes);
		
		break;
	}
Возможно, в случае, если функция выполнилась успешно нужно проверить параметр lRes, но на что, а если функция завершилась ошибкой, тогда что, просто вернуть управление ОС через DefWindowProc()?
Что это за ... с чем их едят, я сам понять не смогу, ну или на это потребуется много времени, вообще не понятно что куда писать(((

Последний раз редактировалось apofioz; 28.10.2022 в 14:12.
apofioz вне форума Ответить с цитированием
Старый 28.10.2022, 16:12   #17
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Не понимаю, что делать в WM_NCHITTEST:
WM_NCHITTEST служит для определения попадания по элементу окна. Вам надо на основании координат курсора, которые однозначно попадают по окну (в GetWindowRect), определить на какой из служебных элементов попал курсор или ответить, что он в клиентской области.

ADD: Служебными элементами являются не только 3 стандартные кнопки, но и иконка (как активатор menu), границы и углы окна.

ADD2: Еще сам заголовок забыл - за него перетаскивание осуществляется. А лучше выучите хотя бы неколько английских слов. Название у этого сообщение говорящее. Hit - касание. Из перевода названия следует, что сообщение служит для определения попадания по элементу окна.

Последний раз редактировалось macomics; 28.10.2022 в 16:18.
macomics вне форума Ответить с цитированием
Старый 29.10.2022, 06:06   #18
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
А лучше выучите хотя бы неколько английских слов.
А это обязательно, обязательно упрекать в чём-то, выучу и что легче станет. И да, это можно перевести как "попадание", его в некоторой литературе так и переводят Hit test - "тест попадания". А вообще я спрашивал не об этом, но это так, мелочи, правда.
apofioz вне форума Ответить с цитированием
Старый 29.10.2022, 11:56   #19
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Я вам словами описал что делать. Определять по координатам курсора элемент окна и возвращать в результате константу, которая ему соответствует.
macomics вне форума Ответить с цитированием
Старый 30.10.2022, 06:38   #20
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Я вам словами описал что делать.
Выше вы писал, что нужно всего-то сделать:
Код:
case WM_NCPAINT:
	{
		HRGN hReg = (HRGN)wParam;
		HDC hdc = GetDCEx(hwnd, hReg, DCX_WINDOW | DCX_INTERSECTRGN);

		UINT oldcolor = SetTextColor(hdc, RGB(255, 0, 0));
		UINT oldbk = SetBkColor(hdc, TRANSPARENT);
		
		TextOut(hdc, cyCap+cyFrame, 3 * cyFrame / 2, szMyCap, _tcslen(szMyCap));
		ReleaseDC(hwnd, hdc);
		break;
	}
Правда не сработало.
Теперь нужно отловить что-то в hittest, но что конкретно, не ясно, и, если я отловлю, то что дальше, вывод делать какой функцией, явно, что TextOut, в данном случае, не работает.
Зачем тогда писали, точнее давали ссылку на Dwm-функции?Они уже не нужны или всё же их нужно использовать...


Цитата:
Сообщение от macomics Посмотреть сообщение
Определять по координатам курсора элемент окна и возвращать в результате константу, которая ему соответствует.
По координатам, ну не знаю, там вроде бы, должно получать через wParam идентификатор области, где курсор находится или всё же нужен именно клик...
Код:
case WM_NCHITTEST:
	{
		//так как интерес представляет заголовок, то, думаю, что нужно
		//отлавливать именно это сообщение....
		if(wParam == HTCAPTION)
		{
			//do something
		}
		break;
	}
apofioz вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Unicode-заголовок окна Maks1978 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 10 26.09.2011 14:49
заголовок окна s1s1s1 Общие вопросы Delphi 1 06.02.2010 22:49
Заголовок окна doniyor Общие вопросы Delphi 3 14.07.2009 01:23
Ник и заголовок окна Патрон Общие вопросы Delphi 9 12.04.2008 20:39
Заголовок у окна Михаил Юрьевич Общие вопросы Delphi 1 22.02.2008 00:08