Eksempel på menyelement punktgrafikk

Eksempelet i dette emnet oppretter to menyer, hver med flere menyelementer for punktgrafikk. For hver meny legger programmet en tilsvarende menynavn til hovedvinduets menylinjen.

Den første menyen inneholder menyelementer som viser hver av tre diagramtypene: sektor-, linje- og bar. Punktgrafikk for disse menyelementer er definert som ressurser og er lastet inn ved hjelp av den LoadBitmap -funksjonen. Tilknyttet denne menyen er en "Diagram" menynavnet på menylinjen.

Den andre menyen inneholder menyelementer som viser hver av de fem linjestilene som brukes med den CreatePen -funksjon: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, og PS_DASHDOTDOT. Programmet oppretter punktgrafikk for disse menyelementer på ved hjelp av GDI tegning funksjoner operasjonstiden. Tilknyttet denne menyen er en "Linjer" menynavnet på menylinjen.

Definert i programmets vindusprosedyre er to statisk matriser av punktgrafikk håndtakene. En matrise inneholder håndtakene på tre punktgrafikk brukes til diagram-menyen. Den andre inneholder håndtakene på de fem punktgrafikk som brukes for linjer-menyen. Ved behandling av WM_CREATE -meldingen, vinduet prosedyren laster diagram-punktgrafikk, oppretter linje-punktgrafikk, og legger deretter de tilsvarende menyelementene. Ved behandling av WM_DESTROY -meldingen, sletter vinduet fremgangsmåten alle punktgrafikk.

Følgende er de relevante delene av programmets fil for filhode.

/ / Menyelementet identifikatorer # 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 / / antall elementer på diagrammet og linjer definerer # C_LINES 5 # define C_CHARTS 3 / / punktgrafikk resource identifiers # define IDB_PIE 1 # define IDB_LINE 2 # define IDB_BAR 3 / / mål av linje-punktgrafikk # define CX_LINEBMP 40 # define CY_LINEBMP 10 

 

Følgende er de relevante delene av vinduet prosedyren. Vinduet prosedyren utfører mesteparten av sin initialisering ved å kalle programdefinert LoadChartBitmaps, CreateLineBitmaps og AddBitmapMenu funksjonene, som er beskrevet senere i dette emnet.

Ikke hente LRESULT TILBAKERINGING MainWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {statiske HBITMAP aHbmLines [C_LINES]; 
    statisk HBITMAP aHbmChart [C_CHARTS]; 
    Int jeg; 
 
    bryteren (uMsg) {case WM_CREATE: / / Call programdefinert funksjoner for å laste inn den / / punktgrafikk for diagram-menyen og opprette disse for / / linjer-menyen. 
 
            LoadChartBitmaps(aHbmChart); 
            CreateLineBitmaps(aHbmLines); 
 
             / / Kaller en programdefinert-funksjonen for å opprette / / menyer som inneholder menyelementer punktgrafikk. Funksjonen / / legger også til et menynavn vinduets menylinjen. 
 
            AddBitmapMenu (hwnd, / / menylinjens eier vinduet "amp;Diagrammet", / / teksten menyen navn på menyen bar IDM_PIE, / / ID for første elementet på menyen aHbmChart, / / matrise av punktgrafikk håndterer C_CHARTS / / antall elementer på menyen); 
            AddBitmapMenu (hwnd, "& linjer", IDM_SOLID, aHbmLines, C_LINES); 
            Break; 
 
        Case WM_DESTROY: for (jeg = 0; jeg < C_LINES; i ++) DeleteObject(aHbmLines[i]); 
            for (jeg = 0; jeg < C_CHARTS; i ++) DeleteObject(aHbmChart[i]); 
            PostQuitMessage(0); 
            Break; 
 
        / / Prosessen flere meldinger her. 
 
        standard: return (DefWindowProc (hwnd, uMsg, wParam, lParam)); 
    } returnere 0; 
} 

 

Funksjonen programdefinert LoadChartBitmaps laster inn punktgrafikk-ressurser for diagram-menyen ved å kalle den LoadBitmap fungere som følger.

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

 

Programdefinert CreateLineBitmaps funksjonen oppretter punktgrafikk for linjer-menyen ved hjelp av GDI tegning funksjoner. Funksjonen oppretter en enhetskontekst minne (DC) med de samme egenskapene som skrivebordsvinduets DC. For hver linjestil, funksjonen oppretter et punktgrafikkbilde, velges den inn i minnet DC og trekker i det.

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 jeg; 
 
     / / Opprett en pensel med bakgrunnsfargen menyen, / / og velge filen i minnet DC. 
 
    hbrOld = MerkObjekt (hdcMem, CreateSolidBrush(clrMenu)); 
 
     / / Opprett punktgrafikk. Velg hver enkelt inn i minnet / / DC som ble opprettet og trekke i den. 
 
    for (jeg = 0; jeg lt; C_LINES; i ++) {/ / opprette punktgrafikkbildet og velg det til Domenekontrolleren. 
 
        paHbm [i] = CreateCompatibleBitmap (hdcDesktop, CX_LINEBMP, CY_LINEBMP); 
        hbmOld = MerkObjekt (hdcMem, paHbm[i]); 
 
        / / Fylle bakgrunnen bruker penselen. 
 
        PatBlt (hdcMem, 0, 0, CX_LINEBMP, CY_LINEBMP, PATCOPY); 
 
        / / Opprett pennen og velg det til Domenekontrolleren. 
 
        hpenOld = MerkObjekt (hdcMem, CreatePen (PS_SOLID + i, 1, RGB (0, 0, 0))); 
 
         / / Trekke linjen. Hvis du vil beholde bakgrunnsfargen der / / pennen er hvit, bruk R2_MASKPEN tegning-modus. 
 
        fnDrawMode = SetROP2 (hdcMem, R2_MASKPEN); 
        MoveToEx (hdcMem, 0, CY_LINEBMP/2, NULL); 
        LineTo (hdcMem, CX_LINEBMP, CY_LINEBMP/2); 
        SetROP2 (hdcMem, fnDrawMode); 
 
        / / Slette pennen, og velg gamle penn og punktgrafikk. 
 
        SlettObjekt (MerkObjekt (hdcMem, hpenOld)); 
        MerkObjekt (hdcMem, hbmOld); 
    } / / Slette penselen, og velg den opprinnelige penselen. 
 
    SlettObjekt (MerkObjekt (hdcMem, hbrOld)); 
 
    / / Slett minnet DC, og slipp den stasjonære DC. 
 
    DeleteDC(hdcMem); 
    ReleaseDC (hwndDesktop, hdcDesktop); 
} 

 

Programdefinert AddBitmapMenu funksjonen oppretter en meny, og legger til det angitte antallet punktgrafikk menyelementer. Deretter legges det til et tilsvarende menynavn til det angitte vinduet menylinjen.

 VOID WINAPI AddBitmapMenu (HWND hwnd, / / vinduet som eies menylinjen LPSTR lpszText, / / teksten menyen navn på menylinjen UINT uID, / / ID av første punktgrafikk-menyen vare HBITMAP * paHbm, / / punktgrafikk for menyen elementer cItems int) / / antall punktgrafikk menyelementer {HMENU hmenuBar = GetMenu(hwnd); 
    HMENU hmenuPopup = CreatePopupMenu(); 
    MENUITEMINFO mii; 
    Int jeg; 
 
    / / Legge til menyelementer punktgrafikk på menyen. 
 
    for (jeg = 0; jeg 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); 
    } / / Legge til et menynavn for i menylinjen. 
 
    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