Страница 19 из 26 Добавление меню Линии и Диаграммы Нижеследующий пример кода показывает, как создать меню, которое содержит значки пунктов меню. Он создает два меню. Первое - меню Chart (Диаграммы), которое содержит три значка пунктов меню: круговая диаграмма, линейная диаграмма и гистограмма. Пример показывает, как загрузить эти значки из файла ресурса прикладной программы, а затем использовать функции CreatePopupMenu и AppendMenu, чтобы создать меню и пункты меню. Второе меню - меню Lines (Линии). Оно содержит значки, показывая типы линий, предоставляемые предопределенным пером в Windows. Значки типа линий созданы во время выполнения программы при помощи использования функций 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, uMsg, wParam, lParam) 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 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 и добавим его к строке меню. // Добавим в конец к меню Диаграммы пункты меню Круговая, // Линейная и Гистограмма.
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, phpen, phbmp) HWND hwnd; HPEN *phpen; HBITMAP *phbmp; { HMENU hmenuLines;// дескриптор меню Линии HMENU hmenu;// дескриптор главного меню COLORREF crMenuClr;// цвет фона пункта меню HBRUSH hbrBackground;// дескриптор кисти фона HBRUSH hbrOld;// дескриптор предыдущей кисти LONG lCheckXY;// размеры значка-метки типа «галочки» 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);
// Получим габариты значка "галочки ". Ширина // значка линии будет в пять раз шире значка "галочки".
lCheckXY = GetMenuCheckMarkDimensions(); wLineX = LOWORD(lCheckXY) * (WORD) 5; wLineY = HIWORD(lCheckXY);
// Создадим значки и выберите их, по одному, в совместимом контексте устройства. // Инициализируем каждый значок, заполняя его цветом фона пункта меню.
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; }
|