将线条和图形添加到菜单

【勇芳软件工作室】汉化HomePreviousNext

以下代码示例显示如何创建包含菜单项位图的菜单。它创建两个菜单。第一个是包含三个菜单项位图的图表菜单:饼图,折线图和条形图。该示例演示如何从应用程序的资源文件中加载这些位图,然后使用CreatePopupMenuAppendMenu功能创建菜单和菜单项。

第二个菜单是“线”菜单。它包含显示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;

}