|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Setting Fonts for Menu-Item Text Strings
This topic contains an example from an application that uses owner-drawn menu items in a menu. The menu contains items that set the attributes of the current font, and the items are displayed using the appropriate font attribute.
Here is how the menu is defined in the resource-definition file. Note that the strings for the Regular, Bold, Italic, and Underline menu items are assigned at run time, so their strings are empty in the resource-definition file.
MainMenu MENU BEGIN POPUP "&Character" BEGIN MENUITEM "", IDM_REGULAR MENUITEM SEPARATOR MENUITEM "", IDM_BOLD MENUITEM "", IDM_ITALIC MENUITEM "", IDM_ULINE END END
The application's window procedure processes the messages involved in using owner-drawn menu items. The application uses the WM_CREATE message to do the following:
· Set the MF_OWNERDRAW flag for the menu items. · Set the text strings for the menu items. · Obtain handles of the fonts used to draw the items. · Obtain the text and background color values for selected menu items.
The text strings and font handles are stored in an array of application-defined MYITEM structures. The application-defined GetAFont function creates a font that corresponds to the given font attribute and returns the handle of the font. The handles are destroyed during the processing of the WM_DESTROY message. During the processing of the WM_MEASUREITEM message, the example gets the width and height of a menu-item string and copies these values into the MEASUREITEMSTRUCT structure. Windows uses the width and height values to calculate the size of the menu.
During the processing of the WM_DRAWITEM message, the menu item's string is drawn with room left next to the string for the check-mark bitmap. If the user selects the item, the selected text and background colors are used to draw the item.
LRESULT APIENTRY MainWndProc(hwnd, uMsg, wParam, lParam) HWND hwnd; UINT uMsg; WPARAM wParam; LPARAM lParam; { typedef struct _MYITEM { HFONT hfont; LPSTR psz; } MYITEM; // structure for item font and string MYITEM *pmyitem; // pointer to item's font and string static MYITEM myitem[CITEMS]; // array of MYITEMS static HMENU hmenu; // handle of main menu
static COLORREF crSelText; // text color of selected item static COLORREF crSelBkgnd; // background color of selected item COLORREF crText; // text color of unselected item COLORREF crBkgnd; // background color unselected item LPMEASUREITEMSTRUCT lpmis; // points to item of data LPDRAWITEMSTRUCT lpdis; // points to item drawing data HDC hdc; // handle of screen DC
SIZE size; // menu-item text extents DWORD dwCheckXY; // check-mark dimensions WORD wCheckX; // check-mark width int nTextX; // width of menu item int nTextY; // height of menu item int i; // loop counter HFONT hfontOld; // handle of old font
BOOL fSelected = FALSE; // menu-item selection flag switch (uMsg) { case WM_CREATE: // Modify the Regular, Bold, Italic, and Underline // menu items to make them owner-drawn items. Associate // a MYITEM structure with each item to contain the // string and font handle for each item. hmenu = GetMenu(hwnd); ModifyMenu(hmenu, IDM_REGULAR, MF_BYCOMMAND |
MF_CHECKED | MF_OWNERDRAW, IDM_REGULAR, (LPTSTR) &myitem[REGULAR]); ModifyMenu(hmenu, IDM_BOLD, MF_BYCOMMAND | MF_OWNERDRAW, IDM_BOLD, (LPTSTR) &myitem[BOLD]); ModifyMenu(hmenu, IDM_ITALIC, MF_BYCOMMAND | MF_OWNERDRAW, IDM_ITALIC, (LPTSTR) &myitem[ITALIC]); ModifyMenu(hmenu, IDM_ULINE, MF_BYCOMMAND | MF_OWNERDRAW, IDM_ULINE, (LPTSTR) &myitem[ULINE]);
// Retrieve each item's font handle and copy it into // the hfont member of each item's MYITEM structure. // Also, copy each item's string into the structures. myitem[REGULAR].hfont = GetAFont(REGULAR); myitem[REGULAR].psz = "Regular"; myitem[BOLD].hfont = GetAFont(BOLD); myitem[BOLD].psz = "Bold"; myitem[ITALIC].hfont = GetAFont(ITALIC); myitem[ITALIC].psz = "Italic";
myitem[ULINE].hfont = GetAFont(ULINE); myitem[ULINE].psz = "Underline"; // Retrieve the text and background colors of the // selected menu text. crSelText = GetSysColor(COLOR_HIGHLIGHTTEXT); crSelBkgnd = GetSysColor(COLOR_HIGHLIGHT); return 0; case WM_MEASUREITEM: // Retrieve a device context for the main window. hdc = GetDC(hwnd);
// Retrieve pointers to the menu item's // MEASUREITEMSTRUCT structure and MYITEM structure. lpmis = (LPMEASUREITEMSTRUCT) lParam; pmyitem = (MYITEM *) lpmis->itemData; // Select the font associated with the item into // the main window's device context. hfontOld = SelectObject(hdc, pmyitem->hfont); // Retrieve the width and height of the item's string,
// and then copy the width and height into the // MEASUREITEMSTRUCT structure's itemWidth and // itemHeight members. GetTextExtentPoint32(hdc, pmyitem->psz, lstrlen(pmyitem->psz), &size); lpmis->itemWidth = size.cx; lpmis->itemHeight = size.cy; // Select the old font back into the device context, // and then release the device context.
SelectObject(hdc, hfontOld); ReleaseDC(hwnd, hdc); return TRUE; break; case WM_DRAWITEM: // Get pointers to the menu item's DRAWITEMSTRUCT // structure and MYITEM structure. lpdis = (LPDRAWITEMSTRUCT) lParam; pmyitem = (MYITEM *) lpdis->itemData; // If the user has selected the item, use the selected // text and background colors to display the item.
if (lpdis->itemState & ODS_SELECTED) { crText = SetTextColor(lpdis->hDC, crSelText); crBkgnd = SetBkColor(lpdis->hDC, crSelBkgnd); fSelected = TRUE; } // Remember to leave space in the menu item for the // check-mark bitmap. Retrieve the width of the bitmap // and add it to the width of the menu item. dwCheckXY = GetMenuCheckMarkDimensions();
wCheckX = LOWORD(dwCheckXY); nTextX = wCheckX + lpdis->rcItem.left; nTextY = lpdis->rcItem.top; // Select the font associated with the item into the // item's device context, and then draw the string. hfontOld = SelectObject(lpdis->hDC, pmyitem->hfont); ExtTextOut(lpdis->hDC, nTextX, nTextY, ETO_OPAQUE, &lpdis->rcItem, pmyitem->psz, lstrlen(pmyitem->psz), NULL);
// Select the previous font back into the device // context. SelectObject(lpdis->hDC, hfontOld); // Return the text and background colors to their // normal state (not selected). if (fSelected) { SetTextColor(lpdis->hDC, crText); SetBkColor(lpdis->hDC, crBkgnd); } return TRUE; . . // Process other messages.
. case WM_DESTROY: // Destroy the menu items' font handles. for (i = 0; i < CITEMS; i++) DeleteObject(myitem[i].hfont); PostQuitMessage(0); break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return NULL; } HFONT GetAFont(fnFont) int fnFont; // font-attribute flag { static LOGFONT lf; // structure for font information
// Get a handle to the ANSI fixed-pitch font, and copy // information about the font to a LOGFONT structure. GetObject(GetStockObject(ANSI_FIXED_FONT), sizeof(LOGFONT), &lf); // Set the font attributes, as appropriate. if (fnFont == BOLD) lf.lfWeight = FW_BOLD; else lf.lfWeight = FW_NORMAL; lf.lfItalic = (fnFont == ITALIC); lf.lfItalic = (fnFont == ULINE); // Create the font, and then return its handle.
return CreateFont(lf.lfHeight, lf.lfWidth, lf.lfEscapement, lf.lfOrientation, lf.lfWeight, lf.lfItalic, lf.lfUnderline, lf.lfStrikeOut, lf.lfCharSet, lf.lfOutPrecision, lf.lfClipPrecision, lf.lfQuality, lf.lfPitchAndFamily, lf.lfFaceName); }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Установка Шрифтов для Текстовых Строк Menu-Item
Эта тема содержит пример из приложения, которое использует пункты меню сделанного владельца в меню. Меню содержит пункты, которые устанавливают атрибуты текущего шрифта, и пункты отображены используя подходящий шрифтовой атрибут.
Вот как меню определено в ресурсе-определении файла. Отметьте, что строки для Регулярных, Смелых, Курсив, и пунктов меню Подчеркивания назначены во времени выполнения, так что их строки пустые в ресурсе-определении файла.
МЕНЮ MainMenu НАЧИНАЕТСЯ ВЫСВЕЧИВАНИЕ "&Символ" НАЧИНАЮТСЯ MENUITEM "", IDM_REGULAR MENUITEM SEPARATOR MENUITEM "", IDM_BOLD MENUITEM "", IDM_ITALIC MENUITEM "", КОНЕЧНЫЙ КОНЕЦ IDM_ULINE
Прикладная процедура окна обрабатывает сообщения включенные в использование сделавшее пунктами меню владельца. Приложение использует сообщение WM_CREATE, чтобы делать следующим:
Установившее флаг MF_OWNERDRAW для пунктов меню. Установившее текстовые строки для пунктов меню. Получать ручки шрифтов использованных, чтобы делать пунктами. Получать текст и цвет фона оценивается для выбранных пунктов меню.
Текстовые строки и шрифтовые ручки загружены в массив определенных прикладных структур MYITEM. Определенная прикладная функция GetAFont создает шрифт, который переписывается в данный шрифтовой атрибут и возвращает ручку шрифта. Ручки уничтожены в течение обработки сообщения WM_DESTROY. В течение обработки сообщения WM_MEASUREITEM, пример получает ширину и высота меню-пункта нанизывает и копирует эти величины в структуру MEASUREITEMSTRUCT. Windows использует широтные и величины высоты, чтобы вычислять размер меню.
В течение обработки сообщения WM_DRAWITEM, строка пункта меню нарисована помощью комнаты оставленной около строки для контрольной отметки побитового отображения. Если пользователь выбирается пункт, выбранный текст и цвета фона использованы, чтобы делать пунктом.
LRESULT APIENTRY MainWndProc(hwnd, uMsg, wParam, lParam) HWND hwnd; UINT uMsg; WPARAM wParam; LPARAM lParam; { typedef struct _MYITEM { HFONT hfont; psz LPSTR; } MYITEM; // структура для шрифта пункта и строки MYITEM *pmyitem; // указатель в шрифт пункта и строка статический MYITEM myitem[CITEMS]; // массив MYITEMS статический HMENU hmenu; // ручка основного меню
статический COLORREF crSelText; // текстовый цвет выбранного пункта статического COLORREF crSelBkgnd; // цвет фона выбранного пункта COLORREF crText; // текстовый цвет unselected пункта COLORREF crBkgnd; // цвет фона unselected lpmis пункта LPMEASUREITEMSTRUCT; // точки на пункт lpdis данных LPDRAWITEMSTRUCT; // точки на пункт, рисующие hdc данных HDC; // ручка экрана DC
РАЗМЕР размера; // меню-пункт текстовой протяженности DWORD dwCheckXY; // контрольная отметка измерений WORD wCheckX; // контрольная отметка ширины int nTextX; // ширина пункта меню int nTextY; // высота пункта меню int i; // счетчик цикла HFONT hfontOld; // ручка старого шрифта
BOOL fSelected = ЛОЖЬ; // меню-пункт флага выбора ключ (uMsg) { случай WM_CREATE: // Модифицируйте Регулярное, Смелое, Курсив, и Подчеркивание // пункты меню, чтобы делать их сделавшим пунктами владельца. Коллега // структура a MYITEM с каждым пунктом, чтобы содержать // нанизываться и шрифтовая ручка для каждого пункта. hmenu = GetMenu(hwnd); ModifyMenu(hmenu, IDM_REGULAR, MF_BYCOMMAND |
MF_CHECKED | MF_OWNERDRAW, IDM_REGULAR, (LPTSTR) &myitem[REGULAR]); ModifyMenu(hmenu, IDM_BOLD, MF_BYCOMMAND | MF_OWNERDRAW, IDM_BOLD, (LPTSTR) &myitem[BOLD]); ModifyMenu(hmenu, IDM_ITALIC, MF_BYCOMMAND | MF_OWNERDRAW, IDM_ITALIC, (LPTSTR) &myitem[ITALIC]); ModifyMenu(hmenu, IDM_ULINE, MF_BYCOMMAND | MF_OWNERDRAW, IDM_ULINE, (LPTSTR) &myitem[ULINE]);
// Извлеките каждую шрифтовую ручку пункта и копируйте это в // элемент hfont каждой структуры пункта MYITEM. // Также, скопируйте каждую строку пункта в структуры. myitem[REGULAR].hfont = GetAFont(РЕГУЛЯРНЫЙ); myitem[REGULAR].psz = "Регулярный"; myitem[BOLD].hfont = GetAFont(ЖИРНЫЙ шрифт); myitem[BOLD].psz = "Жирный шрифт"; myitem[ITALIC].hfont = GetAFont(КУРСИВ); myitem[ITALIC].psz = "Курсив";
myitem[ULINE].hfont = GetAFont(ULINE); myitem[ULINE].psz = "Подчеркивание"; // Извлеките текст и цвета фона // выбранного текста меню. crSelText = GetSysColor(COLOR_HIGHLIGHTTEXT); crSelBkgnd = GetSysColor(COLOR_HIGHLIGHT); возврат 0; случай WM_MEASUREITEM: // Извлеките контекст устройства для основного окна. hdc = GetDC(hwnd);
// Извлеките указатели в меню пункт // структура MEASUREITEMSTRUCT и структура MYITEM. lpmis = (LPMEASUREITEMSTRUCT) lParam; pmyitem = (MYITEM *) lpmis->itemData; // Выбор шрифт связывался пунктом в // контекст устройства основного окна. hfontOld = SelectObject(hdc, pmyitem->hfont); // Извлеките ширину и высоту строки пункта,
// и затем скопируйте ширину и высоту на // MEASUREITEMSTRUCT структурные itemWidth и // участников itemHeight. GetTextExtentPoint32(hdc, pmyitem->psz, lstrlen(pmyitem->psz), &размер); lpmis->itemWidth = size.cx; lpmis->itemHeight = size.cy; // Выбор старый шрифт снова в контекст устройства, // затем выпускать контекст устройства.
SelectObject(hdc, hfontOld); ReleaseDC(hwnd, hdc); возвращайтесь ВЕРНО; прерывание; случай WM_DRAWITEM: // Получите указателям в пункт меню DRAWITEMSTRUCT // структура и структура MYITEM. lpdis = (LPDRAWITEMSTRUCT) lParam; pmyitem = (MYITEM *) lpdis->itemData; // Если пользователь выбрался бы пункт, используйте выбранный // текст и цвета фона, чтобы отображать пункт.
если (lpdis->itemState & ODS_SELECTED) { crText = SetTextColor(lpdis->hDC, crSelText); crBkgnd = SetBkColor(lpdis->hDC, crSelBkgnd); fSelected = ИСТИНА; } // Не забывайте оставлять пространство в пункте меню для // контрольной отметки побитового отображения. Извлеките ширину побитового отображения // и добавляйте это к ширине пункта меню. dwCheckXY = GetMenuCheckMarkDimensions();
wCheckX = LOWORD(dwCheckXY); nTextX = wCheckX + lpdis->rcItem.left; nTextY = lpdis->rcItem.top; // Выбор шрифт связывался пунктом в // контекст устройства пункта, затем делает строкой. hfontOld = SelectObject(lpdis->hDC, pmyitem->hfont); ExtTextOut(lpdis->hDC, nTextX, nTextY, ETO_OPAQUE, &lpdis->rcItem, pmyitem->psz, lstrlen(pmyitem->psz), НЕДЕЙСТВИТЕЛЬНЫЙ);
// Выберитесь предшествующий шрифт снова в устройство // контекст. SelectObject(lpdis->hDC, hfontOld); // Возвращайте текст и цвета фона в их // нормальное состояние (не выбранное). если (fSelected) { SetTextColor(lpdis->hDC, crText); SetBkColor(lpdis->hDC, crBkgnd); } возвращайтесь ВЕРНО; . . // Процесс другие сообщения.
. случай WM_DESTROY: // Уничтожьте пункты меню шрифтовых ручек. для (i = 0; я < CITEMS; я++) DeleteObject(myitem[i].hfont); PostQuitMessage(0); прерывание; умолчание: возвращайте DefWindowProc(hwnd, uMsg, wParam, lParam); } возвращайте НЕДЕЙСТВИТЕЛЬНЫЙ; } HFONT GetAFont(fnFont) int fnFont; // шрифтовой-вспомогательный флаг { статический lf LOGFONT; // структура для шрифтовой информации
// Получите ручку в фиксированный шаг шрифта ANSI и копируйте // информацию о шрифте в структуру LOGFONT. GetObject(GetStockObject(ANSI_FIXED_FONT), sizeof(LOGFONT), &lf); // Установленный шрифтовые атрибуты, как подходящий. если (fnFont == ЖИРНЫЙ шрифт) lf.lfWeight = FW_BOLD; еще lf.lfWeight = FW_NORMAL; lf.lfItalic = (fnFont == КУРСИВ); lf.lfItalic = (fnFont == ULINE); // Создайте шрифт, затем возвращайте свою ручку.
возвращайте CreateFont(lf.lfHeight, lf.lfWidth, lf.lfEscapement, lf.lfOrientation, lf.lfWeight, lf.lfItalic, lf.lfUnderline, lf.lfStrikeOut, lf.lfCharSet, lf.lfOutPrecision, lf.lfClipPrecision, lf.lfQuality, lf.lfPitchAndFamily, lf.lfFaceName); }
|
|
|
|
| |