Örnek menü öğesi bit eşlemleri

Bu konuda örnek birkaç bit eşlemi menü öğeleri içeren iki menü oluşturur. Her menü için uygulama ilgili menü adı ana pencerenin menü çubuğuna ekler.

İlk menü üç grafik türlerinin her biri gösterilen menü öğelerini içerir: pasta, hat ve bar. Bu menü öğeleri için bit eşlemler kaynaklar tanımlanır ve kullanılarak yüklenen LoadBitmap işlevi. Bu menü ile ilişkili bir "Grafik" menüsü menü çubuğunda adıdır.

İkinci menüden gösterilen her beş çizgi stilleri ile kullanılan menü öğelerini içeren CreatePen fonksiyonu: PS_SOLID, ps_dash, ps_dot, ps_dashdot ve ps_dashdotdot. Uygulama, GDI çizim işlevleri kullanarak çalışma zamanında bu menü öğeleri için bit eşlemleri oluşturur. Bu menü ile ilişkili olan menü çubuğunda "Çizgiler" menü adı.

Uygulama penceresinin yordam içinde tanımlanan statik dizilerinin bit eşlem kolları vardır. Bir dizi grafik menüsü için kullanılan üç bit eşlemler kolları içeriyor. Diğer çizgileri menüsü için kullanılan beş bit eşlemler kolları içerir. wm_create iletiyi işlerken, pencere yordamı grafik bit eşlem yükler, hat bit eşlemleri oluşturur ve ilgili menü öğeleri ekler. wm_destroy ileti işleme pencere yordamı tüm bitmaplerin siler.

Aşağıda ilgili bölümlerini uygulamanın üstbilgi dosyası.

/ / # Define IDM_PIE # define IDM_LINE # define IDM_BAR # define IDM_SOLID # define IDM_DASH # define IDM_DASHDOT # define 6 5 4 3 2 1 menü öğesi tanımlayıcıları IDM_DASHDOTDOT 7 / / Sayı öğelerin grafik ve çizgiler menülerde # define C_LINES 5 # define c_charts 3 / / Bitmap kaynak tanımlayıcıları # define IDB_PIE 1 # define IDB_LINE # define 2 IDB_BAR 3 / / boyutları hat bit eşlemleri # define CX_LINEBMP 40 # define CY_LINEBMP 10 

 

İlgili bölümlerini penceresinin yordam aşağıdadır. Pencere yordamı, bu konunun ilerisinde açıklanan uygulama tanımlı LoadChartBitmaps, CreateLineBitmaps ve AddBitmapMenu işlevleri çağırarak çoğu onun başlatma gerçekleştirir.

Lresult geri MainWindowProc (hwnd hwnd, UINT uMsg, wparam wParam, lparam lParam) {static HBITMAP aHbmLines [C_LINES]; 
    statik HBITMAP aHbmChart [c_charts]; 
    int i; 
 
    switch (uMsg) {wm_create durumda: / / çağrı uygulama tanımlı işlevleri yüklenemiyor / / bitmapler için Grafik menüsü ve oluşturmak / / çizgileri menüsü. 
 
            LoadChartBitmaps(aHbmChart); 
            CreateLineBitmaps(aHbmLines); 
 
             / / Oluşturmak için uygulama tanımlı bir işlev çağrısı / / bit eşlemi menü öğeleri içeren menüleri. İşlev / / de pencerenin menü çubuğuna menü adı ekler. 
 
            AddBitmapMenu (hwnd, / / menü bar'ın sahibi penceresi "amp;Grafik", / / metin menüsünün menüsünde adı IDM_PIE, bar / / kimlik ilk maddenin menü aHbmChart, / / bit eşlem bir dizi işleme c_charts / / menüsündeki öğeleri sayısı); 
            AddBitmapMenu (hwnd, "& satır", IDM_SOLID, aHbmLines, C_LINES); 
            Break; 
 
        Case wm_destroy: for (i = 0; i < C_LINES; i ++) DeleteObject(aHbmLines[i]); 
            for (i = 0; i < c_charts; i ++) DeleteObject(aHbmChart[i]); 
            PostQuitMessage(0); 
            Break; 
 
        / / İşlem ek mesajları burada. 
 
        Varsayılan: (DefWindowProc (hwnd, uMsg, wParam, lParam)) return; 
    } return 0; 
} 

 

Uygulama tanımlı LoadChartBitmaps işlevini çağırarak Grafik menüsü bit eşlem kaynaklarını yükler LoadBitmap işlevi, aşağıdaki gibi.

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

 

Uygulama tanımlı CreateLineBitmaps fonksiyonun GDI çizim işlevlerini kullanarak çizgileri menüsü için bit eşlemleri oluşturur. İşlev, masaüstü pencere dc aynı özelliklere sahip bir bellek aygıt içerik (dc) oluşturur. Her çizgi stili işlevi bir bit eşlem oluşturur, dc belleğe seçer ve o çizer.

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; 
 
     / / Menü arka plan rengini kullanarak fırça oluşturma / / dc belleğe seçin. 
 
    hbrOld = NesneSeç (hdcMem, CreateSolidBrush(clrMenu)); 
 
     / / Bit eşlemler oluşturabilir. Her bir bellek içine seçin / / dc, oluşturuldu ve o çizme. 
 
    for (i = 0; i lt; C_LINES; i ++) {/ / bit eşlem oluşturun ve etki alanı denetleyicisi seçin. 
 
        paHbm [i] = CreateCompatibleBitmap (hdcDesktop, CX_LINEBMP, CY_LINEBMP); 
        hbmOld = NesneSeç (hdcMem, paHbm[i]); 
 
        / / Fırça kullanarak arka doldurun. 
 
        PatBlt (hdcMem, 0, 0, CX_LINEBMP, CY_LINEBMP, patcopy); 
 
        / / Kalem oluşturun ve etki alanı denetleyicisi seçin. 
 
        hpenOld = NesneSeç (hdcMem, CreatePen (PS_SOLID + i, 1, rgb (0, 0, 0))); 
 
         / / Bir çizgi çizin. Arka plan rengi korumak için nerede / / kalem beyaz, R2_MASKPEN Çizim modunu kullanın. 
 
        fnDrawMode = SetROP2 (hdcMem, R2_MASKPEN); 
        MoveToEx (hdcMem, 0, CY_LINEBMP/2, null); 
        LineTo (hdcMem, CX_LINEBMP, CY_LINEBMP/2); 
        SetROP2 (hdcMem, fnDrawMode); 
 
        / / Kalem silmek ve eski kalem ve bitmap seçin. 
 
        NesneSil (NesneSeç (hdcMem, hpenOld)); 
        NesneSeç (hdcMem, hbmOld); 
    } / / Fırça silme ve özgün fırça seçin. 
 
    NesneSil (NesneSeç (hdcMem, hbrOld)); 
 
    / / dc hafıza silme ve masaüstü dc serbest. 
 
    DeleteDC(hdcMem); 
    ReleaseDC (hwndDesktop, hdcDesktop); 
} 

 

Uygulama tanımlı AddBitmapMenu fonksiyonun bir menü oluşturur ve belirtilen bit eşlem menü öğeleri ekler. Sonra ilgili menü adı belirtilen pencerenin menü çubuğuna ekler.

 VOID WINAPI AddBitmapMenu (hwnd hwnd, / / pencere, menü çubuğunu lpstr lpszText, sahibi / / metin menüsünün adı menü çubuğundan UINT UID, / / ilk bit eşlemi menü kodu madde HBITMAP * paHbm, / / bit eşlemler menü öğeleri int cItems) / / sayı bit eşlemi menü öğelerini {HMENU'nun hmenuBar = GetMenu(hwnd); 
    HMENU'nun hmenuPopup = CreatePopupMenu(); 
    MENUITEMINFO MII; 
    int i; 
 
    / / Bit eşlemi menü öğeleri menü eklemek. 
 
    for (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); 
    } / / Menü çubuğundaki bir menü adını ekleyin. 
 
    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