|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Example of Using Custom Check-mark Bitmaps
The example in this topic assigns custom check-mark bitmaps to menu items in two menus. The menu items in the first menu specify character attributes: bold, italic, and underline. Each menu item can be either checked or unchecked. For these menu items, the example uses check-mark bitmaps that resemble the checked and unchecked states of a check box control.
The menu items in the second menu specify paragraph alignment settings: left, centered, and right. Only one of these menu items is checked at any given time. For these menu items, the example uses check-mark bitmaps that resemble the checked and unchecked states of a radio button control. The window procedure processes the WM_CREATE message by calling the application-defined OnCreate function. OnCreate creates the four check-mark bitmaps and then assigns them to their appropriate menu items by using the SetMenuItemBitmaps function.
To create each bitmap, OnCreate calls the application-defined CreateMenuBitmaps function, specifying a pointer to a bitmap-specific drawing function. CreateMenuBitmaps creates a monochrome bitmap of the required size, selects it into a memory device context, and erases the background. Then it calls the specified drawing function to fill in the foreground. The four application-defined drawing functions are DrawCheck, DrawUncheck, DrawRadioCheck, and DrawRadioUncheck. They draw a rectangle with an X, an empty rectangle, an ellipse containing a smaller filled ellipse, and an empty ellipse, respectively.
The window procedure processes the WM_DESTROY message by deleting the check-mark bitmaps. It retrieves each bitmap handle by using the GetMenuItemInfo function and then passes the handle to the DeleteObject function. When the user chooses a menu item, a WM_COMMAND message is sent to the owner window. For menu items on the Character menu, the window procedure calls the application-defined CheckCharacterItem function. For items on the Paragraph menu, the window procedure calls the application-defined CheckParagraphItem function.
Each item on the Character menu can be checked and unchecked independently. Therefore, CheckCharacterItem simply switches the specified menu item's check state. First, the function calls the GetMenuItemInfo function to get the current menu item state. Then it switches the MFS_CHECKED state flag and sets the new state by calling the SetMenuItemInfo function. Unlike character attributes, only one paragraph alignment can be selected at a time. Therefore, CheckParagraphItem checks the specified menu item and removes the check mark from all other items on the menu. To do so, it calls the CheckMenuRadioItem function.
Following are the relevant portions of the application's header file.
// Menu-item identifiers for the Character menu #define IDM_CHARACTER 10 #define IDM_BOLD 11 #define IDM_ITALIC 12 #define IDM_UNDERLINE 13 // Menu-item identifiers for the Paragraph menu #define IDM_PARAGRAPH 20 #define IDM_LEFT 21 #define IDM_CENTER 22 #define IDM_RIGHT 23 // Function-pointer type for drawing functions typedef VOID (WINAPI * DRAWFUNC)(HDC hdc, SIZE size);
Following are the relevant portions of the application's window procedure and related functions.
LRESULT CALLBACK MainWindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch (uMsg) { case WM_CREATE: if (!OnCreate(hwnd)) return -1; break; case WM_DESTROY: OnDestroy(hwnd); PostQuitMessage(0); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_BOLD:
case IDM_ITALIC: case IDM_UNDERLINE: CheckCharacterItem(hwnd, LOWORD(wParam)); break; case IDM_LEFT: case IDM_CENTER: case IDM_RIGHT: CheckParagraphItem(hwnd, LOWORD(wParam)); break; . . // Process other commands here. . }
break; . . // Process other messages here. . default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; } VOID WINAPI CheckCharacterItem(HWND hwnd, UINT uID) { HMENU hmenuBar = GetMenu(hwnd); HMENU hmenuPopup; MENUITEMINFO mii; // Get the handle of the Character menu. mii.fMask = MIIM_SUBMENU; // information to get GetMenuItemInfo(hmenuBar, IDM_CHARACTER, FALSE, &mii);
hmenuPopup = mii.hSubMenu; // Get the state of the specified menu item. mii.fMask = MIIM_STATE; // information to get GetMenuItemInfo(hmenuPopup, uID, FALSE, &mii); // Toggle the checked state. mii.fState ^= MFS_CHECKED; SetMenuItemInfo(hmenuPopup, uID, FALSE, &mii); } VOID WINAPI CheckParagraphItem(HWND hwnd, UINT uID) { HMENU hmenuBar = GetMenu(hwnd); HMENU hmenuPopup; MENUITEMINFO mii;
// Get the handle of the Paragraph menu. mii.fMask = MIIM_SUBMENU; // information to get GetMenuItemInfo(hmenuBar, IDM_PARAGRAPH, FALSE, &mii); hmenuPopup = mii.hSubMenu; // Check the specified item and uncheck all the others. CheckMenuRadioItem( hmenuPopup, // handle of menu IDM_LEFT, // first item in range IDM_RIGHT, // last item in range uID, // item to check
MF_BYCOMMAND // IDs, not positions ); } BOOL WINAPI OnCreate(HWND hwnd) { HMENU hmenuBar = GetMenu(hwnd); HMENU hmenuPopup; MENUITEMINFO mii; UINT uID; HBITMAP hbmChecked; HBITMAP hbmUnchecked; // Get the handle of the Character menu. mii.fMask = MIIM_SUBMENU; // information to get GetMenuItemInfo(hmenuBar, IDM_CHARACTER, FALSE, &mii); hmenuPopup = mii.hSubMenu;
// Create the checked and unchecked bitmaps. hbmChecked = CreateMenuBitmap(DrawCheck); hbmUnchecked = CreateMenuBitmap(DrawUncheck); // Set the checkmark bitmaps for each menu item. for (uID = IDM_BOLD; uID <= IDM_UNDERLINE; uID++) { SetMenuItemBitmaps(hmenuPopup, uID, MF_BYCOMMAND, hbmUnchecked, hbmChecked); } // Get the handle of the Paragraph pop-up menu. mii.fMask = MIIM_SUBMENU; // information to get
GetMenuItemInfo(hmenuBar, IDM_PARAGRAPH, FALSE, &mii); hmenuPopup = mii.hSubMenu; // Create the checked and unchecked bitmaps. hbmChecked = CreateMenuBitmap(DrawRadioCheck); hbmUnchecked = CreateMenuBitmap(DrawRadioUncheck); // Set the checkmark bitmaps for each menu item. for (uID = IDM_LEFT; uID <= IDM_RIGHT; uID++) { SetMenuItemBitmaps(hmenuPopup, uID, MF_BYCOMMAND, hbmUnchecked, hbmChecked);
} // Initially check the IDM_LEFT paragraph item. CheckMenuRadioItem(hmenuPopup, IDM_LEFT, IDM_RIGHT, IDM_LEFT, MF_BYCOMMAND); return TRUE; } HBITMAP WINAPI CreateMenuBitmap(DRAWFUNC lpfnDraw) { // Create a DC compatible with the desktop window's DC. HWND hwndDesktop = GetDesktopWindow(); HDC hdcDesktop = GetDC(hwndDesktop); HDC hdcMem = CreateCompatibleDC(hdcDesktop); // Determine the required bitmap size.
DWORD dwExt = GetMenuCheckMarkDimensions(); SIZE size = { LOWORD(dwExt), HIWORD(dwExt) }; // Create a monochrome bitmap and select it. HBITMAP hbm = CreateBitmap(size.cx, size.cy, 1, 1, NULL); HBITMAP hbmOld = SelectObject(hdcMem, hbm); // Erase the background and call the drawing function. PatBlt(hdcMem, 0, 0, size.cx, size.cy, WHITENESS); (*lpfnDraw)(hdcMem, size); // Clean up. SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem); ReleaseDC(hwndDesktop, hdcDesktop); return hbm; } VOID WINAPI DrawCheck(HDC hdc, SIZE size) { HBRUSH hbrOld; hbrOld = SelectObject(hdc, GetStockObject(NULL_BRUSH)); Rectangle(hdc, 0, 0, size.cx, size.cy); MoveToEx(hdc, 0, 0, NULL); LineTo(hdc, size.cx, size.cy); MoveToEx(hdc, 0, size.cy - 1, NULL); LineTo(hdc, size.cx - 1, 0); SelectObject(hdc, hbrOld); } VOID WINAPI DrawUncheck(HDC hdc, SIZE size)
{ HBRUSH hbrOld; hbrOld = SelectObject(hdc, GetStockObject(NULL_BRUSH)); Rectangle(hdc, 0, 0, size.cx, size.cy); SelectObject(hdc, hbrOld); } VOID WINAPI DrawRadioCheck(HDC hdc, SIZE size) { HBRUSH hbrOld; hbrOld = SelectObject(hdc, GetStockObject(NULL_BRUSH)); Ellipse(hdc, 0, 0, size.cx, size.cy); SelectObject(hdc, GetStockObject(BLACK_BRUSH)); Ellipse(hdc, 2, 2, size.cx - 2, size.cy - 2); SelectObject(hdc, hbrOld);
} VOID WINAPI DrawRadioUncheck(HDC hdc, SIZE size) { HBRUSH hbrOld; hbrOld = SelectObject(hdc, GetStockObject(NULL_BRUSH)); Ellipse(hdc, 0, 0, size.cx, size.cy); SelectObject(hdc, hbrOld); } VOID WINAPI OnDestroy(HWND hwnd) { HMENU hmenuBar = GetMenu(hwnd); HMENU hmenuPopup; MENUITEMINFO mii; // Get the handle of the Character menu. mii.fMask = MIIM_SUBMENU; // information to get GetMenuItemInfo(hmenuBar, IDM_CHARACTER, FALSE, &mii);
hmenuPopup = mii.hSubMenu; // Get the check-mark bitmaps and delete them. mii.fMask = MIIM_CHECKMARKS; GetMenuItemInfo(hmenuPopup, IDM_BOLD, FALSE, &mii); DeleteObject(mii.hbmpChecked); DeleteObject(mii.hbmpUnchecked); // Get the handle of the Paragraph menu. mii.fMask = MIIM_SUBMENU; // information to get GetMenuItemInfo(hmenuBar, IDM_PARAGRAPH, FALSE, &mii); hmenuPopup = mii.hSubMenu; // Get the check-mark bitmaps and delete them.
mii.fMask = MIIM_CHECKMARKS; GetMenuItemInfo(hmenuPopup, IDM_LEFT, FALSE, &mii); DeleteObject(mii.hbmpChecked); DeleteObject(mii.hbmpUnchecked); }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Пример Использования Контрольной отметки Заказных Побитовых отображений
Пример в этой теме назначает контрольную отметку заказных побитовых отображений в пункты меню в двух меню. Пункты меню в первом меню определяют символьные атрибуты: жирный шрифт, курсив, и подчеркивание. Каждый пункт меню может быть или проверено или неконтролируемый. Для этих пунктов меню, пример использует контрольная отметка побитовых отображений с которыми имеют сходство проверенное и неконтролируемое состояния контрольного управления блока.
Пункты меню во втором меню определяют установочные параметры выравнивания параграфа: оставленное, отцентрированное, и право. Только один из этих пунктов меню проверены в любом данном времени. Для этих пунктов меню, пример использует контрольная отметка побитовых отображений с которыми имеют сходство проверенное и неконтролируемое состояния радио управления кнопки. Процедура окна обрабатывает сообщение WM_CREATE вызывая определенную прикладную функцию OnCreate. OnCreate СОЗДАЕТ четыре контрольных отметки побитовых отображений затем назначает ими в их подходящие пункты меню используя функцию SetMenuItemBitmaps.
Для того, чтобы создавать каждое побитовое отображение, OnCreate вызывает определенную прикладную функцию CreateMenuBitmaps, определение указателя в побитовое отображение-специфический чертеж функции. CreateMenuBitmaps СОЗДАЕТ монохромное побитовое отображение необходимого размера, выбирается это в контекст устройства памяти и стирает фон. Затем это вызывает определенный чертеж функции, чтобы заполнять передний план. Четыре определенных приложений, рисующих функции - DrawCheck, DrawUncheck, DrawRadioCheck, и DrawRadioUncheck. Они делают прямоугольником с X, пустой прямоугольник, эллипс, содержащие меньше заполненный эллипс, и пустой эллипс, соответственно.
Процедура окна обрабатывает сообщение WM_DESTROY удаляя контрольную отметку побитовых отображений. Это извлекает каждую ручку побитового отображения используя функцию GetMenuItemInfo затем передает ручку в функцию DeleteObject. Когда пользователь выбирает пункт меню, сообщение WM_COMMAND послано в окно владельца. Для пунктов меню в меню Символа, процедура окна вызывает определенную прикладную функцию CheckCharacterItem. Для пунктов в меню Параграфа, процедура окна вызывает определенную прикладную функцию CheckParagraphItem.
Каждый пункт в меню Символа может быть проверен и неконтролируемый независимо. Следовательно, CheckCharacterItem просто переключает определенный пункт контрольного состояния меню. Сначала, функциональные вызовы функция GetMenuItemInfo, чтобы получать состояние пункта текущего меню. Затем это переключает состояние MFS_CHECKED сигнализировать и устанавливает новое состояние вызывая функцию SetMenuItemInfo. В отличие от символьных атрибутов, только одно выравнивание параграфа может выбираться за один раз. Следовательно, CheckParagraphItem проверяет определенный пункт меню и удаляет контрольную отметку из всех других пунктов в меню. Чтобы делать так, это вызывает функцию CheckMenuRadioItem.
Следующее является важными частями прикладного файла заголовка.
// Меню-пункт идентификаторов для меню Символа #define IDM_CHARACTER 10 #define IDM_BOLD 11 #define IDM_ITALIC 12 #define IDM_UNDERLINE 13 // Меню-пункт идентификаторов для меню Параграфа #define IDM_PARAGRAPH 20 #define IDM_LEFT 21 #define IDM_CENTER 22 #define IDM_RIGHT 23 // Функциональный указатель типа для чертежа функций typedef ПУСТОТА (WINAPI * DRAWFUNC)(HDC hdc, РАЗМЕР размера);
Следующее - важные части прикладной процедуры окна и связанных функций.
LRESULT CALLBACK MainWindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { ключ (uMsg) { случай WM_CREATE: если (!OnCreate ВОЗВРАТА(hwnd)) -1; прерывание; случай WM_DESTROY: OnDestroy(hwnd); PostQuitMessage(0); прерывание; случай WM_COMMAND: ключ (LOWORD(wParam)) { случай IDM_BOLD:
случай IDM_ITALIC: случай IDM_UNDERLINE: CheckCharacterItem(hwnd, LOWORD(wParam)); прерывание; случай IDM_LEFT: случай IDM_CENTER: случай IDM_RIGHT: CheckParagraphItem(hwnd, LOWORD(wParam)); прерывание; . . // Процесс другие команды здесь. . }
прерывание; . . // Процесс другие сообщения здесь. . умолчание: возвращайте DefWindowProc(hwnd, uMsg, wParam, lParam); } возврат 0; } ПУСТОТА WINAPI CheckCharacterItem(HWND hwnd, UINT uID) { HMENU hmenuBar = GetMenu(hwnd); HMENU hmenuPopup; mii MENUITEMINFO; // Получите ручку меню Символа. mii.fMask = MIIM_SUBMENU; // информация, чтобы получать GetMenuItemInfo(hmenuBar, IDM_CHARACTER, ЛОЖЬ, &mii);
hmenuPopup = mii.hSubMenu; // Получите состояние определенного пункта меню. mii.fMask = MIIM_STATE; // информация, чтобы получать GetMenuItemInfo(hmenuPopup, uID, ЛОЖЬ, &mii); // Переключатель проверенное состояние. mii.fState ^= MFS_CHECKED; SetMenuItemInfo(hmenuPopup, uID, ЛОЖЬ, &mii); } ПУСТОТА WINAPI CheckParagraphItem(HWND hwnd, UINT uID) { HMENU hmenuBar = GetMenu(hwnd); HMENU hmenuPopup; mii MENUITEMINFO;
// Получите ручку меню Параграфа. mii.fMask = MIIM_SUBMENU; // информация, чтобы получать GetMenuItemInfo(hmenuBar, IDM_PARAGRAPH, ЛОЖЬ, &mii); hmenuPopup = mii.hSubMenu; // Проверьте определенный пункт и uncheck все другие. CheckMenuRadioItem( hmenuPopup, // РУЧКА меню IDM_LEFT, // первого пункта в дипазоне IDM_RIGHT, // последнем пункте в дипазоне uID, // пункте, чтобы проверяться
MF_BYCOMMAND // IDs, не позиции ); } BOOL WINAPI OnCreate(HWND hwnd) { HMENU hmenuBar = GetMenu(hwnd); HMENU hmenuPopup; mii MENUITEMINFO; UINT uID; HBITMAP hbmChecked; HBITMAP hbmUnchecked; // Получите ручку меню Символа. mii.fMask = MIIM_SUBMENU; // информация, чтобы получать GetMenuItemInfo(hmenuBar, IDM_CHARACTER, ЛОЖЬ, &mii); hmenuPopup = mii.hSubMenu;
// Создайте проверенное и неконтролируемое побитовые отображения. hbmChecked = CreateMenuBitmap(DrawCheck); hbmUnchecked = CreateMenuBitmap(DrawUncheck); // Установленный побитовые отображения checkmark для каждого пункта меню. для (uID = IDM_BOLD; uID <= IDM_UNDERLINE; uID++) { SetMenuItemBitmaps(hmenuPopup, uID, MF_BYCOMMAND, hbmUnchecked, hbmChecked); } // Получите ручку управляющего меню Параграфа. mii.fMask = MIIM_SUBMENU; // информация, чтобы становиться
GetMenuItemInfo(hmenuBar, IDM_PARAGRAPH, ЛОЖЬ, &mii); hmenuPopup = mii.hSubMenu; // Создайте проверенное и неконтролируемое побитовые отображения. hbmChecked = CreateMenuBitmap(DrawRadioCheck); hbmUnchecked = CreateMenuBitmap(DrawRadioUncheck); // Установленный побитовые отображения checkmark для каждого пункта меню. для (uID = IDM_LEFT; uID <= IDM_RIGHT; uID++) { SetMenuItemBitmaps(hmenuPopup, uID, MF_BYCOMMAND, hbmUnchecked, hbmChecked);
} // Первоначально проверьте пункт параграфа IDM_LEFT. CheckMenuRadioItem(hmenuPopup, IDM_LEFT, IDM_RIGHT, IDM_LEFT, MF_BYCOMMAND); возвращайтесь ВЕРНО; } HBITMAP WINAPI CreateMenuBitmap(DRAWFUNC lpfnDraw) { // Создайте DC совместимый с настольным окном DC. HWND hwndDesktop = GetDesktopWindow(); HDC hdcDesktop = GetDC(hwndDesktop); HDC hdcMem = CreateCompatibleDC(hdcDesktop); // Определите необходимый размер побитового отображения.
DWORD dwExt = GetMenuCheckMarkDimensions(); РАЗМЕР размера = { LOWORD(dwExt), HIWORD(dwExt) }; // Создайте монохромное побитовое отображение и выбирайтесь это. HBITMAP hbm = CreateBitmap(size.cx, size.cy, 1, 1, НЕДЕЙСТВИТЕЛЬНОЕ); HBITMAP hbmOld = SelectObject(hdcMem, hbm); // Выстирайте фон и вызывайте чертеж функции. PatBlt(hdcMem, 0, 0, size.cx, size.cy, БЕЛИЗНА); (*lpfnDraw)(hdcMem, размер); // Наведите порядок. SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem); ReleaseDC(hwndDesktop, hdcDesktop); возврат hbm; } ПУСТОТА WINAPI DrawCheck(HDC hdc, РАЗМЕР размера) { HBRUSH hbrOld; hbrOld = SelectObject(hdc, GetStockObject(NULL_BRUSH)); Прямоугольник(hdc, 0, 0, size.cx, size.cy); MoveToEx(hdc, 0, 0, НЕДЕЙСТВИТЕЛЬНОЕ); LineTo(hdc, size.cx, size.cy); MoveToEx(hdc, 0, size.cy - 1, НЕДЕЙСТВИТЕЛЬНОЕ); LineTo(hdc, size.cx - 1, 0); SelectObject(hdc, hbrOld); } ПУСТОТА WINAPI DrawUncheck(HDC hdc, РАЗМЕР размера)
{ HBRUSH hbrOld; hbrOld = SelectObject(hdc, GetStockObject(NULL_BRUSH)); Прямоугольник(hdc, 0, 0, size.cx, size.cy); SelectObject(hdc, hbrOld); } ПУСТОТА WINAPI DrawRadioCheck(HDC hdc, РАЗМЕР размера) { HBRUSH hbrOld; hbrOld = SelectObject(hdc, GetStockObject(NULL_BRUSH)); Эллипс(hdc, 0, 0, size.cx, size.cy); SelectObject(hdc, GetStockObject(BLACK_BRUSH)); Эллипс(hdc, 2, 2, size.cx - 2, size.cy - 2); SelectObject(hdc, hbrOld);
} ПУСТОТА WINAPI DrawRadioUncheck(HDC hdc, РАЗМЕР размера) { HBRUSH hbrOld; hbrOld = SelectObject(hdc, GetStockObject(NULL_BRUSH)); Эллипс(hdc, 0, 0, size.cx, size.cy); SelectObject(hdc, hbrOld); } ПУСТОТА WINAPI OnDestroy(HWND hwnd) { HMENU hmenuBar = GetMenu(hwnd); HMENU hmenuPopup; mii MENUITEMINFO; // Получите ручку меню Символа. mii.fMask = MIIM_SUBMENU; // информация, чтобы получать GetMenuItemInfo(hmenuBar, IDM_CHARACTER, ЛОЖЬ, &mii);
hmenuPopup = mii.hSubMenu; // Получите контрольную отметку побитовых отображений и удаляйте им. mii.fMask = MIIM_CHECKMARKS; GetMenuItemInfo(hmenuPopup, IDM_BOLD, ЛОЖЬ, &mii); DeleteObject(mii.hbmpChecked); DeleteObject(mii.hbmpUnchecked); // Получите ручку меню Параграфа. mii.fMask = MIIM_SUBMENU; // информация, чтобы получать GetMenuItemInfo(hmenuBar, IDM_PARAGRAPH, ЛОЖЬ, &mii); hmenuPopup = mii.hSubMenu; // Получите контрольную отметку побитовых отображений и удаляйте им.
mii.fMask = MIIM_CHECKMARKS; GetMenuItemInfo(hmenuPopup, IDM_LEFT, ЛОЖЬ, &mii); DeleteObject(mii.hbmpChecked); DeleteObject(mii.hbmpUnchecked); }
|
|
|
|
| |