|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Adding Lines and Graphs to a Menu
The following code sample shows how to create a menu that contains menu-item bitmaps. It creates two menus. The first is a Chart menu that contains three menu-item bitmaps: a pie chart, a line chart, and a bar chart. The example demonstrates how to load these bitmaps from the application's resource file, and then use the CreatePopupMenu and AppendMenu functions to create the menu and menu items.
The second menu is a Lines menu. It contains bitmaps showing the line styles provided by the predefined pen in Windows. The line-style bitmaps are created at run time by using GDI functions. Here are the definitions of the bitmap resources in the application's resource-definition file.
PIE BITMAP pie.bmp LINE BITMAP line.bmp BAR BITMAP bar.bmp
Here are the relevant portions of the application's header file.
// Menu-item identifiers #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 // Line-type flags #define SOLID 0 #define DOT 1 #define DASH 2 #define DASHDOT 3 #define DASHDOTDOT 4 //Count of pens #define CPENS 5 // Chart-type flags #define PIE 1
#define LINE 2 #define BAR 3 // Function prototypes LRESULT APIENTRY MainWndProc(HWND, UINT, WPARAM, LPARAM); VOID MakeChartMenu(HWND); VOID MakeLineMenu(HWND, HPEN, HBITMAP);
The following example shows how menus and menu-item bitmaps are created in an application.
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: // Create the Chart and Line menus. MakeChartMenu(hwnd); MakeLineMenu(hwnd, hpen, hbmp); return 0; . . // Process other window messages.
. 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; // handle of owner window { HBITMAP hbmpPie; // handle of pie chart bitmap
HBITMAP hbmpLine; // handle of line chart bitmap HBITMAP hbmpBar; // handle of bar chart bitmap HMENU hmenuMain; // handle of main menu HMENU hmenuChart; // handle of Chart menu // Load the pie, line, and bar chart bitmaps from the // resource-definition file. hbmpPie = LoadBitmap(hinst, MAKEINTRESOURCE(PIE)); hbmpLine = LoadBitmap(hinst, MAKEINTRESOURCE(LINE)); hbmpBar = LoadBitmap(hinst, MAKEINTRESOURCE(BAR));
// Create the Chart menu and add it to the menu bar. // Append the Pie, Line, and Bar menu items to the Chart // menu. 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; // handle of Lines menu HMENU hmenu; // handle of main menu COLORREF crMenuClr; // menu-item background color HBRUSH hbrBackground; // handle of background brush HBRUSH hbrOld; // handle of previous brush LONG lCheckXY; // dimensions of check-mark bitmap
WORD wLineX; // width of line bitmaps WORD wLineY; // height of line bitmaps HDC hdcMain; // handle of main window's DC HDC hdcLines; // handle of compatible DC HBITMAP hbmpOld; // handle of previous bitmap int i; // loop counter // Create the Lines menu. Add it to the menu bar. hmenu = GetMenu(hwnd);
hmenuLines = CreatePopupMenu(); AppendMenu(hmenu, MF_STRING | MF_POPUP, (UINT) hmenuLines, "&Lines"); // Create a brush for the menu-item background color. crMenuClr = GetSysColor(COLOR_MENU); hbrBackground = CreateSolidBrush(crMenuClr); // Create a compatible device context for the line bitmaps, // and then select the background brush into it. hdcMain = GetDC(hwnd); hdcLines = CreateCompatibleDC(hdcMain);
hbrOld = SelectObject(hdcLines, hbrBackground); // Get the dimensions of the check-mark bitmap. The width of // the line bitmaps will be five times the width of the // check-mark bitmap. lCheckXY = GetMenuCheckMarkDimensions(); wLineX = LOWORD(lCheckXY) * (WORD) 5; wLineY = HIWORD(lCheckXY); // Create the bitmaps and select them, one at a time, into the // compatible device context. Initialize each bitmap by // filling it with the menu-item background color.
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); } // Create the pens. 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)); // Select a pen and a bitmap into the compatible device // context, draw a line into the bitmap, and then append // the bitmap as an item in the Lines menu. 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]); } // Release the main window's device context and destroy the // compatible device context. Also, destroy the background // brush. ReleaseDC(hwnd, hdcMain); SelectObject(hdcLines, hbrOld); DeleteObject(hbrBackground); SelectObject(hdcLines, hbmpOld); DeleteDC(hdcLines); return; }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Дополнение Строк и Графов в Меню
Кодовый образец следующего показывает как, чтобы создавать меню, которое содержит меню-пункт побитовых отображений. Это создает два меню. Сначала - меню Диаграммы, которое содержит три меню-пункта побитовых отображений: диаграмма пирога, диаграмма строки, и гистограмма. Пример демонстрирует как, чтобы загружать эти побитовые отображения из прикладного файла ресурса, затем использовать CreatePopupMenu и функции AppendMenu, чтобы создавать пункты меню и меню.
Второе меню является меню Строк. Это содержит побитовые отображения, показывающие, что линия стилей предусматривалась встроенной ручкой в Windows. Побитовые отображения-стиль созданы во времени выполнения используя функции GDI. Вот определения ресурсов побитового отображения в прикладном ресурсе-определении файла.
ПОБИТОВОЕ отображение pie.bmp СТРОКИ ПОБИТОВОГО отображения Побитового отображения line.bmp ЗОНЫ ПИРОГА 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 0 #define ТОЧКИ 1 #define БРОСАЮТСЯ 2 #define DASHDOT 3 #define DASHDOTDOT 4 //Счет ручек #define CPENS 5 // Диаграмма-тип флагов #define ПИРОГ 1
#define ЗОНА #define СТРОКА 2 3 // Прототипы Функции LRESULT APIENTRY MainWndProc(HWND, UINT, WPARAM, LPARAM); АННУЛИРУЙТЕ MakeChartMenu(HWND); АННУЛИРУЙТЕ MakeLineMenu(HWND, HPEN, HBITMAP);
Следующий пример показывает как меню и меню-пункт побитовых отображений созданы в приложении.
LRESULT APIENTRY MainWndProc(hwnd, uMsg, wParam, lParam) HWND hwnd; UINT uMsg; WPARAM wParam; LPARAM lParam; { статический HPEN hpen[CPENS]; статический HBITMAP hbmp[CPENS]; int i; ключ (uMsg) { случай WM_CREATE: // Создайте меню Диаграммы и Строки. MakeChartMenu(hwnd); MakeLineMenu(hwnd, hpen, hbmp); возврат 0; . . // Процесс другие сообщения окна.
. случай WM_DESTROY: для (i = 0; я < CPENS; я++) { DeleteObject(hbmp[i]); DeleteObject(hpen[i]); } PostQuitMessage(0); прерывание; умолчание: возвращайте DefWindowProc(hwnd, uMsg, wParam, lParam); } возвращайте НЕДЕЙСТВИТЕЛЬНЫЙ; } ПУСТОТА MakeChartMenu(hwnd) HWND hwnd; // ручка окна владельца { HBITMAP hbmpPie; // ручка побитового отображения диаграммы пирога
HBITMAP hbmpLine; // ручка побитового отображения диаграммы строки HBITMAP hbmpBar; // ручка побитового отображения гистограммы HMENU hmenuMain; // ручка основного меню HMENU hmenuChart; // ручка меню Диаграммы // Загрузка пирог, строка, и побитовые отображения гистограммы из // ресурса-определения файла. hbmpPie = LoadBitmap(hinst, MAKEINTRESOURCE(ПИРОГ)); hbmpLine = LoadBitmap(hinst, MAKEINTRESOURCE(СТРОКА)); hbmpBar = LoadBitmap(hinst, MAKEINTRESOURCE(ЗОНА));
// Создайте меню Диаграммы и добавляйте это к зоне меню. // Добавление Пирог, Строка, и пункты меню Зоны на Диаграмму // меню. hmenuMain = GetMenu(hwnd); hmenuChart = CreatePopupMenu(); AppendMenu(hmenuMain, MF_STRING | MF_POPUP, (UINT) hmenuChart, "ДИАГРАММА"); AppendMenu(hmenuChart, MF_BITMAP, IDM_PIE, (LPCTSTR) hbmpPie); AppendMenu(hmenuChart, MF_BITMAP, IDM_LINE, (LPCTSTR) hbmpLine); AppendMenu(hmenuChart, MF_BITMAP, IDM_BAR, (LPCTSTR) hbmpBar);
возврат; } АННУЛИРУЙТЕ MakeLineMenu(hwnd, phpen, phbmp) HWND hwnd; HPEN *phpen; HBITMAP *phbmp; { HMENU hmenuLines; // ручка меню Строк HMENU hmenu; // ручка основного меню COLORREF crMenuClr; // меню-пункт фона цвета HBRUSH hbrBackground; // ручка щетки фона HBRUSH hbrOld; // ручка предшествующей щетки ДОЛГО (ДЛИНОЙ) lCheckXY; // измерения чека-выделяют побитовое отображение
СЛОВО wLineX; // ширина побитовых отображений строки WORD wLineY; // высота побитовых отображений строки HDC hdcMain; // ручка основного окна DC HDC hdcLines; // ручка совместимого DC HBITMAP hbmpOld; // ручка предшествующего побитового отображения int i; // счетчик цикла // Создайте Линии меню. Добавьте это к зоне меню. hmenu = GetMenu(hwnd);
hmenuLines = CreatePopupMenu(); AppendMenu(hmenu, MF_STRING | MF_POPUP, (UINT) hmenuLines, "&СТРОКИ"); // Создайте щетку для меню-пункта фона цвета. crMenuClr = GetSysColor(COLOR_MENU); hbrBackground = CreateSolidBrush(crMenuClr); // Создайте совместимый контекст устройства для линии побитовых отображений, // затем выбираться щетку фона в это. hdcMain = GetDC(hwnd); hdcLines = CreateCompatibleDC(hdcMain);
hbrOld = SelectObject(hdcLines, hbrBackground); // Получите измерения контрольной отметки побитового отображения. Ширина // линия побитовых отображений будет пять раз (а) шириной // контрольной отметки побитового отображения. lCheckXY = GetMenuCheckMarkDimensions(); wLineX = LOWORD(lCheckXY) * (СЛОВО) 5; wLineY = HIWORD(lCheckXY); // Создайте побитовые отображения и выбирайтесь их, поочередно, в // совместимый контекст устройства. Инициализируйте каждое побитовое отображение // наполнителем это с меню-пунктом фона цвета.
для (i = 0; я < CPENS; я++) { phbmp[i] = CreateCompatibleBitmap(hdcMain, wLineX, wLineY); если (i == 0) hbmpOld = SelectObject(hdcLines, phbmp[i]); еще 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)); // Выберитесь ручку и побитовое отображение на совместимое устройство // контекст, делайте строкой в побитовое отображение, затем добавляйте // побитовое отображение как пункт на Линиях меню. для (i = 0; я < CPENS; я++) { SelectObject(hdcLines, phbmp[i]); SelectObject(hdcLines, phpen[i]); MoveToEx(hdcLines, 0, wLineY / 2, НЕДЕЙСТВИТЕЛЬНОЕ); LineTo(hdcLines, wLineX, wLineY / 2);
AppendMenu(hmenuLines, MF_BITMAP, Я + 1, (LPCTSTR) phbmp[i]); } // Выпустите контекст устройства основного окна и уничтожайте // совместимый контекст устройства. Также, уничтожьте фон // щетка. ReleaseDC(hwnd, hdcMain); SelectObject(hdcLines, hbrOld); DeleteObject(hbrBackground); SelectObject(hdcLines, hbmpOld); DeleteDC(hdcLines); возврат; }
|
|
|
|
| |