关于MEMO控件与菜单绘制图标冲突

SummerOnce 2006-11-08 05:32:16
大夹: 请教啊, 我用软件绘制菜单图标和底背景色,也就是想将菜单绘成XP样的,但,Form界面内一加入Memo或RichEdit控件,菜单的底背景色就不出来了,不知为什么啊,去掉后就好了,如果加入其它控件都不影响.....在线等........
...全文
130 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
heheddjj 2006-11-11
  • 打赏
  • 举报
回复
XPMenu组件不能将窗口画成四个角是1/4圆的喔,有哪个控件可以吗,还有,那个控件,不能将主菜单条的颜色都画成一种颜色,就是说,设了颜色后,只有主菜单条背景是设了,但其向右部分的空菜单条颜色还是系统色,好丑喔,有没办法啊
BlueDeepOcean 2006-11-10
  • 打赏
  • 举报
回复
看看www.ccrun.com上的XPMenu组件。使用方便,不需要写太多的代码。
至于菜单重画,和一般的重画事件没有区别。关键是要计算好菜单的区域、内容文字、图标等。其他的应该没有什么问题。
ccrun.com 2006-11-10
  • 打赏
  • 举报
回复
www.ccrun.com

可以上,只是访问的人多,有时候慢。使劲刷新。
heheddjj 2006-11-10
  • 打赏
  • 举报
回复
老妖,你的网上不了啊,CCRUN
SummerOnce 2006-11-10
  • 打赏
  • 举报
回复
嘻嘻,代码下载来的,来之于网,送之于网,
修改了一点,调试,菜单没问题,代码帖上来,供大家参考一下,一起分享
SummerOnce 2006-11-10
  • 打赏
  • 举报
回复
//绘制标题栏菜单
void __fastcall TForm1::menuName01AdvancedDrawItem(TObject *Sender,
TCanvas *ACanvas, TRect &ARect, TOwnerDrawState State)
{
int MenuHeight,BmpPos; //菜单项的高度;菜单中所画图标的边距
TMenuItem *TempMenuItem = new TMenuItem(MainMenu1->Items); // (TMenuItem *)Sender
TIcon *DrawIco=new TIcon(); //图标对象,用以画出菜单项的图标
TRect TempRect; //临时的矩形区域,程序中多次使用
String ShowCaption; //菜单项的标题
TCustomImageList *ImageList=new TCustomImageList(this); //菜单项所使用的图标列表控件
TempMenuItem=((TMenuItem *)Sender); //当前菜单的菜单项
ShowCaption=TempMenuItem->Caption; //获取菜单标题
MenuHeight=25; //此数值与在 OnMeasureItem 事件中设置的Height属性值相同
BmpPos=(MenuHeight-16)/2;

/*
计算所画的图标边距,所显示的图标尺寸一般为16,所以此处取值也为16,
可根据实际更改此数值。
*/

ACanvas->Brush->Color= RGB(240,247,207);//clWhite; clSkyBlue ; // //设置菜单的背景色
// ARect.Left=ARect.Left;
// ARect.Right=ARect.Right+20;
ACanvas->FillRect(ARect); //填充背景

if (TempMenuItem->Name.Length() != 10)
{
ACanvas->Brush->Color=TColor(RGB(219,216,209)); //图标背景
TempRect=Rect(ARect.Left,ARect.Top,ARect.Left+MenuHeight,ARect.Bottom);
ACanvas->FillRect(TempRect);
}

if (TempMenuItem->Caption=="-")
{
//画分隔线
ACanvas->Pen->Color=clBtnShadow;
ACanvas->MoveTo(ARect.Left+MenuHeight,ARect.Top+((ARect.Bottom-ARect.Top) / 2)-1);
ACanvas->LineTo(ARect.Right,ARect.Top+((ARect.Bottom-ARect.Top) / 2)-1);

ACanvas->Pen->Color=clBtnHighlight;
ACanvas->MoveTo(MenuHeight,ARect.Top+((ARect.Bottom-ARect.Top) / 2));
ACanvas->LineTo(ARect.Right,ARect.Top+((ARect.Bottom-ARect.Top) / 2));

return;
}

ImageList=TempMenuItem->GetImageList(); //获取所使用的图标列表控件
if (ImageList!=NULL) //如果主菜单关联了图标列表控件
{
if (TempMenuItem->ImageIndex!=-1) //如果该菜单项指定了图标
{
ImageList->GetIcon(TempMenuItem->ImageIndex,DrawIco); //从图标列表控件中获取图标
if (TempMenuItem->Checked==true) //如果该菜单项有复选标记则画出一个蓝色框
{
ACanvas->Brush->Color=TColor(RGB(212,213,232)); //选中时的菜单颜色
ACanvas->Pen->Color =clBlack;
ACanvas->RoundRect(ARect.Left+1,Top+2,MenuHeight-2,ARect.Bottom-2,0,0);
}
}
else //如果该菜单项没有指定图标
{
if (TempMenuItem->Checked==true)
{
ImageList->GetIcon(11,DrawIco); //如果菜单项有复选标记,则从图标列表控件中获取一个表示复选的图标
//数字11是该图标的索引号,可根据实际更改;如没有该图标,可将这两句删除*/
}
}
}

if ((State.Contains(odSelected)==true)&&(State.Contains(odDisabled)==false))
{
//如果该菜单项处于被选择状态,则画出以下选择样式注释的一句加上的话表示如果菜单项处于无效状态则光标指向时无任何效果
//以下程序画出一个蓝色框以表示该菜单项处于被选择状态
ACanvas->Brush->Color=TColor(RGB(212,213,232)); //RGB(175,183,207);
ARect.Top=ARect.Top+1;
ARect.Bottom=ARect.Bottom-2;
ACanvas->Pen->Color=clBlack;
ACanvas->Rectangle(ARect.Left,ARect.Top,ARect.Right,ARect.Bottom); //矩形选择菜单条
//RoundRect(Left,Top,Right,Bottom,3,3);//圆角矩形选择菜单条
//以上四句画出蓝色框

ACanvas->Pen->Color=clBtnShadow;
ACanvas->Draw (BmpPos,ARect.Top+2,DrawIco); //画出图标
ACanvas->Draw (BmpPos,ARect.Top+BmpPos,DrawIco); //画出图标
//画出图标阴影
BmpPos=BmpPos-1;
ARect.Top=ARect.Top-2;
}

ACanvas->Draw (BmpPos,ARect.Top+BmpPos,DrawIco); //画出图标
DrawIco->Free(); //图标已画出,可以释放图标对象

if (TempMenuItem->Name.Length() != 10) //设置菜单标题的矩形区域,文字的位置
TempRect=Rect(ARect.Left+MenuHeight+5,ARect.Top,ARect.Right,ARect.Bottom); //不是主菜单则留图标位
else
TempRect=Rect(ARect.Left+5,ARect.Top,ARect.Right,ARect.Bottom); //是主菜单则,以+5绘文字

ACanvas->Brush->Style=bsClear; //设置画刷的填充样式为透明,这样画出的菜单标题就为透明底色

if (State.Contains(odSelected)==true)
{
ACanvas->Font->Color=clBlack;
TempRect.Top=TempRect.Top+(TempRect.Height()-ACanvas->Font->Size)/2-1;
}
else
{
ACanvas->Font->Color==clBlack; //黑色字体
TempRect.Top=TempRect.Top+(TempRect.Height()-ACanvas->Font->Size)/2-2;
}

if (TempMenuItem->Default)
{
ACanvas->Font->Style<<fsBold;
}

DrawText(ACanvas->Handle,ShowCaption.c_str(),-1,&TempRect,DT_LEFT ); //|| DT_SINGLELINE || DT_VCENTER
//画出菜单项的标题
}
SummerOnce 2006-11-10
  • 打赏
  • 举报
回复
嚓嚓,老妖,那个代码写完了,但现在不用了,找了个控件使用,还是控件省事些,要不代码一堆,真难受,现在遇到个新问题,各位大侠一起想想喔,好像是CB6的BUG,就是新建个窗口,在上面放一个TOOLBAR,设成FLAT为TRUE, 再在TOOLBAR上面放一个SPEEDBUTTON,如果这个BUTTON也设成FLAT,则BUTTON中间为出现一条竖线,不知为啥,,
ccrun.com 2006-11-08
  • 打赏
  • 举报
回复
楼主的人呢,跑路了?
ccrun.com 2006-11-08
  • 打赏
  • 举报
回复
我正在做饭,还没有吃饭。
你在什么事件中绘制的菜单项?贴部分代码出来。按道理说添加一个Memo是不影响菜单自画的。
SummerOnce 2006-11-08
  • 打赏
  • 举报
回复
@@各位大侠都在吃饭么...自已顶一下

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧