|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Simulating Check Boxes in a Menu
This topic contains an example that shows how to simulate check boxes in a menu. The example contains a Character menu whose items allow the user to set the bold, italic, and underline attributes of the current font. When a font attribute is in effect, a check mark is displayed in the check box next to the corresponding menu item; otherwise, an empty check box is displayed next to the item.
The example replaces the default check-mark bitmap with two bitmaps: a bitmap with a checked box and the bitmap with an empty box. The checked check box bitmap is displayed next to the Bold, Italic, or Underline menu item when the item's check-mark attribute is set to MF_CHECKED. The unchecked or empty check box bitmap is displayed when the check-mark attribute is set to MF_UNCHECKED. Windows provides a predefined bitmap that contains the images used for check boxes and radio buttons. The example isolates the checked and empty check boxes, copies them to two separate bitmaps, and then uses them as the checked and unchecked bitmaps for items in the Character menu.
To retrieve the handle of the system-defined check box bitmap, the example calls the LoadBitmap function, specifying NULL as the hInstance parameter and OBM_CHECKBOXES as the lpBitmapName parameter. Because the images in the bitmap are all the same size, the example can isolate them by dividing the bitmap's width and height by the number of images in its rows and columns. The following portion of a resource-definition file shows how the menu items in the Character menu are defined. Note that no font attributes are in effect initially, so the check-mark attribute for the Regular item is set to checked and, by default, the check-mark attribute of the remaining items is set to unchecked.
#include "men3.h" MainMenu MENU BEGIN POPUP "&Character" BEGIN MENUITEM "&Regular", IDM_REGULAR, CHECKED MENUITEM SEPARATOR MENUITEM "&Bold", IDM_BOLD MENUITEM "&Italic", IDM_ITALIC MENUITEM "&Underline", IDM_ULINE END END
Here are the relevant contents of the application's header file.
// Menu-item identifiers #define IDM_REGULAR 0x1 #define IDM_BOLD 0x2 #define IDM_ITALIC 0x4 #define IDM_ULINE 0x8 // Check-mark flags #define CHECK 1 #define UNCHECK 2 // Font-attribute mask #define ATTRIBMASK 0xe // Function prototypes LRESULT APIENTRY MainWndProc(HWND, UINT, WPARAM, LPARAM); HBITMAP GetMyCheckBitmaps(UINT); BYTE CheckOrUncheckMenuItem(BYTE, HMENU);
The following example shows the portions of the window procedure that create the check-mark bitmaps; set the check-mark attribute of the Bold, Italic, and Underline menu items; and destroy check-mark bitmaps.
LRESULT APIENTRY MainWndProc(hwndMain, uMsg, wParam, lParam) HWND hwndMain; UINT uMsg; WPARAM wParam; LPARAM lParam; { static HBITMAP hbmpCheck; // handle of checked bitmap static HBITMAP hbmpUncheck; // handle of unchecked bitmap static HMENU hmenu; // handle of main menu BYTE fbFontAttrib; // font-attribute flags switch (uMsg) { case WM_CREATE: // Call the application-defined GetMyCheckBitmaps
// function to get the predefined checked and // unchecked check box bitmaps. hbmpCheck = GetMyCheckBitmaps(CHECK); hbmpUncheck = GetMyCheckBitmaps(UNCHECK); // Set the checked and unchecked bitmaps for the menu // items. hmenu = GetMenu(hwndMain); SetMenuItemBitmaps(hmenu, IDM_BOLD, MF_BYCOMMAND, hbmpUncheck, hbmpCheck); SetMenuItemBitmaps(hmenu, IDM_ITALIC, MF_BYCOMMAND,
hbmpUncheck, hbmpCheck); SetMenuItemBitmaps(hmenu, IDM_ULINE, MF_BYCOMMAND, hbmpUncheck, hbmpCheck); return 0; case WM_COMMAND: switch (LOWORD(wParam)) { // Process the menu commands. case IDM_REGULAR: case IDM_BOLD: case IDM_ITALIC: case IDM_ULINE: // CheckOrUncheckMenuItem is an application-
// defined function that sets the menu item // check marks and returns the user-selected // font attributes. fbFontAttrib = CheckOrUncheckMenuItem( (BYTE) LOWORD(wParam), hmenu); . . // Set the font attributes. . return 0; . . // Process other command messages.
. default: break; } break; . . // Process other window messages. . case WM_DESTROY: // Destroy the checked and unchecked bitmaps. DeleteObject(hbmpCheck); DeleteObject(hbmpUncheck); PostQuitMessage(0); break; default: return DefWindowProc(hwndMain, uMsg, wParam, lParam);
} return NULL; } HBITMAP GetMyCheckBitmaps(fuCheck) UINT fuCheck; // CHECK or UNCHECK flag { COLORREF crBackground; // background color HBRUSH hbrBackground; // background brush HBRUSH hbrTargetOld; // original background brush HDC hdcSource; // source device context HDC hdcTarget; // target device context
HBITMAP hbmpCheckboxes; // handle of check-box bitmap BITMAP bmCheckbox; // structure for bitmap data HBITMAP hbmpSourceOld; // handle of original source bitmap HBITMAP hbmpTargetOld; // handle of original target bitmap HBITMAP hbmpCheck; // handle of check-mark bitmap RECT rc; // rectangle for check-box bitmap DWORD dwCheckXY; // dimensions of check-mark bitmap WORD wBitmapX; // width of check-mark bitmap
WORD wBitmapY; // height of check-mark bitmap // Get the menu background color and create a solid brush // with that color. crBackground = GetSysColor(COLOR_MENU); hbrBackground = CreateSolidBrush(crBackground); // Create memory device contexts for the source and // destination bitmaps. hdcSource = CreateCompatibleDC((HDC) NULL); hdcTarget = CreateCompatibleDC(hdcSource); // Get the size of the Windows default check-mark bitmap and
// create a compatible bitmap of the same size. dwCheckXY = GetMenuCheckMarkDimensions(); wBitmapX = LOWORD(dwCheckXY); wBitmapY = LOWORD(dwCheckXY); hbmpCheck = CreateCompatibleBitmap(hdcSource, wBitmapX, wBitmapY); // Select the background brush and bitmap into the target DC. hbrTargetOld = SelectObject(hdcTarget, hbrBackground); hbmpTargetOld = SelectObject(hdcTarget, hbmpCheck); // Use the selected brush to initialize the background color
// of the bitmap in the target device context. PatBlt(hdcTarget, 0, 0, wBitmapX, wBitmapY, PATCOPY); // Load the predefined check box bitmaps and select it // into the source DC. hbmpCheckboxes = LoadBitmap((HINSTANCE) NULL, (LPTSTR) OBM_CHECKBOXES); hbmpSourceOld = SelectObject(hdcSource, hbmpCheckboxes); // Fill a BITMAP structure with information about the // check box bitmaps, and then find the upper-left corner of
// the unchecked check box or the checked check box. GetObject(hbmpCheckboxes, sizeof(BITMAP), &bmCheckbox); if (fuCheck == UNCHECK) { rc.left = 0; rc.right = (bmCheckbox.bmWidth / 4); } else { rc.left = (bmCheckbox.bmWidth / 4); rc.right = (bmCheckbox.bmWidth / 4) * 2; } rc.top = 0; rc.bottom = (bmCheckbox.bmHeight / 3); // Copy the appropriate bitmap into the target DC. If the
// check-box bitmap is larger than the default check-mark // bitmap, use StretchBlt to make it fit; otherwise, just // copy it. if (((rc.right - rc.left) > (int) wBitmapX) || ((rc.bottom - rc.top) > (int) wBitmapY)) StretchBlt(hdcTarget, 0, 0, wBitmapX, wBitmapY, hdcSource, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, SRCCOPY); else BitBlt(hdcTarget, 0, 0, rc.right - rc.left,
rc.bottom - rc.top, hdcSource, rc.left, rc.top, SRCCOPY); // Select the old source and destination bitmaps into the // source and destination DCs, and then delete the DCs and // the background brush. SelectObject(hdcSource, hbmpSourceOld); SelectObject(hdcTarget, hbrTargetOld); hbmpCheck = SelectObject(hdcTarget, hbmpTargetOld); DeleteObject(hbrBackground); DeleteObject(hdcSource); DeleteObject(hdcTarget);
// Return the handle of the new check-mark bitmap. return hbmpCheck; } BYTE CheckOrUncheckMenuItem(bMenuItemID, hmenu) BYTE bMenuItemID; HMENU hmenu; { DWORD fdwMenu; static BYTE fbAttributes; switch (bMenuItemID) { case IDM_REGULAR: // Whenever the Regular menu item is selected, add a // check mark to it and then remove check marks from // any font-attribute menu items.
CheckMenuItem(hmenu, IDM_REGULAR, MF_BYCOMMAND | MF_CHECKED); if (fbAttributes & ATTRIBMASK) { CheckMenuItem(hmenu, IDM_BOLD, MF_BYCOMMAND | MF_UNCHECKED); CheckMenuItem(hmenu, IDM_ITALIC, MF_BYCOMMAND | MF_UNCHECKED); CheckMenuItem(hmenu, IDM_ULINE, MF_BYCOMMAND | MF_UNCHECKED); } fbAttributes = IDM_REGULAR;
return fbAttributes; case IDM_BOLD: case IDM_ITALIC: case IDM_ULINE: // Toggle the check mark for the selected menu item and // set the font attribute flags appropriately. fdwMenu = GetMenuState(hmenu, (UINT) bMenuItemID, MF_BYCOMMAND); if (!(fdwMenu & MF_CHECKED)) { CheckMenuItem(hmenu, (UINT) bMenuItemID, MF_BYCOMMAND | MF_CHECKED);
fbAttributes |= bMenuItemID; } else { CheckMenuItem(hmenu, (UINT) bMenuItemID, MF_BYCOMMAND | MF_UNCHECKED); fbAttributes ^= bMenuItemID; } // If any font attributes are currently selected, // remove the check mark from the Regular menu item; // if no attributes are selected, add a check mark // to the Regular menu item.
if (fbAttributes & ATTRIBMASK) { CheckMenuItem(hmenu, IDM_REGULAR, MF_BYCOMMAND | MF_UNCHECKED); fbAttributes &= (BYTE) ~IDM_REGULAR; } else { CheckMenuItem(hmenu, IDM_REGULAR, MF_BYCOMMAND | MF_CHECKED); fbAttributes = IDM_REGULAR; } return fbAttributes; } }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Имитирующие Контрольные Блоки в Меню
Эта тема содержит пример, который показывает как, чтобы имитировать контрольных блоков в меню. Пример содержит меню Символа, чьи пункты позволяют пользователя, чтобы устанавливать жирный шрифт, курсив и подчеркивать атрибуты текущего шрифта. Когда шрифтовой атрибут - в силе, контрольная отметка отображена в контрольном блоке около соответствующего пункта меню; в противном случае, пустой контрольный блок отображен около пункта.
Пример заменяет контрольную отметку по умолчанию побитового отображения двумя побитовыми отображениями: побитовое отображение с проверенным блоком и побитовое отображение с пустым блоком. Проверенное контрольное побитовое отображение блока отображено около Жирного шрифта, Курсива, или пункта меню Подчеркивания когда атрибут пункта контрольной отметки установлен на MF_CHECKED. Неконтролируемое или пустое контрольное побитовое отображение блока отображено когда контрольная отметка атрибута установлена на MF_UNCHECKED. Windows обеспечивает встроенное побитовое отображение, которое содержит образы использовался для контрольных блоков и радио кнопок. Пример изолирует проверенных и пустых контрольных блоков, копирует их в два отдельных побитовых отображения, затем использует их как проверенное и неконтролируемое побитовые отображения для пунктов в меню Символа.
Для того, чтобы извлекать ручку определенного системного контрольного побитового отображения блока, пример называет функцию LoadBitmap, определяя НЕДЕЙСТВИТЕЛЬНЫМ как параметр hInstance и OBM_CHECKBOXES как параметр lpBitmapName. Поскольку образы в побитовом отображении - тем не менее размер, пример может изолировать его деля ширину побитового отображения и высоты количеством образов в своих колонках и столбцах. Следующая часть ресурса-определения файла показывает как пункты меню в меню Символа определены. Отметьте, что никакие шрифтовые атрибуты не будут в силе первоначально, так что контрольная отметка атрибута для Регулярного пункта установлена на проверенное и, по умолчанию, контрольная отметка атрибута остальных пунктов установлена на неконтролируемый.
#include "men3.h" МЕНЮ MainMenu НАЧИНАЕТСЯ ВЫСВЕЧИВАНИЕ "&Символ" НАЧИНАЮТСЯ MENUITEM "&РЕГУЛЯРНЫЙ", IDM_REGULAR, ПРОВЕРИВШИЙ MENUITEM SEPARATOR MENUITEM "&Жирный шрифт", IDM_BOLD MENUITEM "&Курсив", IDM_ITALIC MENUITEM "&Подчеркивание", КОНЕЧНЫЙ КОНЕЦ IDM_ULINE
Вот важное содержание прикладного файла заголовка.
// Меню-пункт идентификаторов #define IDM_REGULAR 0x1 #define IDM_BOLD 0x2 #define IDM_ITALIC 0x8 0x4 #define IDM_ULINE // Контрольная отметка флагов #define ПРОВЕРЬТЕ 1 #define UNCHECK 2 // Шрифтовая-вспомогательная маска 0xe #define ATTRIBMASK // Прототипы Функции LRESULT APIENTRY MainWndProc(HWND, UINT, WPARAM, LPARAM); HBITMAP GetMyCheckBitmaps(UINT); БАЙТ CheckOrUncheckMenuItem(БАЙТ, HMENU);
Следующий пример показывает части процедуры окна, которое создает контрольную отметку побитовых отображений; установите контрольную отметку атрибута Жирного шрифта, Курсива и Подчеркивайте пункты меню; и уничтожьте контрольная отметка побитовых отображений.
LRESULT APIENTRY MainWndProc(hwndMain, uMsg, wParam, lParam) HWND hwndMain; UINT uMsg; WPARAM wParam; LPARAM lParam; { статический HBITMAP hbmpCheck; // ручка проверенного побитового отображения статического HBITMAP hbmpUncheck; // ручка неконтролируемого побитового отображения статического HMENU hmenu; // ручка основного меню BYTE fbFontAttrib; // шрифтовые-вспомогательные флаги ключ (uMsg) { случай WM_CREATE: // Вызов определенное приложение GetMyCheckBitmaps
// функция, чтобы получать встроенные проверенные и // неконтролируемые контрольные побитовые отображения блока. hbmpCheck = GetMyCheckBitmaps(ЧЕК); hbmpUncheck = GetMyCheckBitmaps(UNCHECK); // Установленный проверенное и неконтролируемое побитовые отображения для меню // пункты. hmenu = GetMenu(hwndMain); SetMenuItemBitmaps(hmenu, IDM_BOLD, MF_BYCOMMAND, hbmpUncheck, hbmpCheck); SetMenuItemBitmaps(hmenu, IDM_ITALIC, MF_BYCOMMAND,
hbmpUncheck, hbmpCheck); SetMenuItemBitmaps(hmenu, IDM_ULINE, MF_BYCOMMAND, hbmpUncheck, hbmpCheck); возврат 0; случай WM_COMMAND: ключ (LOWORD(wParam)) { // Процесс команды меню. случай IDM_REGULAR: случай IDM_BOLD: случай IDM_ITALIC: случай IDM_ULINE: // CheckOrUncheckMenuItem - приложение-
// определенная функция, что устанавливает пункт / меню/ чек выделяет и возвращает выбранного пользователя // шрифтовые атрибуты. fbFontAttrib = CheckOrUncheckMenuItem( (БАЙТ) LOWORD(wParam), hmenu); . . // Установленный шрифтовые атрибуты. . возврат 0; . . // Процесс другие командные сообщения.
. умолчание: прерывание; } прерывание; . . // Процесс другие сообщения окна. . случай WM_DESTROY: // Уничтожьте проверенное и неконтролируемое побитовые отображения. DeleteObject(hbmpCheck); DeleteObject(hbmpUncheck); PostQuitMessage(0); прерывание; умолчание: возвращайте DefWindowProc(hwndMain, uMsg, wParam, lParam);
} возвращайте НЕДЕЙСТВИТЕЛЬНЫЙ; } HBITMAP GetMyCheckBitmaps(fuCheck) UINT fuCheck; // ЧЕК или UNCHECK сигнализирует { COLORREF crBackground; // цвет фона HBRUSH hbrBackground; // щетка фона HBRUSH hbrTargetOld; // оригинальная щетка фона HDC hdcSource; // исходный контекст устройства HDC hdcTarget; // целевой контекст устройства
HBITMAP hbmpCheckboxes; // ручка контрольного блока побитового отображения BITMAP bmCheckbox; // структура для данных побитового отображения HBITMAP hbmpSourceOld; // ручка оригинального исходного побитового отображения HBITMAP hbmpTargetOld; // ручка оригинального целевого побитового отображения HBITMAP hbmpCheck; // ручка контрольной отметки rc побитового отображения RECT; // прямоугольник для контрольного блока побитового отображения DWORD dwCheckXY; // измерения чека-выделяют побитовое отображение WORD wBitmapX; // ширина контрольной отметки побитового отображения
СЛОВО wBitmapY; // высота контрольной отметки побитового отображения // Получите цвет фона меню и создавайте твердую щетку // с этим цветом. crBackground = GetSysColor(COLOR_MENU); hbrBackground = CreateSolidBrush(crBackground); // Создайте контекстам устройства памяти для источника и // побитовых отображений расположения. hdcSource = CreateCompatibleDC((HDC) НЕДЕЙСТВИТЕЛЬНЫЙ); hdcTarget = CreateCompatibleDC(hdcSource); // Получите размер по умолчанию контрольной отметки побитового отображения Windows и
// создайте совместимое побитовое отображение того же самого размера. dwCheckXY = GetMenuCheckMarkDimensions(); wBitmapX = LOWORD(dwCheckXY); wBitmapY = LOWORD(dwCheckXY); hbmpCheck = CreateCompatibleBitmap(hdcSource, wBitmapX, wBitmapY); // Выберитесь щетку фона и побитового отображения в цель DC. hbrTargetOld = SelectObject(hdcTarget, hbrBackground); hbmpTargetOld = SelectObject(hdcTarget, hbmpCheck); // Использование выбранная щетка, чтобы инициализировать цвет фона
// побитового отображения в целевом контексте устройства. PatBlt(hdcTarget, 0, 0, wBitmapX, wBitmapY, PATCOPY); // Загрузка встроенные контрольные побитовые отображения блока и выбора это // в источник DC. hbmpCheckboxes = LoadBitmap((HINSTANCE) НЕДЕЙСТВИТЕЛЬНЫЙ, (LPTSTR) OBM_CHECKBOXES); hbmpSourceOld = SelectObject(hdcSource, hbmpCheckboxes); // Наполнитель структура ПОБИТОВОГО отображения с информацией о // контрольных побитовых отображениях блока, затем находит верхний левый угол
// неконтролируемый контрольный блок или проверенный контрольный блок. GetObject(hbmpCheckboxes, sizeof(ПОБИТОВОЕ отображение), &bmCheckbox); если (fuCheck == UNCHECK) { rc.left = 0; rc.right = (bmCheckbox.bmWidth / 4); } еще { rc.left = (bmCheckbox.bmWidth / 4); rc.right = (bmCheckbox.bmWidth / 4) * 2; } rc.top = 0; rc.bottom = (bmCheckbox.bmHeight / 3); // Скопируйте подходящее побитовое отображение в цель DC. Если the
// контрольный блок побитового отображения большее чем по умолчанию контрольная-отметка // побитовое отображение, использование StretchBlt, чтобы делать этим приступом; в противном случае, просто // копия это. если (((rc.right - rc.left) > (int) wBitmapX) || ((rc.bottom - rc.top) > (int) wBitmapY)) StretchBlt(hdcTarget, 0, 0, wBitmapX, wBitmapY, hdcSource, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, SRCCOPY); еще BitBlt(hdcTarget, 0, 0, rc.right - rc.left,
rc.bottom - rc.top, hdcSource, rc.left, rc.top, SRCCOPY); // Выберитесь старым исходным и побитовым отображениям расположения в // источник и расположение DCs, затем удалять DCs и // щетка фона. SelectObject(hdcSource, hbmpSourceOld); SelectObject(hdcTarget, hbrTargetOld); hbmpCheck = SelectObject(hdcTarget, hbmpTargetOld); DeleteObject(hbrBackground); DeleteObject(hdcSource); DeleteObject(hdcTarget);
// Возвращайте ручку контрольной отметки нового побитового отображения. возвращайте hbmpCheck; } БАЙТ CheckOrUncheckMenuItem(bMenuItemID, hmenu) BYTE bMenuItemID; HMENU hmenu; { DWORD fdwMenu; статический BYTE fbAttributes; ключ (bMenuItemID) { случай IDM_REGULAR: // Всякий раз, когда Регулярный пункт меню выбран, добавьте // контрольную отметку к этому затем удаляйте контрольные отметки из // любых шрифтовых-вспомогательных пунктов меню.
CheckMenuItem(hmenu, IDM_REGULAR, MF_BYCOMMAND | MF_CHECKED); если (fbAttributes & ATTRIBMASK) { CheckMenuItem(hmenu, IDM_BOLD, MF_BYCOMMAND | MF_UNCHECKED); CheckMenuItem(hmenu, IDM_ITALIC, MF_BYCOMMAND | MF_UNCHECKED); CheckMenuItem(hmenu, IDM_ULINE, MF_BYCOMMAND | MF_UNCHECKED); } fbAttributes = IDM_REGULAR;
возвращайте fbAttributes; случай IDM_BOLD: случай IDM_ITALIC: случай IDM_ULINE: // Переключатель контрольная отметка для выбранного пункта меню и // установившее шрифтовые вспомогательные флаги соответственно. fdwMenu = GetMenuState(hmenu, (UINT) bMenuItemID, MF_BYCOMMAND); если (!(fdwMenu & MF_CHECKED)) { CheckMenuItem(hmenu, (UINT) bMenuItemID, MF_BYCOMMAND | MF_CHECKED);
fbAttributes |= bMenuItemID; } еще { CheckMenuItem(hmenu, (UINT) bMenuItemID, MF_BYCOMMAND | MF_UNCHECKED); fbAttributes ^= bMenuItemID; } // Если любые шрифтовые атрибуты к настоящему времени выбраны, // удаление контрольная отметка из Регулярного пункта меню; // если никакие атрибуты не выбраны, добавьте контрольную отметку // к Регулярному пункту меню.
если (fbAttributes & ATTRIBMASK) { CheckMenuItem(hmenu, IDM_REGULAR, MF_BYCOMMAND | MF_UNCHECKED); fbAttributes &= (БАЙТ) ~IDM_REGULAR; } еще { CheckMenuItem(hmenu, IDM_REGULAR, MF_BYCOMMAND | MF_CHECKED); fbAttributes = IDM_REGULAR; } возвращайте fbAttributes; } }
|
|
|
|
| |