Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблема с реализацией цветовых схем на WinAPI. / 13 сообщений из 13, страница 1 из 1
24.07.2019, 11:46
    #39840873
flammmable
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с реализацией цветовых схем на WinAPI.
Я пытаюсь добавить в приложение возможность менять цветовые схемы. В частности - для меню. Но внизу меню есть линия, которая не рисуется цветом MenuInfo.hbrBack. Если курсор мыши находится над элементами, часть этой линии перерисовывается. Но если я изменю размер окна, линия вернется. А в области меню, где нет пунктов, линия нарисована постоянно. Как я могу навсегда закрасить эту линию?

Вот как это выглядит:
https://i.ibb.co/1Zrc5YK/Line.png

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
#include <windows.h> 

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

struct
{
    COLORREF text = RGB(200, 200, 250);
    COLORREF clientBorder = RGB(120, 0, 0); 
    COLORREF clientBackground = RGB(100, 100, 100);
    COLORREF itemBorder = RGB(0, 0, 255);
    COLORREF itemBackground = RGB(0, 120, 0);
    COLORREF pink = RGB(255, 0, 255);
} colorTheme;

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;

    WNDCLASSEX wc;
    wc.cbSize = sizeof(wc);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "MainWindow";
    wc.cbWndExtra = NULL;
    wc.cbClsExtra = NULL;
    wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
    wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = CreateSolidBrush(colorTheme.clientBackground);
    wc.hInstance = hInst;

    RegisterClassEx(&wc);

    HWND hMainWnd = CreateWindow(
        "MainWindow",
        "MainWindow",
        WS_OVERLAPPEDWINDOW,
        100, 100, 450, 120,
        (HWND)NULL, NULL, HINSTANCE(hInst), NULL);

    HMENU hMenu = CreateMenu();
    HMENU hMenuSub1 = CreatePopupMenu();
    HMENU hMenuSub2 = CreatePopupMenu();
    HMENU hMenuSub3 = CreatePopupMenu();
    AppendMenu(hMenu, MF_OWNERDRAW | MF_POPUP, (UINT)hMenuSub1, "SubMenu1");
    AppendMenu(hMenuSub1, MF_OWNERDRAW, 0, "Item01");
    AppendMenu(hMenuSub1, MF_OWNERDRAW, 0, "Item02");
    AppendMenu(hMenuSub1, MF_OWNERDRAW, 0, "Item03");
    AppendMenu(hMenuSub1, MF_OWNERDRAW, 0, "Item04");
    AppendMenu(hMenuSub1, MF_OWNERDRAW, 0, "Item05");
    AppendMenu(hMenu, MF_OWNERDRAW | MF_POPUP, (UINT)hMenuSub2, "SubMenu2");
    AppendMenu(hMenu, MF_OWNERDRAW | MF_POPUP, (UINT)hMenuSub3, "SubMenu3");

    MENUINFO menuInfo;
    menuInfo.cbSize = sizeof(menuInfo);
    menuInfo.fMask = MIM_BACKGROUND;
    menuInfo.hbrBack = CreateSolidBrush(colorTheme.pink);
    SetMenuInfo(hMenu, &menuInfo);
    SetMenu(hMainWnd, hMenu);

    ShowWindow(hMainWnd, nCmdShow);

    while (GetMessage(&msg, NULL, NULL, NULL)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg) {
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hDC = BeginPaint(hWnd, &ps);

        HFONT hApplicationFont;
        LOGFONT applicationFont;
        applicationFont.lfHeight = 16;
        applicationFont.lfWidth = 6;
        applicationFont.lfEscapement = 0;
        applicationFont.lfOrientation = 0;
        applicationFont.lfWeight = FW_NORMAL;
        applicationFont.lfItalic = FALSE;
        applicationFont.lfUnderline = FALSE;
        applicationFont.lfStrikeOut = FALSE;
        applicationFont.lfCharSet = DEFAULT_CHARSET;
        applicationFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
        applicationFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
        applicationFont.lfQuality = ANTIALIASED_QUALITY;
        applicationFont.lfPitchAndFamily = DEFAULT_PITCH;
        strcpy_s(applicationFont.lfFaceName, "Arial");
        hApplicationFont = CreateFontIndirectA(&applicationFont);
        SelectObject(hDC, hApplicationFont);

        SelectObject(hDC, GetStockObject(DC_PEN));
        SetDCPenColor(hDC, colorTheme.clientBorder);
        SelectObject(hDC, GetStockObject(DC_BRUSH));
        SetDCBrushColor(hDC, colorTheme.clientBackground);
        RECT clientRect;
        GetClientRect(hWnd, &clientRect);
        Rectangle(hDC, 0, 0, clientRect.right, clientRect.bottom);

        EndPaint(hWnd, &ps);
        break;
    }
    case WM_MEASUREITEM:
    {
        LPMEASUREITEMSTRUCT itemStruct = (LPMEASUREITEMSTRUCT)lParam;
        const char* str = (const char*)(itemStruct->itemData);
        SIZE strSize;
        HDC hDC = GetDC(hWnd);          
        GetTextExtentPoint32(hDC, str, lstrlen(str), &strSize);
        itemStruct->itemWidth = strSize.cx;
        itemStruct->itemHeight = 30;
        ReleaseDC(hWnd, hDC);

        return TRUE;
        break;
    }
    case WM_DRAWITEM:
    {
        LPDRAWITEMSTRUCT itemStruct = (LPDRAWITEMSTRUCT)lParam;
        HDC hDC = itemStruct->hDC;
        SelectObject(hDC, GetStockObject(DC_PEN));
        SetDCPenColor(hDC, colorTheme.itemBorder);
        SelectObject(hDC, GetStockObject(DC_BRUSH));
        SetDCBrushColor(hDC, colorTheme.itemBackground);
        SetTextColor(hDC, colorTheme.text);
        SetBkMode(hDC, TRANSPARENT);

        Rectangle(hDC, itemStruct->rcItem.left,
                       itemStruct->rcItem.top,
                       itemStruct->rcItem.right,
                       itemStruct->rcItem.bottom + 1);
        DrawText(hDC, (const char*)(itemStruct->itemData), -1, &(itemStruct->rcItem), DT_SINGLELINE | DT_CENTER | DT_VCENTER);
        break;
    }
    case WM_DESTROY:
    {
        PostQuitMessage(NULL);
        break;
    }
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
    return NULL;
}
...
Рейтинг: 0 / 0
24.07.2019, 11:58
    #39840883
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с реализацией цветовых схем на WinAPI.
flammmableНо внизу меню есть линия, которая не рисуется цветом MenuInfo.hbrBack.

А не кусок ли это твоего Rectangle из WM_DRAWITEM?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.07.2019, 12:01
    #39840886
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с реализацией цветовых схем на WinAPI.
flammmable,

Кастомизация неклиентской области главного окна это мутная тема - там куча оптимизаций в стандартных библиотеках. Проблема в том что все прямые прорисовки прикрыть практически невозможно. Я просто кучу часов провёл за изучением этой части исходников 2000-й, это трындец, а в новых версиях явно ещё дописали.
Кастомизировать меню качественно, что бы работало на всех популярных Windows, можно только полностью подменив меню на что ни будь своё.
...
Рейтинг: 0 / 0
24.07.2019, 12:11
    #39840897
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с реализацией цветовых схем на WinAPI.
А главное что этого лучше вообще не делать. Ибо когда ты потратил кучу времени чтобы
заставить винду выглядеть так, как ты хочешь, то всегда найдётся чудак, который будет
продвигать свои (обычно совершенно дикие) дизайнерские идеи в одном отдельно взятом
приложении. И это бесит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.07.2019, 12:23
    #39840904
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с реализацией цветовых схем на WinAPI.
Dimitry Sibiryakov,
И при смене шрифтов юзверем наверно все поползет.
...
Рейтинг: 0 / 0
24.07.2019, 12:40
    #39840913
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с реализацией цветовых схем на WinAPI.
PetroNotC SharpИ при смене шрифтов юзверем

Я и говорю от лица пользователя. Который потратил кучу времени, настраивая высоту, цвет и
шрифт заголовков окна. А потом залетает какой-нибудь огнедятел и гордо рисует на месте
заголовка своё дурацкое меню. С чёрными буквами на тёмно-синем фоне.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.07.2019, 12:48
    #39840915
flammmable
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с реализацией цветовых схем на WinAPI.
Dimitry SibiryakovА не кусок ли это твоего Rectangle из WM_DRAWITEM?..
Никак нет.
Во-первых, полный Rectangle из WM_DRAWITEM отрисовывается, если навести на него мышь и на картинке мышь наведена на SubMenu2.
Во-вторых, в области закрашенной розовым, элементов меню нет и ни один Rectangle из WM_DRAWITEM там соответственно не отрисовывается вообще. За цвет той области отвечает MenuInfo.hbrBack и красит её при помощи какой-то магии. Но как видно, не очень хорошо.

kealon(Ruslan)Кастомизация неклиентской области главного окна это мутная тема
Это я уже процентов на 5% прочувствовал ))
kealon(Ruslan)при смене шрифтов юзверем наверно все поползет.
При смене пополезет, да. Но шрифт нельзя будет менять, так что не полезет. )) Однако должна быть возможность установить приложению тему Drakula/Monokai/Solorized и т.д., что бы когда пользователь из своей IDE с модной тёмной цветовой темой запускал бы мое приложение, у него не кровоточили бы глаза.

Ну и фреймворк типа Electron на 60Мб для пары кнопок и одного айтемЛист не хотелось бы использовать. А хотелось бы, что бы был один маленький экзешник, стартующий за 0,1сек.
Но это уже - такое, флейм.
...
Рейтинг: 0 / 0
24.07.2019, 12:55
    #39840919
PetroNotC Sharp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с реализацией цветовых схем на WinAPI.
flammmableНо шрифт нельзя будет менять,правый клик-Персонилизация - крупный шрифт нельзя?
Ужас. Это нарушение законодательства. Многие плохо видят.
Удачи!
...
Рейтинг: 0 / 0
24.07.2019, 12:56
    #39840920
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с реализацией цветовых схем на WinAPI.
flammmableчто бы когда пользователь из своей IDE с модной тёмной цветовой темой запускал бы мое
приложение, у него не кровоточили бы глаза.

Так для этого твоему приложению как раз противопоказаны собственные цветовые схемы.
Используй настройки пользователя.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.07.2019, 13:10
    #39840930
flammmable
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с реализацией цветовых схем на WinAPI.
Dimitry SibiryakovТак для этого твоему приложению как раз противопоказаны собственные цветовые схемы.
Используй настройки пользователя.
Эти настройки должны быть привязаны... нет, не так. Эти настройки могут быть скопированы с цветовых настроек IDE , в то время как настройки системы в целом могут быть любыми (например, "по умолчанию"). А так же могут быть настроены локально для моего приложения.
Не, я понимаю, " Че парица то еп, пущай юзверь сам там как-нибудь глобально настроит. Так зато нам меньше думать! ". Если так подходить, то можно и вообще забить на цветовые схемы. Типа " Не бояре, как-нибудь да разглядят ". Это - вопрос подхода. Без обид, но я-то спрашиваю не про подход, а про артефакт при заливке цветом панели меню ))
...
Рейтинг: 0 / 0
24.07.2019, 13:25
    #39840935
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с реализацией цветовых схем на WinAPI.
flammmableЕсли так подходить, то можно и вообще забить на цветовые схемы.

На них не просто можно, на них нужно забить. Ибо конфигурировать каждое из установленных
приложений индивидуально это адский ад, придуманный садистами.

flammmableя-то спрашиваю не про подход, а про артефакт при заливке цветом панели
меню ))
А этот артефакт - манна небесная, которая, возможно, удержит тебя (и каждого другого
садиста) от выпендрёжа.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.07.2019, 13:35
    #39840940
flammmable
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с реализацией цветовых схем на WinAPI.
Dimitry Sibiryakov,
))))
...
Рейтинг: 0 / 0
24.07.2019, 17:35
    #39841064
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с реализацией цветовых схем на WinAPI.
Давненько никто не писал тут в WinGDI. Я так понимаю очень сильно припекло. С этой линией.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблема с реализацией цветовых схем на WinAPI. / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]