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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2022, 12:19   #1
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
Сообщение Вывод текста в заголовок окна.

Здравствуйте! Хотелось бы получить ответ на такой вопрос, если требуется нарисовать фигуру или вывести текст не в клиентскую область окна, то нужно, что? Я делал так.

Код:
#include<windows.h>
#include<tchar.h>
 
BOOL RegClass(WNDPROC, LPCTSTR, UINT);
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
TCHAR szMainClass[] = TEXT("_MainClass_");
TCHAR szTitle[] = TEXT("MyCaption color");
 
HINSTANCE hInstance = NULL;
 
int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    MSG msg = { };
    HWND hwnd = NULL;
    hInstance = hInst;
 
    if (!RegClass(WndProc, szMainClass, COLOR_WINDOW))
        return 0;
 
    if (!(hwnd = CreateWindow(szMainClass, NULL,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT,
        0, NULL, hInstance, 0)))
    {
        return 0;
    }
 
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
 
    while (GetMessage(&msg, NULL, 0, 0))
    {
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
 
BOOL RegClass(WNDPROC proc, LPCTSTR szName, UINT brBackground)
{
    WNDCLASS wc = { };
    wc.style = CS_VREDRAW | CS_HREDRAW;
    wc.cbClsExtra = wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.lpfnWndProc = proc;
    wc.lpszClassName = szName;
    wc.lpszMenuName = (LPCTSTR)NULL;
    wc.hbrBackground = (HBRUSH)(brBackground + 1);
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
 
    return (RegisterClass(&wc) != 0);
}
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static TCHAR szMyCap[] = TEXT("This my Title");
    static int cxRect, cyCap, cyFrame, cxChar;
 
    switch (msg)
    {
    case WM_CREATE:
    {
        TEXTMETRIC tm;
        HDC hdc = GetDC(hwnd);
        GetTextMetrics(hdc, &tm);
        ReleaseDC(hwnd, hdc);
 
        cxRect = _tcslen(szMyCap) * cxChar * 3;
        cyFrame = GetSystemMetrics(SM_CYFRAME);
        cyCap = GetSystemMetrics(SM_CYCAPTION);
        return 0;
    }
    case WM_MOVE:
    case WM_SIZE:
    {
        HDC hdc = GetWindowDC(hwnd);
        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);
        return 0;
    }
    /*case WM_NCPAINT:
    {
        HDC hdc = GetWindowDC(hwnd);
        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);
}
У меня установлена windows 10 и, насколько я понял, начиная с Windows vista так просто вывести текст в заголовок нельзя? Хотя функция SetWindowsText() всё же выводится текст, без проблем, но, к сожалению, мне ещё нужно вывести две геометрические фигуры туда же. Ничего внятного пока не нашёл, на русскоязычных ресурсах, точно, что нужно в данном случае делать, что использовать и так как тема про API, желательно что бы это что-то было тоже API.)
apofioz вне форума Ответить с цитированием
Старый 27.10.2022, 15:36   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

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

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

Если кроме текста вам надо еще что-то нарисовать, тогда это WM_NCPAINT. Тогда вы получите возможность рисовать на рамке окна. Судя по описанию того, что вам надо - это можно сделать только так. Спец функции для вывода графики на заголовок окна нету.

Я вам не просто так прислал ссылку. Там показан пример, как получить hDC для рисования на рамке окна.
Цитата:
Код:
case WM_NCPAINT:
{
    HDC hdc;
    hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN);
    // Добавьте свой код рисования здесь
    ReleaseDC(hwnd, hdc);
}
И в вашем примере я не нашел ничего подобного.

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

Цитата:
Сообщение от macomics Посмотреть сообщение
И в вашем примере я не нашел ничего подобного.
Код:
case WM_NCPAINT:
    {
        HDC hdc = GetWindowDC(hwnd);
        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;
    }
Единственное, что я делал не так это получал контекст устройства иначе, а так глухо, ничего не получается.
GetDCEx - я не пробовал, и, даже, не читал о ней, получал с помощью GetWindowDC(), как описано в книге.


Цитата:
Сообщение от macomics Посмотреть сообщение
Если кроме текста вам надо еще что-то нарисовать
Да, прямоугольник и эллипс причем эллипс должен быть внутри прямоугольника , ну и цвета задать разные для фигур и текста.


Цитата:
Сообщение от macomics Посмотреть сообщение
Спец функции для вывода графики на заголовок окна нету.
Что-то же должно быть, может быть, не совсем стандартное хак какой-нибудь...)

А кажется простейшим заданием, да уж(
apofioz вне форума Ответить с цитированием
Старый 28.10.2022, 07:32   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Достаточно получить нужный hdc с регионом отсечения включающим рамку окна. А это и делает GetDCEx
macomics вне форума Ответить с цитированием
Старый 28.10.2022, 07:39   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Код:
case WM_NCPAINT:
    {
        HDC hdc = GetWindowDC(hwnd);
        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;
    }
1) Это был комментарий.
2) Раз hdc получен другим способом, тогда это не подобное моему примеру с GetDCEx.
macomics вне форума Ответить с цитированием
Старый 28.10.2022, 08:07   #8
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Достаточно получить нужный hdc с регионом отсечения включающим рамку окна. А это и делает GetDCEx
Ничего, всё глухо, как в танке.
Код:
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);
		 //sendmessage(hwnd, wm_print, (wparam)hdc, (lparam)lfp_nonclient);
		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;
	}

Цитата:
Сообщение от macomics Посмотреть сообщение
Раз hdc получен другим способом, тогда это не подобное моему примеру с GetDCEx.
Вот теперь получен, как желали, но безрезультатно.

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

Не то. Я посчитал не правильно.
macomics вне форума Ответить с цитированием
Старый 28.10.2022, 08:37   #10
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Что вообще такое, почему такой геморрой вывести данные в заголовок окна, что случилось? Что за улучшения такие, которые заставляют искать обходные пути к казалось бы тривиальной задаче...
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