Пример элемента меню точечные рисунки

В этом разделе создается два меню, каждый из которых содержит несколько пунктов меню точечного рисунка. Для каждого меню приложение добавляет соответствующее имя меню в строке меню главного окна.

Первое меню содержит пункты меню, отображение каждого из трех типов диаграмм: круговые, линии и бар. Точечные рисунки для этих пунктов меню определяются в качестве ресурсов и загружаются с помощью LoadBitmap функции. В этом меню связана с «Диаграмма» имя меню в строке меню.

Во втором меню содержит пункты меню отображается каждый из пяти линии стили, используемые с CreatePen функция: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT и PS_DASHDOTDOT. Приложение создает точечные рисунки для этих пунктов меню во время выполнения с помощью функции рисования GDI. В этом меню связана с «Линии» имя меню в строке меню.

В процедуре окна приложения являются две статические массивы растровых дескрипторов. Один массив содержит маркеры три растровые изображения, используемые для меню Диаграмма. Другой — ручки пяти растровые изображения, используемые для строки меню. При обработке сообщений WM_CREATE , Оконная процедура загружает растровые изображения диаграммы, создает линия точечных рисунков и затем добавляет соответствующие пункты меню. При обработке сообщения WM_DESTROY , Оконная процедура удаляет все точечных рисунков.

Ниже приведены соответствующие части файла заголовка приложения.

/ / Идентификаторы пункт меню # define IDM_PIE 1 # define IDM_LINE 2 # define IDM_BAR 3 # define IDM_SOLID 4 # define IDM_DASH 5 # define IDM_DASHDOT 6 # define IDM_DASHDOTDOT 7 / / число элементов на диаграмме и строки меню # define C_LINES 5 # define C_CHARTS 3 / / растровые идентификаторы ресурсов # define IDB_PIE 1 # define IDB_LINE 2 # define IDB_BAR 3 / / размеры линии точечных рисунков # define CX_LINEBMP 40 # define CY_LINEBMP 10 
 

Ниже приводятся соответствующие выдержки из процедуры окна. Оконная процедура выполняет большую часть своей инициализации путем вызова определяемых приложением LoadChartBitmaps, CreateLineBitmaps и AddBitmapMenu функций, описанных ниже в этом разделе.

LRESULT обратного ВЫЗОВА MainWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {статические HBITMAP aHbmLines [C_LINES]; 
    статические HBITMAP aHbmChart [C_CHARTS]; 
    int I; 
 
    переключатель (uMsg) {, дело WM_CREATE: / / вызов определяемых приложением функций для загрузки / / растров для меню Диаграмма и создавать для / / строки меню. 
 
            LoadChartBitmaps(aHbmChart); 
            CreateLineBitmaps(aHbmLines); 
 
             / / Звонок определенную приложением функцию для создания / / меню, содержащие элементы меню растрового изображения. Функция / / также добавляет имя меню в строке меню окна. 
 
            AddBitmapMenu (hwnd, / / строка меню окно владельца "amp;Диаграмма", / / текст меню имя меню Бар IDM_PIE, / / ID из первого пункта меню aHbmChart, / / массив растрового изображения обрабатывает C_CHARTS / / количество элементов меню); 
            AddBitmapMenu (hwnd, «и линий», IDM_SOLID, aHbmLines, C_LINES); 
            перерыв; 
 
        дело WM_DESTROY: для (I = 0; I < C_LINES; i ++) DeleteObject(aHbmLines[i]); 
            для (I = 0; I < C_CHARTS; i ++) DeleteObject(aHbmChart[i]); 
            PostQuitMessage(0); 
            перерыв; 
 
        / / Процесс дополнительных сообщений здесь. 
 
        по умолчанию: возвращение (DefWindowProc (hwnd, uMsg, wParam, lParam)); 
    } Возвращает 0; 
} 
 

Приложения-LoadChartBitmaps функция загружает растровый ресурсы для меню Диаграмма путем вызова LoadBitmap функционировать, а именно.

VOID WINAPI LoadChartBitmaps(HBITMAP *paHbm) {paHbm [0] = LoadBitmap (g_hinst, MAKEINTRESOURCE(IDB_PIE)); 
    paHbm [1] = LoadBitmap (g_hinst, MAKEINTRESOURCE(IDB_LINE)); 
    paHbm [2] = LoadBitmap (g_hinst, MAKEINTRESOURCE(IDB_BAR)); 
} 
 

Определенную приложением функцию CreateLineBitmaps создает точечные рисунки для строки меню, используя функции рисования GDI. Функция создает памяти контекст устройства (DC) с теми же свойствами, что DC окна рабочего стола. Для каждого стиля линии функция создает объект bitmap, выбирает его в память DC и, в нем.

VOID WINAPI Create&LineBitmaps(HBITMAP *paHbm) {HWND hwndDesktop = GetDesktopWindow(); 
    HDC hdcDesktop = GetDC(hwndDesktop); 
    HDC hdcMem = CreateCompatibleDC(hdcDesktop); 
    COLORREF clrMenu = GetSysColor(COLOR_MENU); 
    HBRUSH hbrOld; 
    HPEN hpenOld; 
    HBITMAP hbmOld; 
    int fnDrawMode; 
    int I; 
 
     / / Создание кисти с помощью меню Цвет фона, / / и выберите его в память контроллера домена. 
 
    hbrOld = SelectObject (hdcMem, CreateSolidBrush(clrMenu)); 
 
     / / Create точечных рисунков. Выберите каждый из них в память / / DC, был создан и рисовать в нем. 
 
    для (I = 0; I lt; C_LINES; i ++) {/ / создать точечный рисунок и выберите его в DC. 
 
        paHbm [i] = CreateCompatibleBitmap (hdcDesktop, CX_LINEBMP, CY_LINEBMP); 
        hbmOld = SelectObject (hdcMem, paHbm[i]); 
 
        / / Заполнить фон, с помощью кисти. 
 
        PatBlt (hdcMem, 0, 0, CX_LINEBMP, CY_LINEBMP, PATCOPY); 
 
        / / Создать перо и выберите его в DC. 
 
        hpenOld = SelectObject (hdcMem, CreatePen (PS_SOLID + I, 1, RGB (0, 0, 0))); 
 
         / / Черту. Чтобы сохранить цвет фона где / / перо белый, используйте режим рисования R2_MASKPEN. 
 
        fnDrawMode = SetROP2 (hdcMem, R2_MASKPEN); 
        MoveToEx (hdcMem, 0, CY_LINEBMP/2, NULL); 
        LineTo (hdcMem, CX_LINEBMP, CY_LINEBMP/2); 
        SetROP2 (hdcMem, fnDrawMode); 
 
        / / Удалить пера и выберите старый пера и растровые. 
 
        DeleteObject (SelectObject (hdcMem, hpenOld)); 
        SelectObject (hdcMem, hbmOld); 
    } / / Удалить кисть и выберите исходный кисти. 
 
    DeleteObject (SelectObject (hdcMem, hbrOld)); 
 
    / / Удаление памяти DC и отпустите рабочего стола DC. 
 
    DeleteDC(hdcMem); 
    ReleaseDC (hwndDesktop, hdcDesktop); 
} 
 

Приложения-AddBitmapMenu функция создаёт меню и добавляет указанное количество растровых элементов меню. Затем он добавляет соответствующее имя меню в меню указанного окна.

 VOID WINAPI AddBitmapMenu (HWND hwnd, / / окна, принадлежащие строки &LPSTR lpszText, меню / / текст меню имя на строке UINT uID, меню / / ID первого растровых меню пункт HBITMAP * paHbm, / / точечных рисунков для меню пунктов int cItems) / / количество растровых элементов меню {HMENU hmenuBar = GetMenu(hwnd); 
    HMENU hmenuPopup = CreatePopupMenu(); 
    MENUITEMINFO mii; 
    int I; 
 
    / / Добавить пункты меню точечного рисунка в меню. 
 
    для (I = 0; I lt; cItems; i ++) {mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_DATA; 
        Mii.fType = MFT_BITMAP; 
        Mii.wID = uID + я; 
        Mii.dwTypeData = (LPSTR) (paHbm[i]); 
        InsertMenuItem (hmenuPopup, i, TRUE и mii); 
    } / / Добавить имя меню в строке меню. 
 
    Mii.fMask = MIIM_TYPE | MIIM_DATA | MIIM_SUBMENU; 
    Mii.fType = MFT_STRING; 
    Mii.hSubMenu = hmenuPopup; 
    Mii.dwTypeData = lpszText; 
    InsertMenuItem (hmenuBar, GetMenuItemCount(hmenuBar), TRUE и mii); 
} 
 

Index