NONCLIENTMETRICS ncm={0};
BOOL bResult;
HFONT hfntMenu;
ncm.cbSize = sizeof(ncm);
bResult = SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, (PVOID)&ncm, 0);
if (!bResult) {..... return; }
// тут мы имеем в ncm.lfMenuFont сруктуру LOGFONT шрифта меню, создать шрифт можно с помощью CreateFontIndirect
hfntMenu = CreateFontIndirect(&ncm.lfMenuFont);
if (!hfntMenu) { ..... return; }
Отображение меню.
В обработчике сообщения WM_MEASUREITEM надо задавать размеры элемента меню.
Из начальных данных у меня есть текст, сопоставленный с этим элементом меню.
Зная размеры области в которую поместится текст, я мог бы задать размеры элемента меню, но для этого мне надо знать каким шрифтом в системе рисуется меню.
Вопрос - как мне узнать системный HFONT для меню?
И второй вопрос.
При отрисовке моего пункта меню вся область для рисования больше чем я задавал. Слева, самой Виндой, отводится ещё область для рисунка "check'a" - рисунок точки, галочки (если данный пункт меню отмечен как ODS_CHECKED). Как мне узнать ширину данной области? А то получается, что текст в отображаемых мною пунктах меню не выровнен по сравнению с пунктами меню отображаемыми самой системой.
В атаче мой cpp файл, реализующий прорисовку меню.
Цитата:
Originally posted by SeregaLBN
Есть проблема. Рисую своё popup меню.
В обработчике сообщения WM_MEASUREITEM надо задавать размеры элемента меню.
Из начальных данных у меня есть текст, сопоставленный с этим элементом меню.
Зная размеры области в которую поместится текст, я мог бы задать размеры элемента меню, но для этого мне надо знать каким шрифтом в системе рисуется меню.
Вопрос - как мне узнать системный HFONT для меню?
И второй вопрос.
При отрисовке моего пункта меню вся область для рисования больше чем я задавал. Слева, самой Виндой, отводится ещё область для рисунка "check'a" - рисунок точки, галочки (если данный пункт меню отмечен как ODS_CHECKED). Как мне узнать ширину данной области? А то получается, что текст в отображаемых мною пунктах меню не выровнен по сравнению с пунктами меню отображаемыми самой системой.
В атаче мой cpp файл, реализующий прорисовку меню.
Есть проблема. Рисую своё popup меню.
В обработчике сообщения WM_MEASUREITEM надо задавать размеры элемента меню.
Из начальных данных у меня есть текст, сопоставленный с этим элементом меню.
Зная размеры области в которую поместится текст, я мог бы задать размеры элемента меню, но для этого мне надо знать каким шрифтом в системе рисуется меню.
Вопрос - как мне узнать системный HFONT для меню?
И второй вопрос.
При отрисовке моего пункта меню вся область для рисования больше чем я задавал. Слева, самой Виндой, отводится ещё область для рисунка "check'a" - рисунок точки, галочки (если данный пункт меню отмечен как ODS_CHECKED). Как мне узнать ширину данной области? А то получается, что текст в отображаемых мною пунктах меню не выровнен по сравнению с пунктами меню отображаемыми самой системой.
В атаче мой cpp файл, реализующий прорисовку меню.
Системный шрифт: GetStockObject(DEFAULT_GUI_FONT)
Чекбокс для меню: GetSystemMetrics(SM_CXMENUCHECK)
Пользуйтесь MSDN, батенька
1. Я тоже изначально брал HFONT из GetStockObject(SYSTEM_FONT) или из GetStockObject(DEFAULT_GUI_FONT), но они возвращают HFONT в системе по умолчанию, а не текущий (указанный в теме(схеме) Windows).
2. GetSystemMetrics(SM_CXMENUCHECK) возвращает размеры битмапа check'a. А величина смещения текста больше ширины битмапа.
Т.е. те же вопросы остаются:
1. Как узнать текущий системный HFONT меню.
2. Как узнать смещение текста слева для пункта меню.
В атаче приведена изменнёная ф-ция Cls_OnDrawItem, где о всём вышесказанном можно убедиться.
а шрифт... при обработке WM_DRAWITEM попробуй брать шрифт из hDC: GetCurrentObject(hDC, OBJ_FONT)
A при обработке WM_DRAWITEM нет смысла брать шрифт из GetCurrentObject(hDC, OBJ_FONT). Зачем - чтобы дальше назначить его в этот же hDC? Вот если бы мне можно было бы вызвать эту ф-цию при обработке WM_MEASUREITEM, но там у меня нет hDC от меню...
Шрифт меню и прочие причипурки получать так:
Цитата:
Originally posted by Arestov
Шрифт меню и прочие причипурки получать так:
удачи!!! :)
Шрифт меню и прочие причипурки получать так:
Код:
NONCLIENTMETRICS ncm={sizeof(ncm)};
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, (PVOID)&ncm, 0);
...
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, (PVOID)&ncm, 0);
...
удачи!!! :)
Спасибо - это подошло...