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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2022, 07:58   #21
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Или всё же это код ближе к сути?
Код:
case WM_NCHITTEST:
{
		//get the point coordinates for hit test
	point ptmouse = { loword(lparam), hiword(lparam) };

		//get the window rectangle
	rect rcwindow;
	getwindowrect(hwnd, &rcwindow);

		//get the frame rectangle, adjusted for the  style without a caption
	rect rcframe = { 0 };
	adjustwindowrectex(&rcframe, ws_overlappedwindow & ~ws_caption, false, null);

	ushort urow = 1;
	ushort ucol = 1;
	bool fonresizeborder = false;

	//determain if the points is at the top or bottom of the window
	if (ptmouse.y >= rcwindow.top && ptmouse.y < rcwindow.top + topextendwidth)
	{
		fonresizeborder = (ptmouse.y < (rcwindow.top - rcframe.top));
		urow = 0;
	}
	else if (ptmouse.y < rcwindow.bottom && ptmouse.y >= rcwindow.bottom + bottomextendwidth)
	{
		urow = 2;
	}

	//determain if the points is at the left or right of the window
	if (ptmouse.x >= rcwindow.left && ptmouse.x < rcwindow.left + leftextendwidth)
	{
		ucol = 0; //left side
	}
	else if (ptmouse.x < rcwindow.right && ptmouse.x >= rcwindow.right + rightextendwidth)
	{
		ucol = 2; //right side
	}

	//hit test (httopleft....htbottomright)
	lresult hittests[3][3] =
	{
		{httopleft, fonresizeborder ? httop : htcaption, httopright},
		{htleft, htnowhere, htright},
		{htbottomleft, htbottom, htbottomright}
	};

	if (hittests[urow][ucol] == htnowhere)
	{
		res = dwmdefwindowproc(hwnd, msg, wparam, lparam, &lres);
	}

	 break;
}
apofioz вне форума Ответить с цитированием
Старый 30.10.2022, 12:55   #22
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Результатом сообщения WM_NCHITTEST должен быть ответ для системы на вопрос о попадании по одному из элементов на системной области окна (рамка (8 направлений изменения размеров), иконка (системное меню), заголовок (перетаскивание), одна из системных кнопок (помощь, свернуть, развернуть, закрыть) или клиентская часть).

В зависимости от того, какой результат вы вернете из этого сообщения, такая функция и будет задействована далее. Например, чтобы перетаскивать окно за любую его часть, достаточно всегда в ответ на WM_NCHITTEST возвращать константу заголовка.

А через параметр lParam вам как раз передают координаты курсора для проверки.

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

Цитата:
Сообщение от macomics Посмотреть сообщение
В зависимости от того, какой результат вы вернете из этого сообщения, такая функция и будет задействована далее.
Значит код выше всё же правильный или частично правильный. Я не пойму, что мне нужно вернуть, если мне надо вывести текст, свои предположения я высказал, может для начала нужно определиться, что нужно вернуть в данной конкретной ситуации... И нужно ли здесь, в этом сообщении, использовать функцию DwmDefWindowProc(hwnd, msg, wparam, lparam, &lres);?
Код:
if (hittests[urow][ucol] == htnowhere)
	{
		return DwmDefWindowProc(hwnd, msg, wparam, lparam, &lres);
	}
break;

Цитата:
Сообщение от macomics Посмотреть сообщение
А через параметр lParam вам как раз передают координаты курсора для проверки.
Я их использую, но wParam он же тоже несёт смысловую нагрузку, что-то возвращает, мне кажется, это как раз HT_* КОНСТАНТЫ.
apofioz вне форума Ответить с цитированием
Старый 30.10.2022, 13:35   #24
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Вот такую функцию я нашёл, которая, в принципе, должна выводить текст, но не выводит.
Код:
void DrawTextTitleBar(HWND hWnd, HDC hdc)
{
    RECT rcClient;

    RECT rect, rectCaptionButtonBounds;
    GetClientRect(hWnd, &rcClient);

    RECT rcCap = { 0 };
    bool isVisible = true;
    DwmGetWindowAttribute(hWnd, DWMWA_CAPTION_BUTTON_BOUNDS, &rcCap, sizeof(rcCap));
    DwmSetWindowAttribute(hWnd, DWMWA_ALLOW_NCPAINT, &isVisible, sizeof(isVisible));

    //L"CompositedWindow::Window"
    HTHEME hTheme = OpenThemeData(NULL, TEXT("TextStyle"));
    if (hTheme)
    {
        HDC hdcPaint = CreateCompatibleDC(hdc);
        if (hdcPaint)
        {
            int cx = RECTWIDTH(rcClient);
            int cy = RECTHEIGHT(rcClient);

            // Define the BITMAPINFO structure used to draw text.
            // Note that biHeight is negative. This is done because
            // DrawThemeTextEx() needs the bitmap to be in top-to-bottom
            // order.
            BITMAPINFO dib = { 0 };
            dib.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
            dib.bmiHeader.biWidth = cx;
            dib.bmiHeader.biHeight = -cy;
            dib.bmiHeader.biPlanes = 1;
            dib.bmiHeader.biBitCount = 32;
            dib.bmiHeader.biCompression = BI_RGB;

            HBITMAP hbm = CreateDIBSection(hdc, &dib, DIB_RGB_COLORS, NULL, NULL, 0);
            if (hbm)
            {
                HBITMAP hbmOld = (HBITMAP)SelectObject(hdcPaint, hbm);

                // Setup the theme drawing options.
                DTTOPTS DttOpts = { sizeof(DTTOPTS) };
                DttOpts.dwFlags = DTT_COMPOSITED | DTT_GLOWSIZE;
                DttOpts.iGlowSize = 15;

                // Select a font.
                LOGFONT lgFont;
                HFONT hFontOld = NULL;
                if (SUCCEEDED(GetThemeSysFont(hTheme, TMT_CAPTIONFONT, &lgFont)))
                {
                    HFONT hFont = CreateFontIndirect(&lgFont);
                    hFontOld = (HFONT)SelectObject(hdcPaint, hFont);
                }

                // Draw the title.
                RECT rcPaint = rcClient;
                rcPaint.top += 6; //8
                rcPaint.right -= 125;
                rcPaint.left += 40; //8
                rcPaint.bottom = 30; //50
                DrawThemeTextEx(hTheme,
                    hdcPaint,
                    WP_CAPTION, 0,
                    TEXT("Custom Title"),
                    -1,
                    /*DT_LEFT | DT_WORD_ELLIPSIS*/DT_LEFT | DT_VCENTER | DT_SINGLELINE,
                    &rcPaint,
                    &DttOpts);

                // Blit text to the frame.
                BitBlt(hdc, 0, 0, cx, cy, hdcPaint, 0, 0, SRCCOPY);

                SelectObject(hdcPaint, hbmOld);
                if (hFontOld)
                {
                    SelectObject(hdcPaint, hFontOld);
                }
                DeleteObject(hbm);
            }
            DeleteDC(hdcPaint);
        }
        CloseThemeData(hTheme);
    }
}
apofioz вне форума Ответить с цитированием
Старый 31.10.2022, 14:27   #25
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Задал всё окно, как рабочую область, но теперь иконка пропала, а текст так и не печатается, иконку нужно выводить так же используя функции uxtheme.h?
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