Exemplu de element de meniu bitmap-uri

Exemplul din acest subiect creează două meniuri, fiecare conținând mai multe elemente de meniu bitmap. Pentru fiecare meniu, aplicarea adaugă un nume de meniu corespunzătoare la bara de meniu a ferestrei principale.

Primul meniu conține elemente de meniu care arată fiecare de trei tipuri de diagramă: pie, linie și bar. Bitmap-uri pentru aceste elemente de meniu sunt definite ca resurse și sunt încărcate cu ajutorul LoadBitmap funcție. Asociate cu acest meniu este un nume de meniu "Chart" pe bara de meniu.

Al doilea meniu conține elemente de meniu care să indice fiecare dintre stilurile de linie cinci utilizate cu CreatePen funcție: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, și PS_DASHDOTDOT. Aplicarea creează fișiere bitmap pentru aceste elemente de meniu la timpul de execuție utilizând GDI desen funcții. Asociate cu acest meniu este un nume de meniu "Liniile" pe bara de meniu.

Definite în procedura fereastra aplicației sunt două matrice statică de mânerele bitmap. Un array conține mânerele de trei bitmap-uri utilizate pentru diagramă din meniul Diagramă. Alte conține mânerele de cinci bitmap-uri utilizate pentru meniul de linii. Atunci când prelucrarea mesaj WM_CREATE , procedura fereastra încarcă bitmap diagramă, creează bitmap linie, și apoi adaugă elementele de meniu corespunzătoare. Atunci când prelucrarea mesaj WM_DESTROY , fereastra procedură șterge toate imaginile bitmap.

Următoarele sunt porțiuni relevante ale aplicației antet Fișier.

/ / Element de meniu identificatori # 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 / numărul de elemente din meniuri diagramă și linii # define C_LINES 5 # define C_CHARTS 3 / / Bitmap identificatori de resurse # define IDB_PIE 1 # define IDB_LINE 2 # define IDB_BAR 3 / / dimensiuni de bitmap linie # define CX_LINEBMP 40 # define CY_LINEBMP 10 

 

Următoarele sunt porțiuni relevante din fereastra procedura. Procedura fereastra efectuează cele mai multe de inițializare sale prin apel la cerere-LoadChartBitmaps, CreateLineBitmaps și AddBitmapMenu funcții definite, descrisă ulterior în acest subiect.

MainWindowProc LRESULT apel INVERS (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {statică HBITMAP aHbmLines [C_LINES]; 
    static HBITMAP aHbmChart [C_CHARTS]; 
    int i; 
 
    Switch (uMsg) {caz WM_CREATE: / / apel funcții definite de aplicare pentru a încărca / / bitmap-uri pentru meniul diagramă și de a crea cele pentru / / meniul de linii. 
 
            LoadChartBitmaps(aHbmChart); 
            CreateLineBitmaps(aHbmLines); 
 
             / / Apel o funcție definită de aplicare pentru a crea / / meniuri care conține elementele de meniu bitmap. Funcția / / adaugă, de asemenea, un nume de meniu la bara de meniu a ferestrei. 
 
            AddBitmapMenu (hwnd, / / meniu bar proprietar fereastra "amp;Chart", / / text din meniul Nume pe meniu bar IDM_PIE, / / ID de primul element pe meniul aHbmChart, / / matrice de bitmap mânere C_CHARTS / numărul de elemente din meniul); 
            AddBitmapMenu (hwnd, "& liniile", IDM_SOLID, aHbmLines, C_LINES); 
            pauză; 
 
        WM_DESTROY de caz: pentru (i = 0; i < C_LINES; i ++) DeleteObject(aHbmLines[i]); 
            pentru (i = 0; i < C_CHARTS; i ++) DeleteObject(aHbmChart[i]); 
            PostQuitMessage(0); 
            pauză; 
 
        / / Proces suplimentare mesaje aici. 
 
        implicit: return (DefWindowProc (hwnd, uMsg, wParam, lParam)); 
    } întoarce 0; 
} 

 

Funcția LoadChartBitmaps definită de aplicarea încarcă resursele bitmap pentru diagramă din meniul diagramă prin apelarea LoadBitmap funcție, după cum urmează.

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

 

Funcția CreateLineBitmaps definită de aplicarea creează fișiere bitmap pentru meniul de linii utilizând GDI desen funcții. Funcția creează un context de dispozitiv de memorie (DC) cu aceleași proprietăți ca fereastra desktop DC. Pentru fiecare stil de linie, funcția creează un bitmap, selectează în memoria DC, și atrage în ea.

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; 
 
     / / Creați o pensulă utilizând culoarea de fundal meniul, / / și selectați-l în memoria DC. 
 
    hbrOld = SelectObject (hdcMem, CreateSolidBrush(clrMenu)); 
 
     / / Crearea bitmap. Selectați fiecăruia în memorie / / DC care a fost creat și trage în ea. 
 
    pentru (i = 0; i lt; C_LINES; i ++) {/ / Creați bitmap-ul și selectați-l în DC. 
 
        paHbm [i] = CreateCompatibleBitmap (hdcDesktop, CX_LINEBMP, CY_LINEBMP); 
        hbmOld = SelectObject (hdcMem, paHbm[i]); 
 
        / / Umple fundal folosind pensulei. 
 
        PatBlt (hdcMem, 0, 0, CX_LINEBMP, CY_LINEBMP, PATCOPY); 
 
        / / Crearea pen-ul și selectați-l în DC. 
 
        hpenOld = SelectObject (hdcMem, CreatePen (PS_SOLID +, 1, RGB (0, 0, 0))); 
 
         / / Trage linie. Pentru a păstra culoarea de fundal în cazul în care / / pen-ul este alb, utilizați modul de desen de R2_MASKPEN. 
 
        fnDrawMode = SetROP2 (hdcMem, R2_MASKPEN); 
        MoveToEx (hdcMem, 0, CY_LINEBMP/2, NULL); 
        LineTo (hdcMem, CX_LINEBMP, CY_LINEBMP/2); 
        SetROP2 (hdcMem, fnDrawMode); 
 
        / / Șterge pen-ul, și selectați pen vechi și bitmap. 
 
        ȘtergereObiect (SelectObject (hdcMem, hpenOld)); 
        SelectObject (hdcMem, hbmOld); 
    } / / Șterge pensula și selectați pensulă original. 
 
    ȘtergereObiect (SelectObject (hdcMem, hbrOld)); 
 
    / / Șterge memoria DC și eliberarea desktop DC. 
 
    DeleteDC(hdcMem); 
    ReleaseDC (hwndDesktop, hdcDesktop); 
} 

 

Funcția AddBitmapMenu definită de aplicarea creează un meniu și adaugă numărul de elemente de meniu bitmap specificat la aceasta. Apoi se adaugă un nume de meniu corespunzătoare la bara de meniu a ferestrei specificat.

 VOID WINAPI AddBitmapMenu (HWND hwnd, / / fereastra care deținute meniu bar LPSTR lpszText, / / text din meniul Nume pe meniu bar UINT uID, / / ID-ul prima bitmap meniul punctul HBITMAP * paHbm, / / bitmap-uri pentru meniul elemente int cItems) / / numărul de elemente de meniu bitmap {HMENU hmenuBar = GetMenu(hwnd); 
    HMENU hmenuPopup = CreatePopupMenu(); 
    Mii de MENUITEMINFO; 
    int i; 
 
    / / Adăuga elementele de meniu bitmap din meniul. 
 
    pentru (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, adevărat, & mii); 
    } / / Adăuga un nume de meniu la bara de meniu. 
 
    mii.fMask = MIIM_TYPE | MIIM_DATA | MIIM_SUBMENU; 
    mii.fType = MFT_STRING; 
    mii.hSubMenu = hmenuPopup; 
    mii.dwTypeData = lpszText; 
    InsertMenuItem (hmenuBar, GetMenuItemCount(hmenuBar), adevărat, & mii); 
} 

 

Index