Приклад пункт меню крапкові малюнки

Прикладом у цьому розділі створює два меню, кожна з яких містить кілька пунктів меню крапковий малюнок. Для кожного меню додаток додає імені відповідного меню панелі меню головного вікна.

У першому меню містить елементи меню показані кожного з трьох типів діаграм: пиріг, лінії і бар. Крапкові малюнки для цих елементів меню визначаються як ресурси і завантажуються за допомогою в LoadBitmap функції. Пов'язані з цього меню є ім'я меню "Діаграма" на панелі меню.

Друге меню містить елементи меню показані кожного з п'яти лінія стилі, що використовується з у CreatePen функції: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT і PS_DASHDOTDOT. Застосунок створює крапкові малюнки для цих елементів меню під час виконання, використовуючи GDI графічні функції. Пов'язані з цього меню є ім'я меню "Рядки" на панелі меню.

У вікні процедура є двох масивів статичні дескрипторів крапковий малюнок. Один масив містить маркери три крапкові малюнки, використані для меню діаграми. Інші містить маркери п'ять крапкові малюнки для рядків меню. Під час обробки повідомлення WM_CREATE , процедура вікно навантажень крапковий малюнок діаграми, створює крапкові малюнки лінію і потім додає відповідні елементи меню. Під час обробки повідомлення WM_DESTROY , процедура вікно видаляються всі крапковий малюнок.

Нижче наводяться відповідні частини програми заголовка файлу.

/ / Елемент меню ідентифікатори # визначити IDM_PIE 1 # визначити IDM_LINE 2 # визначити IDM_BAR 3 # визначити IDM_SOLID 4 # визначити IDM_DASH 5 # визначити IDM_DASHDOT 6 # визначити IDM_DASHDOTDOT 7 / / номер елементів меню діаграми та лінії # визначити C_LINES 5 # визначити C_CHARTS 3 / / бітові ресурс ідентифікатори # визначити IDB_PIE 1 # визначити IDB_LINE 2 # визначити IDB_BAR 3 / / розміри лінія крапкові # визначити CX_LINEBMP 40 # визначити 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; 
 
    перемикач (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: для (я = 0; я < C_LINES; i + +) DeleteObject(aHbmLines[i]); 
            для (я = 0; я < 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. Для кожного типу лінії функція створює крапковий малюнок, виділяє його в пам'ять 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; 
 
     / / Створення пензля за допомогою меню колір тла, / / та виберіть її в пам'ять DC. 
 
    hbrOld = об'єкт (hdcMem, CreateSolidBrush(clrMenu)); 
 
     / / Створити крапковий малюнок. Виберіть кожного з них в пам'яті / / DC, що був створений і звернути на це. 
 
    для (я = 0; я lt; C_LINES; i + +) {/ / створення малюнка і виберіть його в постійного струму. 
 
        paHbm, [i] = CreateCompatibleBitmap (hdcDesktop, CX_LINEBMP, CY_LINEBMP); 
        hbmOld = об'єкт (hdcMem, paHbm[i]); 
 
        / / Заповнення фону за допомогою пензля. 
 
        PatBlt (hdcMem, 0, 0, CX_LINEBMP, CY_LINEBMP, PATCOPY); 
 
        / / Створення пера та виберіть її в постійного струму. 
 
        hpenOld = об'єкт (hdcMem, CreatePen (PS_SOLID + I, 1, RGB (0, 0, 0))); 
 
         / / Намалювати лінію. Щоб зберегти колір тла де / / перо є білий, R2_MASKPEN графічний режим. 
 
        fnDrawMode = SetROP2 (hdcMem, R2_MASKPEN); 
        MoveToEx (hdcMem, 0, CY_LINEBMP/2, значення НУЛЬ); 
        LineTo (hdcMem, CX_LINEBMP, CY_LINEBMP/2); 
        SetROP2 (hdcMem, fnDrawMode); 
 
        / / Видалити пера і виберіть старі пера та бітові. 
 
        Макросу видалити об'єкт (об'єкт (hdcMem, hpenOld)); 
        Об'єкт (hdcMem, hbmOld); 
    } / / Видалити пензель і встановіть вихідний. 
 
    Макросу видалити об'єкт (об'єкт (hdcMem, hbrOld)); 
 
    / / Видалити пам'яті DC і звільнити робочого стола постійного струму. 
 
    DeleteDC(hdcMem); 
    ReleaseDC (hwndDesktop, hdcDesktop); 
} 

 

Визначений у застосунку AddBitmapMenu функція створює меню і додає вказану кількість пунктів меню крапковий малюнок. Потім він додає імені відповідного меню вікно вказаного рядка меню.

 ПОРОЖНЕЧІ WINAPI AddBitmapMenu (HWND hwnd, / / вікна, що належить рядок LPSTR lpszText, меню / / текст меню назва меню Бар UINT uID, / / Ідентифікатор перший бітових меню пункту HBITMAP * paHbm, / / крапкові малюнки для меню елементів int cItems) / / номер бітових пунктів меню {HMENU hmenuBar = GetMenu(hwnd); 
    HMENU-hmenuPopup = CreatePopupMenu(); 
    Мії MENUITEMINFO; 
    Int; 
 
    / / Додати пункти меню крапковий малюнок до меню. 
 
    для (я = 0; я lt; cItems; i + +) {mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_DATA; 
        Mii.fType = MFT_BITMAP; 
        Mii.wID = uID + I; 
        Mii.dwTypeData = (LPSTR) (paHbm[i]); 
        InsertMenuItem (hmenuPopup, i, правда & Мії); 
    } / / Додати ім'я меню в рядку меню. 
 
    Mii.fMask = MIIM_TYPE | MIIM_DATA | MIIM_SUBMENU; 
    Mii.fType = MFT_STRING; 
    Mii.hSubMenu = hmenuPopup; 
    Mii.dwTypeData = lpszText; 
    InsertMenuItem (hmenuBar, GetMenuItemCount(hmenuBar), правда і Мії); 
} 

 

Index