如何改变弹出菜单的背景色和文字大小(使它成为彩色的)????
小弟现正做一个程序,希望改变弹出菜单的背景色和文字大小,使其成为彩色的,不知如何实现,请教各位大虾!!!!!
[解决办法]
创建自画弹出式菜单界面
实例目标
本实例实现自画弹出式菜单, 可以用自画菜单做出很多漂亮的界面,让人耳目一新。界面如下:
实现技术
本实例主要用设置弹出式菜单中自画属性的函数ExpandMenuItemWidth 和DrawNewItem 。
实现步骤
第一步添加弹出式菜单和图像列表, 设置每项菜单的名称和ICON。第二步添加自画函数。主要代码如下:
//---------------------------------------
__fastcall TfrmPopupMenu::TfrmPopupMenu(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------
//
// 设置每个菜单项的宽度和高度。
//
void __fastcall TfrmPopupMenu::ExpandMenuItemWidth(TObject *Sender,
TCanvas *ACanvas, int &Width, int &Height)
{
Width += TEXT_SPACE;
}
//
// 画每个菜单项。
//
25
void __fastcall TfrmPopupMenu::DrawNewItem(TObject *Sender, TCanvas *ACanvas,
const TRect &ARect, bool Selected)
{
TMenuItem *MenuItem = ((TMenuItem*)Sender);//得到当前菜单项。
//得到复选框的大小。
CheckmarkSize = GetSystemMetrics(SM_CXMENUCHECK);
//整个菜单的高度。
MenuHeight = ARect.Height() * MenuItem-> Parent-> Count;
VerticalBarLength = MenuHeight / 4;
if(!VerticalBarDrawn)//判断是否要重画。
{
//设置左边显示的字体。
OldFont = (TFont*)SelectObject(ACanvas-> Handle,
CreateFontIndirect(&VerticalFont));
//设置字体显示颜色。
OldForegroundColor = SetTextColor(ACanvas-> Handle, clRed);
//设置字体背景显示的颜色。
OldBackgroundColor = SetBkColor(ACanvas-> Handle, TColor(RGB(50,150,220)));
//设置显示窗口大小。
VerticalDrawingRect = Rect(0, 0, CheckmarkSize+TEXT_SPACE, MenuHeight);
//设置左边显示字符串为空字符串。
VerticalText = VerticalText.StringOfChar( ' ',VerticalBarLength);
//设置左边显示字符串。
VerticalText.Insert( " 我的自画菜单 ",1);
//显示左边字符串,并且进行剪栽字符串。
ExtTextOut(ACanvas-> Handle, 2, MenuHeight, ETO_CLIPPED,
&VerticalDrawingRect, VerticalText.c_str(), VerticalBarLength, NULL);
//恢复原来的字体。
SelectObject(ACanvas-> Handle,OldFont);
//恢复字体背景的颜色。
SetBkColor(ACanvas-> Handle, OldBackgroundColor);
//设置已经画了左边字符串。
VerticalBarDrawn = true;
}
//
TempRect = ARect;
if(Selected)//选中的菜单。
{
//设置菜单项字符串显示区域。
TempRect.Left += LOWORD(CheckmarkSize)+ICON_SPACE;
//设置菜单项画笔类型。
26
ACanvas-> Pen-> Style = psSolid;
//设置画笔颜色。
ACanvas-> Pen-> Color = clWhite;
//设置背景填充颜色。
ACanvas-> Brush-> Color = clLtGray;
//画矩形。
ACanvas-> Rectangle(
TempRect.Left-MENU_TEXT_LEFT +1,
MenuItem-> MenuIndex*MENU_ITEM_OFFSET-SPACE_BETWEEN_MENUS
+1 ,
ARect.Width() -2,
MenuItem-> MenuIndex*MENU_ITEM_OFFSET+MENU_TEXT_HEIGHT -2);
//设置画笔颜色。
ACanvas-> Pen-> Color = clGray;
//画矩形。
ACanvas-> Rectangle(
TempRect.Left-MENU_TEXT_LEFT + 2,
MenuItem-> MenuIndex*MENU_ITEM_OFFSET-SPACE_BETWEEN_MENUS
+2 ,
ARect.Width() -1,
MenuItem-> MenuIndex*MENU_ITEM_OFFSET+MENU_TEXT_HEIGHT -1);
//设置菜单字体的颜色。
SetTextColor(ACanvas-> Handle, clBlue );
//在矩形内显示菜单字符串。
TempRect.left += 2;
TempRect.top += 2;
DrawText(ACanvas-> Handle,MenuItem-> Caption.c_str(),MenuItem-> Caption.Length()
,
&TempRect, 0);
//下面开始画ICON。
ACanvas-> Pen-> Style = psSolid;
ACanvas-> Pen-> Color = clWhite;
ACanvas-> Rectangle(
24,
MenuItem-> MenuIndex * MENU_ITEM_OFFSET,
25+MENU_ITEM_OFFSET+1,
MenuItem-> MenuIndex * MENU_ITEM_OFFSET+MENU_TEXT_HEIGHT);
ACanvas-> Pen-> Color = clGray;
ACanvas-> Rectangle(
25,
27
MenuItem-> MenuIndex * MENU_ITEM_OFFSET+1,
25+MENU_ITEM_OFFSET+1,
MenuItem-> MenuIndex * MENU_ITEM_OFFSET+MENU_TEXT_HEIGHT+1);
//从IMAGELIST 得到ICON。
ImageListMenu-> GetIcon(MenuItem-> ImageIndex,Icon);
//显示ICON。
ACanvas-> Draw(26+2,MenuItem-> MenuIndex * MENU_ITEM_OFFSET+2,Icon);
}
else//没有选中。
{
//设置菜单项字符串显示区域。
TempRect.Left += LOWORD(CheckmarkSize)+ICON_SPACE;
//设置菜单项画笔类型。
ACanvas-> Pen-> Style = psClear;
//画矩形。
ACanvas-> Rectangle(
TempRect.Left-MENU_TEXT_LEFT-2,
MenuItem-> MenuIndex*MENU_ITEM_OFFSET-SPACE_BETWEEN_MENUS
-2,
ARect.Width()+2,
MenuItem-> MenuIndex*MENU_ITEM_OFFSET+MENU_TEXT_HEIGHT+2);
//设置菜单显示颜色。
SetTextColor(ACanvas-> Handle, clBlack);
//在矩形内显示菜单字符串。
DrawText(ACanvas-> Handle,MenuItem-> Caption.c_str(),MenuItem-> Caption.Length(),
&TempRect, 0);
///////////////////////////////////////////////////////////////////////
ACanvas-> Pen-> Style = psClear;
ACanvas-> Rectangle(
24,
MenuItem-> MenuIndex * MENU_ITEM_OFFSET-2,
25+MENU_ITEM_OFFSET+2,
MenuItem-> MenuIndex * MENU_ITEM_OFFSET+MENU_TEXT_HEIGHT+2);
//从IMAGELIST 得到ICON。
ImageListMenu-> GetIcon(MenuItem-> ImageIndex,Icon);
//显示ICON。
ACanvas-> Draw(26,MenuItem-> MenuIndex * MENU_ITEM_OFFSET,Icon);
}
//刷新
ACanvas-> Refresh();
}
28
//
// 创建竖排菜单的字体。
//
void __fastcall TfrmPopupMenu::CreateVerticalFont(void)
{
ZeroMemory(&VerticalFont,sizeof(VerticalFont));
VerticalFont.lfHeight = -15;
VerticalFont.lfEscapement = 900;
VerticalFont.lfOrientation = 900;
VerticalFont.lfWeight = FW_BLACK;
StrPCopy(VerticalFont.lfFaceName, "宋体 ");
}
//
// 创建窗口时, 设置自画菜单。
//
void __fastcall TfrmPopupMenu::FormCreate(TObject *Sender)
{
if(PopupMenuOwerDraw-> Items-> Count > 0)
{
for(int i=0; i <= PopupMenuOwerDraw-> Items-> Count-1; i++)
{
//设置得到每项菜单大小函数。
PopupMenuOwerDraw-> Items-> Items[i]-> OnMeasureItem
= ExpandMenuItemWidth;
//设置每项菜单自画。
PopupMenuOwerDraw-> Items-> Items[i]-> OnDrawItem
= DrawNewItem;
}
}
//创建竖排的菜单字体。
CreateVerticalFont();
Icon = new TIcon;
}
//---------------------------------------
void __fastcall TfrmPopupMenu::FormClose(TObject *Sender,
TCloseAction &Action)
{
delete Icon;
}
//---------------------------------------
// 当弹出菜单时, 设置没有画最左边的菜单。
//
29
void __fastcall TfrmPopupMenu::PopupMenuOwerDrawPopup(TObject *Sender)
{
VerticalBarDrawn = false;
}
//---------------------------------------
[解决办法]
www.ccrun.com有代码,直接下去