Добавление меню Линии и Диаграммы

Нижеследующий пример кода показывает, как создать меню, которое содержит значки пунктов меню. Он создает два меню. Первое - меню Chart (Диаграммы), которое содержит три значка пунктов меню: круговая диаграмма, линейная диаграмма и гистограмма (ленточная диаграмма). Пример показывает, как загрузить эти значки из файла ресурса прикладной программы, а затем использовать функции CreatePopupMenu и AppendMenu, чтобы создать меню и пункты меню.

Второе меню - это меню Lines (Линии). Оно содержит значки, которые показывают типы линий, предоставляемые предопределенным пером в системе. Значки типа линий создаются во время выполнения программы при помощи использования функций GDI.

Здесь определения растровых ресурсов в файле определения ресурса прикладной программы.

PIE BITMAP pie.bmp
LINE BITMAP line.bmp
BAR BITMAP bar.bmp
Здесь находятся необходимые части заголовочного файла прикладной программы.
// Идентификаторы пунктов меню
 
#define IDM_SOLID       PS_SOLID 
#define IDM_DASH        PS_DASH 
#define IDM_DASHDOT     PS_DASHDOT 
#define IDM_DASHDOTDOT  PS_DASHDOTDOT 
 
#define IDM_PIE  1 
#define IDM_LINE 2 
#define IDM_BAR  3 
 
// Флажок типа линии  
 
#define SOLID       0 
#define DOT         1 
#define DASH        2 
#define DASHDOT     3 
#define DASHDOTDOT  4 
 
// Количество перьев  
 
#define CPENS 5 
 
// Флажок типа диаграммы  
 
#define PIE  1 
#define LINE 2 
#define BAR  3 
 
// Прототипы функций  
 
LRESULT APIENTRY MainWndProc(HWND, UINT, WPARAM, LPARAM); 
VOID MakeChartMenu(HWND); 
VOID MakeLineMenu(HWND, HPEN, HBITMAP); 

 

Следующий пример показывает, как в приложении создаются меню и значки пунктов меню.

LRESULT APIENTRY MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam,
                             LPARAM lParam) 
{ 
 
    static HPEN hpen[CPENS]; 
    static HBITMAP hbmp[CPENS]; 
    int i; 
 
    switch (uMsg) 
    { 
        case WM_CREATE: 
 
            // Создадим меню Chart (Диаграмма) и Line (Линия).  
 
            MakeChartMenu(hwnd); 
            MakeLineMenu(hwnd, hpen, hbmp); 
            return 0; 
 
        // Обработаем другие сообщения окна. 
 
        case WM_DESTROY: 
 
            for (i = 0; i < CPENS; i++) 
            { 
                DeleteObject(hbmp[i]); 
                DeleteObject(hpen[i]); 
            } 
 
            PostQuitMessage(0); 
            break; 
 
        default: 
            return DefWindowProc(hwnd, uMsg, wParam, lParam); 
    } 
    return NULL; 
} 
 
VOID MakeChartMenu(HWND hwnd) 
{ 
    HBITMAP hbmpPie;    // дескриптор значка круговой диаграммы
    HBITMAP hbmpLine;   // дескриптор значка линейной диаграммы
    HBITMAP hbmpBar;    // дескриптор значка гистограммы
    HMENU hmenuMain;    // дескриптор главного меню
    HMENU hmenuChart;   // дескриптор меню Chart (Диаграмма)
 
    // Загрузим значки круговой. линейной и полосовой диаграмм из
    // файла определения ресурса. 
 
    hbmpPie = LoadBitmap(hinst, MAKEINTRESOURCE(PIE)); 
    hbmpLine = LoadBitmap(hinst, MAKEINTRESOURCE(LINE)); 
    hbmpBar = LoadBitmap(hinst, MAKEINTRESOURCE(BAR)); 
 
    // Создадим меню Chart и добавим его в строку меню. 
    // Добавим в меню  Chart пункты Pie, Line и Bar.
 
 
    hmenuMain = GetMenu(hwnd); 
    hmenuChart = CreatePopupMenu(); 
    AppendMenu(hmenuMain, MF_STRING | MF_POPUP, (UINT) hmenuChart, 
        "Chart"); 
    AppendMenu(hmenuChart, MF_BITMAP, IDM_PIE, (LPCTSTR) hbmpPie); 
    AppendMenu(hmenuChart, MF_BITMAP, IDM_LINE, 
        (LPCTSTR) hbmpLine); 
    AppendMenu(hmenuChart, MF_BITMAP, IDM_BAR, (LPCTSTR) hbmpBar); 
 
    return; 
} 
 
VOID MakeLineMenu(HWND hwnd, HPEN phpen, HBITMAP phbmp) 
{ 
    HMENU hmenuLines;       // дескриптор меню Lines
    HMENU hmenu;            // дескриптор основного меню
    COLORREF crMenuClr;     // цвет фона пунктов меню
    HBRUSH hbrBackground;   // дескриптор кисти фона
    HBRUSH hbrOld;          // дескриптор предыдущей кисти
    WORD wLineX;            // ширина значка линии
    WORD wLineY;            // высота значка линии
    HDC hdcMain;            // дескриптор DC основного окна
    HDC hdcLines;           // дескриптор совместимого DC
    HBITMAP hbmpOld;        // дескриптор предыдущего значка
    int i;                  // счетчик цикла
 
    // Создадим меню Lines. Добавим его к стоке меню.  
 
    hmenu = GetMenu(hwnd); 
    hmenuLines = CreatePopupMenu(); 
    AppendMenu(hmenu, MF_STRING | MF_POPUP, 
        (UINT) hmenuLines, "&Lines"); 
 
    // Создадим кисть с цветом фона для пункта меню
 
    crMenuClr = GetSysColor(COLOR_MENU); 
    hbrBackground = CreateSolidBrush(crMenuClr); 
 
    // Создадим совместимый контекст устройства для значков линий, 
    // а затем выберем в нем кисть фона. 
 
    hdcMain = GetDC(hwnd); 
    hdcLines = CreateCompatibleDC(hdcMain); 
    hbrOld = SelectObject(hdcLines, hbrBackground); 
 
    // Получим размеры значка "галочки". Ширина значка линии
    // будет в пять шире значка "галочки".
 
 
    wLineX = GetSystemMetrics(SM_CXMENUCHECK) * (WORD) 5; 
    wLineY = GetSystemMetrics(SM_CYMENUCHECK); 
 
    // Создадим значки и выберем их одновременно в 
    // совместимом контексте устройства. Инициализируем каждый значок,
    // заполняя его цветом фона пункта меню. 
 
    for (i = 0; i < CPENS; i++) 
    { 
        phbmp[i] = CreateCompatibleBitmap(hdcMain, wLineX, wLineY); 
        if (i == 0) 
            hbmpOld = SelectObject(hdcLines, phbmp[i]); 
        else 
            SelectObject(hdcLines, phbmp[i]); 
        ExtFloodFill(hdcLines, 0, 0, crMenuClr, FLOODFILLBORDER); 
    } 
 
    // Создадим перья.  
 
    phpen[0] = CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); 
    phpen[1] = CreatePen(PS_DOT, 1, RGB(0, 0, 0)); 
    phpen[2] = CreatePen(PS_DASH, 1, RGB(0, 0, 0)); 
    phpen[3] = CreatePen(PS_DASHDOT, 1, RGB(0, 0, 0)); 
    phpen[4] = CreatePen(PS_DASHDOTDOT, 1, RGB(0, 0, 0)); 
 
    // Выберем перо и значок в совместимом контексте
    // устройства, нарисуем линию в значке, а затем добавим в конец
    // этот значок как пункт меню Lines. 
 
    for (i = 0; i < CPENS; i++) 
    { 
        SelectObject(hdcLines, phbmp[i]); 
        SelectObject(hdcLines, phpen[i]); 
        MoveToEx(hdcLines, 0, wLineY / 2, NULL); 
        LineTo(hdcLines, wLineX, wLineY / 2); 
        AppendMenu(hmenuLines, MF_BITMAP, i + 1, 
            (LPCTSTR) phbmp[i]); 
    } 
 
    // Освободим контекст устройства основного окна и разрушим
    // совместимый контекст устройства. Уничтожим также и 
    // кисть фона. 
 
    ReleaseDC(hwnd, hdcMain); 
    SelectObject(hdcLines, hbrOld); 
    DeleteObject(hbrBackground); 
    SelectObject(hdcLines, hbmpOld); 
    DeleteDC(hdcLines); 
 
    return; 
} 

 

 

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz