Добавление меню Линии и Диаграммы
Нижеследующий пример кода показывает, как создать меню, которое содержит значки пунктов меню. Он создает два меню. Первое - меню 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; }
|