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