Exemplo de item de Menu Bitmaps

O exemplo neste tópico cria dois menus, cada uma contendo vários itens de menu bitmap. Para cada menu, o aplicativo adiciona um nome de menu correspondente à barra de menus da janela principal.

O primeiro menu contém itens de menu mostrando cada um dos três tipos de gráficos: pizza, linha e bar. Os bitmaps para esses itens de menu são definidos como recursos e são carregados usando o LoadBitmap função. Associado com este menu é um nome de menu "Gráfico" na barra de menus.

O segundo menu contém itens de menu mostrando cada um dos estilos de cinco linha usados com o CreatePen função: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT e PS_DASHDOTDOT. O aplicativo cria os bitmaps para esses itens de menu em tempo de execução usando GDI desenho funções. Associado com este menu é um nome de menu "Linhas" na barra de menus.

Definido no procedimento de janela do aplicativo são duas matrizes estáticos de identificadores de bitmap. Um array contém as alças das três bitmaps usados para menu gráfico. O outro contém as alças dos cinco bitmaps usados para o menu de linhas. Ao processar a mensagem WM_CREATE , o procedimento janela carrega bitmaps gráfico, cria os bitmaps de linha e, em seguida, adiciona os itens de menu correspondentes. Ao processar a mensagem WM_DESTROY , o procedimento janela exclui todos os bitmaps.

A seguir estão as partes relevantes do arquivo de cabeçalho do aplicativo.

/ / Identificadores de item de menu # 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 / / número de itens nos menus do gráfico e linhas # define C_LINES 5 # define C_CHARTS 3 / / Bitmap identificadores de recurso # define IDB_PIE 1 # define IDB_LINE 2 # define IDB_BAR 3 / / dimensões bitmaps a linha # define CX_LINEBMP 40 # define CY_LINEBMP 10 

 

A seguir estão as partes relevantes do procedimento de janela. O procedimento de janela realiza a maior parte de sua inicialização chamando os aplicativo LoadChartBitmaps, CreateLineBitmaps e AddBitmapMenu funções definidas, descritas neste tópico.

MainWindowProc de chamada de retorno de LRESULT (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {estático HBITMAP, aHbmLines [C_LINES]; 
    estático HBITMAP aHbmChart [C_CHARTS]; 
    int i; 
 
    comutador (uMsg) {case WM_CREATE: / / chamar funções definidas pelo aplicativo para carregar o / / bitmaps para o menu gráfico e criar aqueles para / / menu de linhas. 
 
            LoadChartBitmaps(aHbmChart); 
            CreateLineBitmaps(aHbmLines); 
 
             / / Chamada uma função application-defined para criar / / menus que contém os itens de menu do bitmap. Função / / também adiciona um nome de menu a barra de menus da janela. 
 
            AddBitmapMenu (hwnd, / / amp"janela de proprietário da barra de menus;Gráfico", / / nome do texto do menu no menu bar IDM_PIE, / / ID do primeiro item no menu aHbmChart, / / matriz de bitmap manipula C_CHARTS / / número de itens no menu); 
            AddBitmapMenu (hwnd, "& linhas", IDM_SOLID, aHbmLines, C_LINES); 
            quebra; 
 
        caso WM_DESTROY: para (i = 0; i < C_LINES; i + +) DeleteObject(aHbmLines[i]); 
            para (i = 0; i < C_CHARTS; i + +) DeleteObject(aHbmChart[i]); 
            PostQuitMessage(0); 
            quebra; 
 
        / / Processo adicional mensagens aqui. 
 
        padrão: retornar (DefWindowProc (hwnd, uMsg, wParam, lParam)); 
    } return 0; 
} 

 

A função de LoadChartBitmaps application-defined carrega os recursos de bitmap para menu gráfico chamando o LoadBitmap função, da seguinte forma.

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

 

A função de CreateLineBitmaps application-defined cria os bitmaps para o menu de linhas usando GDI desenho funções. A função cria um contexto de dispositivo de memória (DC) com as mesmas propriedades que DC a área de trabalho janela. Para cada estilo de linha, a função cria um bitmap, seleciona-lo para a memória DC e desenha em TI.

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; 
 
     / / Criar um pincel com a cor de fundo do menu, / / e selecione-o na memória DC. 
 
    hbrOld = SelectObject (SelecionarObjeto) (hdcMem, CreateSolidBrush(clrMenu)); 
 
     / / Criar bitmaps. Selecione cada um para a memória / / DC que foi criado e desenhar nele. 
 
    para (i = 0; i lt; C_LINES; i + +) {/ / criar o bitmap e selecione-o para o DC. 
 
        paHbm [i] = CreateCompatibleBitmap (hdcDesktop, CX_LINEBMP, CY_LINEBMP); 
        hbmOld = SelectObject (SelecionarObjeto) (hdcMem, paHbm[i]); 
 
        / / Preencher o plano de fundo usando o pincel. 
 
        PatBlt (hdcMem, 0, 0, CX_LINEBMP, CY_LINEBMP, PATCOPY); 
 
        / / Criar o pen e selecioná-lo para o DC. 
 
        hpenOld = SelectObject (SelecionarObjeto) (hdcMem, CreatePen (PS_SOLID + i, 1, RGB (0, 0, 0))); 
 
         / / Desenhar a linha. Para preservar a cor de fundo onde / / caneta é branca, use o modo de desenho 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); 
 
        / / Excluir a caneta e selecione o bitmap e caneta velha. 
 
        DeleteObject (SelectObject (hdcMem, hpenOld)); 
        SelectObject (SelecionarObjeto) (hdcMem, hbmOld); 
    } / / Excluir pincel e selecione o pincel original. 
 
    DeleteObject (SelectObject (hdcMem, hbrOld)); 
 
    / / Excluir a memória DC e liberar o DC de área de trabalho. 
 
    DeleteDC(hdcMem); 
    ReleaseDC (hwndDesktop, hdcDesktop); 
} 

 

A application-defined AddBitmapMenu função cria um menu e adiciona o número especificado de itens de menu bitmap a ele. Em seguida, ele adiciona um nome de menu correspondente à barra de menus da janela especificada.

 VOID WINAPI AddBitmapMenu (HWND hwnd, / / janela que propriedade do menu bar lpszText LPSTR, / / nome do texto do menu no menu bar UINT uID, / / ID do menu bitmap primeiro item HBITMAP * paHbm, / / bitmaps para o menu de itens cItems int) / / número de itens de menu bitmap {HMENU hmenuBar = GetMenu(hwnd); 
    HMENU hmenuPopup = CreatePopupMenu(); 
    MENUITEMINFO mii; 
    int i; 
 
    / / Adicionar os itens de menu bitmap no menu. 
 
    para (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); 
    } / / Adicionar um nome de menu à barra de menus. 
 
    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