首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

怎么改变MainMenu背景颜色、字体

2012-04-17 
如何改变MainMenu背景颜色、字体?请问:如何改变MainMenu的背景和字体?如果用ToolBar的话,上面的那层怎么去

如何改变MainMenu背景颜色、字体?
请问:如何改变MainMenu的背景和字体?如果用ToolBar的话,上面的那层怎么去掉?不用ToolBar行不行?


[解决办法]
自画
主要设置自画菜单回调函数。当每项菜单显示时就会调用回调函数进行自画, 达到每项
菜单一样的风格。当选中后作不同的自画, 就显示了不同的效果。
实现步骤
第一步添加主菜单和ICON 图像列表。第二步添加所有事件响应函数。第三步添加回调
函数。主要代码如下:
//---------------------------------------
__fastcall TfrmMainMenu::TfrmMainMenu(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------
// 创建窗口时设置菜单项的参数。
//
void __fastcall TfrmMainMenu::FormCreate(TObject *Sender)
{
Custom = TColor(RGB(185,239,245));
MainMenuHighlightColor = Custom;
MainMenuTextColor = clBlack;
MainMenuTextBackground = clSilver;
MainMenuHighlightTextColor = clBlack;
VerticalColor = clSilver;
MenuColor = clWhite;
HighlightColor = Custom;
BorderColor = clBlack;//菜单边框颜色。
NormalTextColor = clBlack;//
NormalTextBackground = clWhite;
HighlightTextColor = clBlack;
DisabledTextColor = clSilver;
VerticalWidth = 26;
FocusRectRightIndent = 3;
FocusRectLeftIndent = 3;
LeftTextPos = 35;
SideBuffer = 1;
if(Menu-> Images == NULL)
MenuIncreaseWidth = 100;
else
MenuIncreaseWidth = 50;
Offset = 5;
}
//---------------------------------------
// 第二步添加。
// 主菜单第一项自画。
//
void __fastcall TfrmMainMenu::MenuOwerDrawDrawItem(TObject *Sender,
TCanvas *ACanvas, TRect &ARect, bool Selected)
{
TRect FocusRectBorder;
TRect FocusRectFill;
//得到菜单项。
TMenuItem *MenuItem = ((TMenuItem*)Sender);
//保存菜单字符串。
AnsiString Text = MenuItem-> Caption;
// 填充菜单项背景颜色。
ACanvas-> Brush-> Color = Color;
ACanvas-> FillRect(ARect);
//没有菜单内容就返回。
if(Text == " ")
return;
if(Selected)//选中菜单。
{
// 画菜单外面边框。
FocusRectBorder = ARect;
ACanvas-> Brush-> Color = BorderColor;
ACanvas-> FrameRect(FocusRectBorder);
//填充菜单内部
FocusRectFill = ARect;
//设置内部边框比外面要小点。
FocusRectFill.Top += SideBuffer;
FocusRectFill.Left += SideBuffer;
FocusRectFill.Right -= SideBuffer;
FocusRectFill.Bottom -= SideBuffer;
//设置为高度显示的颜色。
ACanvas-> Brush-> Color = MainMenuHighlightColor;
ACanvas-> FillRect(FocusRectFill);
// 设置当菜单选中后字体的颜色。
ACanvas-> Font-> Color = MainMenuHighlightTextColor;
ACanvas-> Font-> Style = TFontStyles() < < fsBold;
}
else//没有选中。
{
// 设置当菜单字体的颜色。
ACanvas-> Font-> Color = MainMenuTextColor;
ACanvas-> Font-> Style = TFontStyles();
}
int TextLength = Text.Length();
TRect TextRect = ARect;
//设置从什么地方开始画菜单项字符串。
TextRect.Left += 5;
TextRect.Top += 1;
// 显示菜单项字符串。
DrawText(ACanvas-> Handle,Text.c_str(), TextLength, &TextRect, 0);
}
//---------------------------------------
//画每项菜单。
//
void __fastcall TfrmMainMenu::MenuItemDrawItem(TObject *Sender,
TCanvas *ACanvas,const TRect &ARect, bool Selected)
{
int TopPos, TextLength;
AnsiString Text;
TRect TempRect;
TRect VerticalRect;
TRect FocusRectBorder;
TRect FocusRectFill;
TRect TextRect;
//得到当前菜单项。
TMenuItem *MenuItem = ((TMenuItem*)Sender);
//得到菜单项的字符串。
Text = MenuItem-> Caption;
//刷新菜单项背景。
ACanvas-> Brush-> Color = MenuColor;
ACanvas-> FillRect(ARect);
// 画菜单项的分隔条。
if(Text==BLANK_LINE)
{
// 画分隔条最左边垂直的Bar
VerticalRect = ARect;
VerticalRect.Top -= SideBuffer;


VerticalRect.Right = VerticalWidth;
VerticalRect.Bottom += SideBuffer;
ACanvas-> Brush-> Color = VerticalColor;
ACanvas-> FillRect(VerticalRect);
// 画一条分隔直线。
TColor oldColor = ACanvas-> Pen-> Color;
ACanvas-> Pen-> Color = clBlue;
ACanvas-> MoveTo(VerticalWidth,ARect.Top+ARect.Height()/2);
ACanvas-> LineTo(ARect.Right,ARect.Top+ARect.Height()/2);
ACanvas-> Pen-> Color = oldColor;
return;
}
// 其它菜单项的自画
TextLength = Text.Length();
if(Selected)//选中菜单。
{
//画最左边的垂直的BAR。
VerticalRect = ARect;
VerticalRect.Top -= SideBuffer;
VerticalRect.Right = VerticalWidth;
VerticalRect.Bottom += SideBuffer;
ACanvas-> Brush-> Color = VerticalColor;
ACanvas-> FillRect(VerticalRect);
if(MenuItem-> Enabled)//如果菜单有效。
{
//画一个焦点四边框。
FocusRectBorder = ARect;
FocusRectBorder.Left += FocusRectLeftIndent - SideBuffer;
FocusRectBorder.Right -= FocusRectRightIndent - SideBuffer;
ACanvas-> Brush-> Color = BorderColor;
ACanvas-> FrameRect(FocusRectBorder);
//填充内部颜色。
FocusRectFill = ARect;
FocusRectFill.Right -= FocusRectRightIndent;
FocusRectFill.Left += FocusRectLeftIndent;
FocusRectFill.Bottom -= SideBuffer;
FocusRectFill.Top += SideBuffer;
ACanvas-> Brush-> Color = HighlightColor;
ACanvas-> FillRect(FocusRectFill);
// 设置显示字符串的颜色和字体类型。
ACanvas-> Font-> Color = HighlightTextColor;
ACanvas-> Font-> Style = TFontStyles() < < fsBold;
}
else //菜单没有效。
{
// 显示为没有效。
ACanvas-> Font-> Style = TFontStyles();
ACanvas-> Brush-> Color = NormalTextBackground;
ACanvas-> Font-> Color = DisabledTextColor;
}//end of if(MenuItem-> Enabled)//如果菜单有效。
}
else//没有选中的菜单自画。
{
// 填充左边垂直边框。
VerticalRect = ARect;
VerticalRect.Top -= SideBuffer;
VerticalRect.Right = VerticalWidth;
VerticalRect.Bottom += SideBuffer;
ACanvas-> Brush-> Color = VerticalColor;
ACanvas-> FillRect(VerticalRect);
// 设置有效和没有效的菜单。
if(MenuItem-> Enabled)
{
ACanvas-> Brush-> Color = NormalTextBackground;
ACanvas-> Font-> Color = NormalTextColor;
}
else
{
ACanvas-> Brush-> Color = NormalTextBackground;
ACanvas-> Font-> Color = DisabledTextColor;
}
}
// 计算输出字符串的位置。
TextRect = ARect;
TextRect.Left += LeftTextPos;
if(Offset > 0)
TextRect.Top += Offset/2 + SideBuffer;
else
TextRect.Top += 2 + SideBuffer;
TextRect.Top += SideBuffer;
// 画菜单的ICON。
if(Menu-> Images != NULL)
{
Icon = new TIcon();
Menu-> Images-> GetIcon(MenuItem-> ImageIndex,Icon);
ACanvas-> Draw(5,ARect.Top+ItemOffset+1,Icon);
delete Icon;
}
// 显示菜单字符串。
DrawText(ACanvas-> Handle,Text.c_str(), TextLength, &TextRect, 0);
}
//---------------------------------------
//设置每一项菜单的高度和宽度。
//
void __fastcall TfrmMainMenu::MenuItemMeasureItem(TObject *Sender,
TCanvas *ACanvas, int &Width, int &Height)
{
Width += MenuIncreaseWidth;
Height += Offset;
MenuItemHeight = Height;
ItemOffset = Offset/2;
}
//---------------------------------------
//当按下第一项菜单时, 设置字菜单每行自画回调函数。
//
void __fastcall TfrmMainMenu::MenuOwerDrawClick(TObject *Sender)
{
TMenuItem *MenuItem = ((TMenuItem*)Sender);//得到菜单项。
//设置每一项菜单。
if(MenuItem-> Count > 0)
{
for(int i=0; i <= MenuItem-> Count-1; i++)
{
//设置每项菜单高度和宽度回调函数。
MenuItem-> Items[i]-> OnMeasureItem = MenuItemMeasureItem;


//设置每项菜单自画回调函数。
MenuItem-> Items[i]-> OnDrawItem = MenuItemDrawItem;
//设置下一级字菜单。
if(MenuItem-> Items[i]-> Count > 0)
{
for(int x=0; x <= MenuItem-> Items[i]-> Count-1; x++)
{
MenuItem-> Items[i]-> Items[x]-> OnMeasureItem =
MenuItemMeasureItem;
MenuItem-> Items[i]-> Items[x]-> OnDrawItem =
MenuItemDrawItem;
}
}
}
}
}

热点排行