社区
C++ Builder
帖子详情
关于MEMO控件与菜单绘制图标冲突
SummerOnce
2006-11-08 05:32:16
大夹: 请教啊, 我用软件绘制菜单图标和底背景色,也就是想将菜单绘成XP样的,但,Form界面内一加入Memo或RichEdit控件,菜单的底背景色就不出来了,不知为什么啊,去掉后就好了,如果加入其它控件都不影响.....在线等........
...全文
169
10
打赏
收藏
关于MEMO控件与菜单绘制图标冲突
大夹: 请教啊, 我用软件绘制菜单图标和底背景色,也就是想将菜单绘成XP样的,但,Form界面内一加入Memo或RichEdit控件,菜单的底背景色就不出来了,不知为什么啊,去掉后就好了,如果加入其它控件都不影响.....在线等........
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
@@各位大侠都在吃饭么...自已顶一下
C++Builder实战:从零构建Windows设备监控工具界面与数据可视化
本文详细讲解使用C++Builder和VCL框架开发Windows原生设备监控工具的全过程,涵盖界面布局(三栏式设计)、TChart实时数据可视化、INI配置持久化、多线程UI安全更新、TActionList统一行为管理及部署调试技巧。重点解决界面卡顿、内存泄漏、属性失效等实战问题,突出VCL事件驱动模型与RAD高效开发优势。
C++ Builder XE10演示项目:从RAD开发到多线程实战全解析
本文以C++ Builder XE10演示项目为载体,系统解析基于VCL框架的快速应用开发(RAD)全流程,重点涵盖可视化窗体设计、事件驱动编程、TClientDataSet数据绑定、TThread多线程异步任务实现及UI线程安全更新机制。同时深入讲解IDE核心能力:Code Insight智能提示、条件断点与日志点调试、多线程调用栈分析、Build配置优化及部署打包。所有内容聚焦Windows平台原生C++桌面应用开发效能提升。
ExtJs开发教程_002_如何使用ExtJs中的Ext.data.TreeStore
本文详细介绍了ExtJS中的TreeStore组件,包括其构造方法、关键属性的作用及使用技巧。通过实例展示了如何创建异步加载的树形结构,并解析了相关JSON数据格式。
在虚幻引擎中集成React:现代化UI开发方案全解析
本文详解在虚幻引擎中通过Puerts插件集成React构建现代化UI的技术路径,涵盖架构设计(UE底层、Puerts中间层、React上层)、工程化配置(Vite构建、类型绑定、通信桥接)、UI开发模式(自定义Hook状态同步、CSS-in-JS与Tailwind混合样式、虚拟列表优化)、深度引擎交互(调用蓝图/C++函数、事件响应、输入焦点控制)、调试部署(Chrome DevTools联调、热重载、资源打包)及性能陷阱规避(内存泄漏预防、通信频率优化、状态预测)。核心技术聚焦JS/TS与UE原生系统的高效协同。
C++ Builder
13,872
社区成员
102,696
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章