以下代码示例显示如何创建包含菜单项位图的菜单。它创建两个菜单。第一个是包含三个菜单项位图的图表菜单:饼图,折线图和条形图。该示例演示如何从应用程序的资源文件中加载这些位图,然后使用CreatePopupMenu和AppendMenu功能创建菜单和菜单项。
第二个菜单是“线”菜单。它包含显示Windows中预定义笔提供的线条样式的位图。线路式位图在运行时通过使用GDI函数创建。
以下是应用程序资源定义文件中位图资源的定义。
BAR BITMAP bar.bmp
Here are the relevant portions of the application's header file.
以下是应用程序头文件的相关部分。
以下是应用程序头文件的相关部分。
//菜单项标识符
#define IDM_DASH PS_DASH
#define IDM_PIE 1
#define IDM_DASHDOT PS_DASHDOT
#define IDM_DASHDOTDOT PS_DASHDOTDOT
#define IDM_LINE 2
#define IDM_BAR 3
// Line-type flags
//行类型标志
#define DOT 1
#define DASH 2
#define DASHDOT 3
#define DASHDOTDOT 4
//Count of pens
//笔数
//图表型标志
//图表型标志
#define LINE 2
#define BAR 3
// Function prototypes
//函数原型
LRESULT APIENTRY MainWndProc(HWND, UINT, WPARAM, LPARAM);
VOID MakeChartMenu(HWND);
VOID MakeLineMenu(HWND, HPEN, HBITMAP);
以下示例显示如何在应用程序中创建菜单和菜单项位图。
LRESULT APIENTRY MainWndProc(hwnd,uMsg,wParam,lParam)en
HWND hwnd;
UINT uMsg;
WPARAM wParam;
LPARAM lParam;
{
static HPEN hpen[CPENS];
static HBITMAP hbmp[CPENS];
int i;
开关(uMsg){
case WM_CREATE:
//创建图表和行菜单。
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;
默认:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return NULL;
}
VOID使图表菜单(HWND)
HWND hwnd; //所有者窗口的句柄
{
HBITMAP hbmpPie; //处理饼图位图
HBITMAP hbmpLine; //线程图位图的句柄
HBITMAP hbmpBar; //条形图位图的句柄
HMENU hmenuMain; //主菜单的句柄
HMENU hmenuChart; //图表菜单的句柄
//加载饼图,线条和条形图位图
//资源定义文件。
hbmpPie = LoadBitmap(hinst, MAKEINTRESOURCE(PIE));
hbmpLine = LoadBitmap(hinst, MAKEINTRESOURCE(LINE));
hbmpBar = LoadBitmap(hinst, MAKEINTRESOURCE(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化妆在线菜单(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; //循环计数器
//创建线菜单。将其添加到菜单栏。
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]);
其他
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));
//在兼容设备中选择笔和位图
//上下文,画一条线到位图,然后追加
//位图作为“线”菜单中的一个项目。
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;
}