Przykładem elementu Menu mapy bitowe

W przykładzie tego tematu tworzy dwa menu, każda zawierająca kilka elementów menu mapy bitowej. Dla każdego menu stosowania dodaje odpowiednie nazwy menu na pasku menu głównego okna.

Pierwszym menu zawiera elementy menu wykazujące każdego z trzech typów wykresów: wykres kołowy, linii i bar. Mapy bitowe dla tych elementów menu są zdefiniowane jako zasoby i są ładowane za pomocą LoadBitmap funkcji. Związane z tym menu jest "Wykres" nazwy menu na pasku menu.

Drugim menu zawiera elementy menu wykazujące każdego z style pięciu linii z CreatePen funkcji: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT i PS_DASHDOTDOT. Aplikacja tworzy mapy bitowe dla tych elementów menu w czasie wykonywania przy użyciu funkcje rysunkowego interfejsu GDI. Związane z tym menu jest "Wiersze" nazwy menu na pasku menu.

Zdefiniowane w procedurę okna aplikacji są dwie tablice statycznej mapy bitowej uchwytów. Jedną macierz zawiera uchwyty trzech bitmapy używany w menu Wykres. Druga zawiera uchwyty pięciu bitmapy używany dla menu linii. Podczas przetwarzania wiadomości WM_CREATE , procedurę okna ładuje bitmapy wykresu, tworzy mapy bitowe linii, a następnie dodaje odpowiednie elementy menu. Podczas przetwarzania wiadomości WM_DESTROY , procedurę okna powoduje usunięcie wszystkich bitmap.

Poniżej przedstawiono odpowiednie fragmenty pliku nagłówka aplikacji.

/ / Identyfikatory elementu menu # define # define # define # define IDM_SOLID 4 # define # define # define 6 IDM_DASHDOT 5 IDM_DASH 3 IDM_BAR 2 IDM_LINE 1 IDM_PIE IDM_DASHDOTDOT 7 / / liczba elementów menu Wykres i linie # define C_LINES 5 # define C_CHARTS 3 / / bitmapy identyfikatory zasobów # define # define # define 2 IDB_LINE 1 IDB_PIE IDB_BAR 3 / / wymiarów bitmap linia # define CX_LINEBMP 40 # define CY_LINEBMP 10 

 

Poniżej przedstawiono istotne części procedury okna. Procedurę okna wykonuje większość jego inicjowania wywołując zdefiniowanych przez aplikację LoadChartBitmaps, CreateLineBitmaps i AddBitmapMenu funkcje, opisanych w dalszej części tego tematu.

MainWindowProc LRESULT wywołania zwrotnego (HWND hwnd, UINT uMsg, WPARAM wParam, FIKCYJNYMI fikcyjnymi) {statyczne HBITMAP aHbmLines [C_LINES]; 
    statyczne HBITMAP aHbmChart [C_CHARTS]; 
    int i; 
 
    Przełącznik (uMsg) {Sprawa WM_CREATE: / / wywoływać funkcje zdefiniowane przez aplikację do ładowania / / bitmapy w menu Wykres i utworzyć dla / / menu linii. 
 
            LoadChartBitmaps(aHbmChart); 
            CreateLineBitmaps(aHbmLines); 
 
             / / Wywołania funkcji zdefiniowanych przez aplikację do tworzenia / / menu, zawierające elementy menu mapy bitowej. Funkcja / / również dodanie nazwy menu na pasku menu Okno. 
 
            AddBitmapMenu (hwnd, / / właściciel pasek menu Okno "amp;Wykres", / / tekst menu Nazwa menu paska IDM_PIE, / / identyfikator z pierwszą pozycję w menu aHbmChart, / / tablicy bitmapy obsługuje C_CHARTS / / liczba elementów w menu); 
            AddBitmapMenu (hwnd, "& linie", IDM_SOLID, aHbmLines, C_LINES); 
            podział; 
 
        Sprawa WM_DESTROY: dla (i = 0; i < C_LINES; i ++) DeleteObject(aHbmLines[i]); 
            dla (i = 0; i < C_CHARTS; i ++) DeleteObject(aHbmChart[i]); 
            PostQuitMessage(0); 
            podział; 
 
        / / Procesu dodatkowe wiadomości tutaj. 
 
        Domyślnie: powrotu (DefWindowProc (hwnd, uMsg, wParam, fikcyjnymi)); 
    } zwraca 0; 
} 

 

Funkcja LoadChartBitmaps zdefiniowanych przez aplikację ładuje zasoby mapy bitowej dla menu Wykres przez wywołanie LoadBitmap działać następująco.

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)); 
} 

 

Funkcja CreateLineBitmaps zdefiniowanych przez aplikację tworzy mapy bitowe menu wierszy za pomocą funkcji rysowania GDI. Funkcja tworzy kontekstu urządzenia pamięci (DC) z tych samych właściwości w oknie pulpitu DC. Dla każdego stylu linii funkcja tworzy mapę bitową, zaznacza go do pamięci DC i rysuje on.

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; 
 
     / / Create pędzla przy użyciu menu Kolor tła, / / i zaznacz go do pamięci DC. 
 
    hbrOld = WybierzObiekt (hdcMem, CreateSolidBrush(clrMenu)); 
 
     / / Create bitmapy. Zaznacz każdy z nich do pamięci / DC, który został utworzony i rysować w nim. 
 
    dla (i = 0; i lt; C_LINES; i ++) {/ / Tworzenie mapy bitowej i zaznacz go w kontroler domeny. 
 
        paHbm, [i] = CreateCompatibleBitmap (hdcDesktop, CX_LINEBMP, CY_LINEBMP); 
        hbmOld = WybierzObiekt (hdcMem, paHbm[i]); 
 
        / / Wypełnienia tła za pomocą pędzla. 
 
        PatBlt (hdcMem, 0, 0, CX_LINEBMP, CY_LINEBMP, PATCOPY); 
 
        / / Tworzenie pióro i zaznacz go w kontroler domeny. 
 
        hpenOld = WybierzObiekt (hdcMem, CreatePen (PS_SOLID + i, 1, RGB (0, 0, 0))); 
 
         / / Narysować linię. Aby zachować kolor tła gdzie / / pióro jest biały, należy użyć trybu rysowania R2_MASKPEN. 
 
        fnDrawMode = SetROP2 (hdcMem, R2_MASKPEN); 
        MoveToEx (hdcMem, 0, CY_LINEBMP/2, NULL); 
        LineTo (hdcMem, CX_LINEBMP, CY_LINEBMP/2); 
        SetROP2 (hdcMem, fnDrawMode); 
 
        / / Usuń pióro i wybierz pióro starych i bitmapy. 
 
        UsuńObiekt (WybierzObiekt (hdcMem, hpenOld)); 
        WybierzObiekt (hdcMem, hbmOld); 
    } / / Usuń pędzel i wybierz pędzel oryginalny. 
 
    UsuńObiekt (WybierzObiekt (hdcMem, hbrOld)); 
 
    / / Usuń pamięci DC i zwolnić pulpitu DC. 
 
    DeleteDC(hdcMem); 
    ReleaseDC (hwndDesktop, hdcDesktop); 
} 

 

Funkcja AddBitmapMenu zdefiniowanych przez aplikację tworzy menu i dodaje określoną liczbę elementów menu mapy bitowej do niej. Następnie dodaje odpowiednie nazwy menu do paska menu określonego okna.

 VOID WINAPI AddBitmapMenu (HWND hwnd, / / okno, własnością z menu LPSTR lpszText, / / tekst menu Nazwa menu UINT uID, / / identyfikator pierwszego menu mapy bitowej element HBITMAP * paHbm, / / bitmapy menu elementów int cItems) / / liczba elementów menu mapy bitowej {HMENU hmenuBar = GetMenu(hwnd); 
    HMENU hmenuPopup = CreatePopupMenu(); 
    MENUITEMINFO mii; 
    int i; 
 
    / / Dodaj elementy menu mapy bitowej do menu. 
 
    dla (i = 0; i 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 TRUE & mii); 
    } / / Dodanie nazwy menu na pasku menu. 
 
    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