메뉴 항목이 비트맵의 예

이 항목의 예제는 여러 비트맵 메뉴 항목이 포함 된 각 두 개의 메뉴를 만듭니다. 각 메뉴에 대 한 응용 프로그램 주 창 메뉴 모음에 해당 메뉴 이름 추가.

첫 번째 메뉴에 각 세 가지 차트 종류를 표시 하는 메뉴 항목이: 원형, 선 및 바. 이러한 메뉴 항목에 대 한 비트맵 리소스로 정의 하 고 사용 하 여 로드를 LoadBitmap 함수. 메뉴 모음에서 "차트" 메뉴 이름은이 메뉴와 연관 된.

각 사용 5 선 스타일을 표시 하는 메뉴 항목을 포함 하는 두 번째 메뉴는 CreatePen 함수: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, 및 PS_DASHDOTDOT. 응용 프로그램 GDI 그리기 기능을 사용 하 여 런타임에 이러한 메뉴 항목에 대 한 비트맵을 만듭니다. 이 메뉴와 연관 된은 메뉴 모음에서 "선" 메뉴 이름.

응용 프로그램의 창 프로시저에 정의 된 비트맵 핸들의 두 정적 배열 됩니다. 하나의 배열 차트 메뉴에 사용 되는 세 개의 비트맵 핸들을 포함 합니다. 다른 라인 메뉴에 사용 되는 5 개의 비트맵 핸들을 포함 합니다. WM_CREATE 메시지를 처리할 때 창 프로시저 차트 비트맵을 로드 선 비트맵을 생성 하 고 해당 메뉴 항목을 추가 합니다. WM_DESTROY 메시지를 처리할 때 창 프로시저 모두 비트맵을 삭제.

다음은 응용 프로그램의 헤더 파일의 관련 부분.

/ / # Define IDM_PIE 1 # # define IDM_BAR 3 # define IDM_SOLID 4 # define IDM_DASH 5 # define IDM_DASHDOT 6 # define IDM_LINE 2를 정의 하는 메뉴 항목 식별자 IDM_DASHDOTDOT 7 / / 수 차트 및 라인 메뉴에 있는 항목의 # define C_LINES 5 # define C_CHARTS 3 / / 비트맵 리소스 식별자 # define IDB_PIE 1 # define IDB_LINE 2 # define IDB_BAR 3 / 크기 / 선 비트맵의 # define CX_LINEBMP 40 # define CY_LINEBMP 10 
 

다음은 창 프로시저의 관련 부분입니다. 응용 프로그램 정의 LoadChartBitmaps, CreateLineBitmaps, 및 AddBitmapMenu 함수 호출,이 항목의 뒷부분에 설명 하 여 대부분의 초기화를 수행 하는 창 프로시저.

LRESULT 콜백 MainWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {정적 HBITMAP aHbmLines [C_LINES]; 
    정적 HBITMAP aHbmChart [C_CHARTS]; 
    int 나; 
 
    스위치 (uMsg) {WM_CREATE 경우: / 호출 하는 응용 프로그램 정의 함수를 로드 하는 /는 / / 차트 메뉴에 대 한 비트맵을 만들고 그에 대 한 / / 라인 메뉴. 
 
            LoadChartBitmaps(aHbmChart); 
            CreateLineBitmaps(aHbmLines); 
 
             /를 만드는 응용 프로그램 정의 함수를 호출 하는 / / / 비트맵 메뉴 항목이 포함 된 메뉴. 기능 / / 또한 메뉴 이름을 윈도우의 메뉴 모음에 추가 합니다. 
 
            AddBitmapMenu (hwnd, / / 메뉴 표시줄의 소유자 창 "앰프;차트의 경우"/ / 텍스트 메뉴의 메뉴 이름 IDM_PIE, 바 / / ID 메뉴 Ahbmchart에서 첫 번째 항목의 / C_CHARTS를 처리 하는 비트맵의 배열 / / / 메뉴에 있는 항목의 수); 
            AddBitmapMenu (hwnd, "& 라인", IDM_SOLID, aHbmLines, C_LINES); 
            휴식 시간; 
 
        WM_DESTROY 사례:에 대 한 (I = 0; 난 < C_LINES; i + +) DeleteObject(aHbmLines[i]); 
            에 대 한 (I = 0; 난 < C_CHARTS; i + +) DeleteObject(aHbmChart[i]); 
            PostQuitMessage(0); 
            휴식 시간; 
 
        / / 여기 메시지 처리 추가. 
 
        기본값: (DefWindowProc (hwnd, uMsg, wParam, lParam)) 반환; 
    } 0; 반환 
} 
 

응용 프로그램 정의 LoadChartBitmaps 함수를 호출 하 여 차트 메뉴에 대 한 비트맵 리소스 로드는 같이 LoadBitmap 함수.

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

응용 프로그램 정의 CreateLineBitmaps 함수는 GDI 그리기 기능을 사용 하 여 라인 메뉴에 대 한 비트맵을 만듭니다. 함수는 메모리 장치 컨텍스트 (DC) 바탕 화면 창 DC와 같은 속성으로 만듭니다. 각 선 스타일에 대 한 함수를 비트맵, 메모리 DC로 선택 만들고 그것을 그립니다.

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 나; 
 
     / / 메뉴 배경색을 사용 하 여 브러시를 만듭니다 / / 메모리 DC로 선택 합니다. 
 
    hbrOld = SelectObject (hdcMem, CreateSolidBrush(clrMenu)); 
 
     / / 비트맵을 만듭니다. 메모리에 각자 선택 / / DC는 만들어진 하 고 그것에 그립니다. 
 
    에 대 한 (I = 0; 난 lt; C_LINES; i + +) {/ / 비트맵을 생성 하 고 DC로 선택 합니다. 
 
        paHbm [i] = CreateCompatibleBitmap (hdcDesktop, CX_LINEBMP, CY_LINEBMP); 
        hbmOld = SelectObject (hdcMem, paHbm[i]); 
 
        / / 배경 브러시를 사용 하 여 작성 합니다. 
 
        PatBlt (hdcMem, 0, 0, CX_LINEBMP, CY_LINEBMP, PATCOPY); 
 
        / / 펜을 생성 하 고 DC로 선택 합니다. 
 
        hpenOld = SelectObject (hdcMem, CreatePen (PS_SOLID + I, 1, RGB (0, 0, 0))); 
 
         / / 선을 그립니다. 배경 색상을 보존 하려면 어디 / / 펜은 흰색, R2_MASKPEN 드로잉 모드를 사용 합니다. 
 
        fnDrawMode = SetROP2 (hdcMem, R2_MASKPEN); 
        MoveToEx (hdcMem, 0, CY_LINEBMP/2, NULL); 
        LineTo (hdcMem, CX_LINEBMP, CY_LINEBMP/2); 
        SetROP2 (hdcMem, fnDrawMode); 
 
        / / 펜을 삭제 하 고 오래 된 펜 및 비트맵을 선택 합니다. 
 
        DeleteObject (SelectObject (hdcMem, hpenOld)); 
        SelectObject (hdcMem, hbmOld); 
    } / / 브러쉬를 삭제 하 고 원래 브러쉬를 선택 합니다. 
 
    DeleteObject (SelectObject (hdcMem, hbrOld)); 
 
    / / 메모리 DC를 삭제 하 고 바탕 화면 DC를 놓습니다. 
 
    DeleteDC(hdcMem); 
    ReleaseDC (hwndDesktop, hdcDesktop); 
} 
 

응용 프로그램 정의 AddBitmapMenu 함수 메뉴를 만들고 그것을 비트맵 메뉴 항목의 지정 된 번호를 추가 합니다. 다음 지정한 창 메뉴 모음에 해당 메뉴 이름 추가.

 VOID WINAPI AddBitmapMenu (HWND hwnd / 창은 LPSTR lpszText 메뉴바 소유 / / / UINT uID 바 메뉴에서 메뉴의 텍스트 이름 / HBITMAP 항목을 첫 번째 비트맵 메뉴의 ID / * paHbm, / / 메뉴에 대 한 비트맵 항목 int cItems) / 비트맵 메뉴 항목 번호 / {HMENU hmenuBar = GetMenu(hwnd); 
    HMENU hmenuPopup = CreatePopupMenu(); 
    MENUITEMINFO 미; 
    int 나; 
 
    / / 비트맵 메뉴 항목을 메뉴에 추가 합니다. 
 
    에 대 한 (I = 0; 난 lt; cItems; i + +) {mii.fMask = MIIM_ID (ko) | MIIM_TYPE | MIIM_DATA; 
        mii.fType = MFT_BITMAP; 
        mii.wID = uID + 나; 
        mii.dwTypeData = (LPSTR) (paHbm[i]); 
        InsertMenuItem (hmenuPopup, 난, TRUE, & mii); 
    } / / 메뉴 표시줄에 메뉴 이름을 추가 합니다. 
 
    mii.fMask = MIIM_TYPE (ko) | MIIM_DATA | MIIM_SUBMENU; 
    mii.fType = MFT_STRING; 
    mii.hSubMenu = hmenuPopup; 
    mii.dwTypeData = lpszText; 
    InsertMenuItem (hmenuBar, GetMenuItemCount(hmenuBar), TRUE, & mii); 
} 
 

 

Index