社区
Delphi
帖子详情
我怎样去创建一个类似于WIN98开始菜单呢???
TeamD
2000-05-25 09:28:00
象MS 的一些OS。比如Win95 win98 winnt的开始菜单左侧不是有一个侧写的Windows xxx 吗??Delphi自带的VCL是不带这样的功能的。我应该怎样去做呢???有人可以回答我吗?????
...全文
354
15
打赏
收藏
我怎样去创建一个类似于WIN98开始菜单呢???
象MS 的一些OS。比如Win95 win98 winnt的开始菜单左侧不是有一个侧写的Windows xxx 吗??Delphi自带的VCL是不带这样的功能的。我应该怎样去做呢???有人可以回答我吗?????
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
TeamD
2000-06-01
打赏
举报
回复
问题基本解决了。谢谢各位的支持。。。
Lin
2000-05-28
打赏
举报
回复
1、设置TPopupMenu的OwnerDraw为True;
2、设置TPopupMenu的Images
3、设置TMenuItem的OnMeasureItem和OnDrawItem分别指向两个例程。
这是以前我写的程序的一段代码,与大家分享(如果有什么问题,请呼我OICQ:6113690,或者写信给我,我可以写一个完整的例子):
procedure TfrmMain.pmTrayPopup(Sender: TObject);
begin
pmTray.Tag := 1; //对于左边的位图保证只绘制一次
end;
procedure TfrmMain.MenuMeasureItem(Sender: TObject; ACanvas: TCanvas;
var Width, Height: Integer);
begin
if (Sender as TMenuItem).IsLine then
Height := 4 //分隔条
else
Height := Canvas.TextHeight('高') + 6;
//const BMWidth = 位图宽度
Inc(Width, BMWidth + 7); //为左边的位图保留一些空间
end;
procedure TfrmMain.MenuDrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selected: Boolean);
var ABitmap: TBitmap;
Item: TMenuItem;
Rc: TRect;
nLeft, nTop: Integer;
Ico: HICON;
begin
Item := Sender as TMenuItem;
ABitmap := TBitmap.Create;
try
//对于左边的位图保证只绘制一次
if (pmTray.Tag = 1) and (Item.MenuIndex = 0) then
begin
pmTray.Tag := 0;
ABitmap.LoadFromResourceID(hInstance, PostMan); //左边图形的ResourceID
CopyRect(Rc, ACanvas.ClipRect);
Rc.Left := BMWidth + 2;
CopyRect(Rc, ACanvas.ClipRect);
Rc.Right := Rc.Left + BMWidth + 2;
//用图形左下的颜色填充矩形
ACanvas.Brush.Color := ABitmap.Canvas.Pixels[0, ABitmap.Height - 1];
ACanvas.FillRect(Rc);
//绘制一个凹下的矩形框
Frame3D(ACanvas, Rc, clBtnShadow, clBtnHighlight, 1);
ACanvas.Draw(Rc.Left, Rc.Top, ABitmap);
//绘制Application图标
Ico := LoadImage(hInstance, PChar(szMainIcon), IMAGE_ICON, 16, 16,
LR_DEFAULTCOLOR);
nLeft := (BMWidth - 16) div 2 + 1;
DrawIconEx(ACanvas.Handle, nLeft, Rc.Bottom - nLeft - 16,
Ico, 16, 16, 0, 0, DI_NORMAL);
DestroyIcon(Ico);
ACanvas.Brush.Color := clBtnFace;
end;
CopyRect(Rc, ARect);
Inc(Rc.Left, BMWidth + 2);
nTop := Grade + Ord(Selected);
//绘制背景图形
ABitmap.LoadFromResourceID(hInstance, nTop);
ACanvas.CopyRect(Rc, ABitmap.Canvas, Rect(0, 0, ABitmap.Width, ABitmap.Height));
if Item.IsLine then //绘制菜单分隔条
begin
nTop := (ARect.Bottom + ARect.Top) div 2 - 1;
ACanvas.Pen.Color := clBtnShadow;
ACanvas.MoveTo(BMWidth + 3, nTop);
ACanvas.LineTo(ARect.Right, nTop);
ACanvas.Pen.Color := clBtnHighlight;
ACanvas.MoveTo(BMWidth + 3, nTop + 1);
ACanvas.LineTo(ARect.Right, nTop + 1);
end else
begin
nTop := (Rc.Bottom + Rc.Top - imglstState.Height) div 2;
nLeft := Rc.Left + (Rc.Bottom - Rc.Top - imglstState.Width) div 2 + 2;
if Selected then //绘制被选择菜单的外观
begin
with Rc do
Right := Left + Bottom - Top;
DrawEdge(ACanvas.Handle, Rc, BDR_RAISEDINNER, BF_RECT);
Inc(Rc.Left, Rc.Bottom - Rc.Top + 1);
Rc.Right := ARect.Right;
DrawEdge(ACanvas.Handle, Rc, BDR_SUNKENOUTER, BF_RECT);
end;
//绘制菜单前面的小图形,一个TImageList
imglstState.Draw(ACanvas, nLeft - 1, nTop, Item.ImageIndex, Item.Enabled);
CopyRect(Rc, ARect);
InflateRect(Rc, -1, -1);
Inc(Rc.Left, BMWidth + ARect.Bottom - ARect.Top + 6);
ACanvas.Brush.Style := bsClear;
if not Item.Enabled then
begin
OffsetRect(Rc, 1, 1);
ACanvas.Font.Color := clBtnHighlight;
end else
with ACanvas.Font do
if Selected then Color := clRed else Color := clBtnText;
ACanvas.Brush.Style := bsClear;
if Item.Enabled or (not Selected) then
DrawText(ACanvas.Handle, PChar(Item.Caption), Length(Item.Caption), Rc,
DT_LEFT or DT_VCENTER or DT_SINGLELINE or DT_END_ELLIPSIS);
if not Item.Enabled then
begin
OffsetRect(Rc, -1, -1);
ACanvas.Font.Color := clBtnShadow;
DrawText(ACanvas.Handle, PChar(Item.Caption), Length(Item.Caption), Rc,
DT_LEFT or DT_VCENTER or DT_SINGLELINE or DT_END_ELLIPSIS);
end;
end;
finally
ABitmap.Free;
end;
end;
Lin
2000-05-28
打赏
举报
回复
不困难啊,为什么非要用CoolMenu?如果你需要,我可以给你写一个Delphi的Demo。
zhouzq
2000-05-28
打赏
举报
回复
可以“妹”一个给我。可以“妹”一个给我。
TeamD
2000-05-28
打赏
举报
回复
正在试验这一段代码~~~~~~~~~~~~明天再回复...
TeamD
2000-05-28
打赏
举报
回复
工具栏确实是一个窗口,在Delphi 4 Developer Guide中有很详细的说明。
allexit
2000-05-27
打赏
举报
回复
我有一个想法,但我没有实践过。工具栏实际上就是一个窗口,你可以把他关掉(我曾经编程关掉过,但现在我忘了,)然后再自己做一个类似的工具栏窗口不就行了。
祝你成功。
town
2000-05-27
打赏
举报
回复
据我分析,侧写的Windows xxx 是一幅图片,但如何在菜单中加这种形式的图片,我也想知道!
Again
2000-05-27
打赏
举报
回复
如果你的菜单只有一个(工作量不是很大),不如自己做好了:
自己做个Form,左边放上Image,右边依次加上Button,
哈哈是不是很酷?
TeamD
2000-05-27
打赏
举报
回复
可以“妹”一个给我。
TeamD
2000-05-27
打赏
举报
回复
那里有CoolMenu的Source呢????
wpkiller
2000-05-25
打赏
举报
回复
不知道你的 windows 编程能力如何,但我首先要提醒你的是不是很容易。
基本的思想就是自己绘制菜单。有关的方面可以参考有关 sdk 编程的书
kxy
2000-05-25
打赏
举报
回复
如果你想尽快完成工作,使用CoolMenu控件,如果想知道如何做的,看它的Source
hunterzhang
2000-05-25
打赏
举报
回复
?
Wingsun
2000-05-25
打赏
举报
回复
通过自己截获菜单的绘制相关事件,可以绘制出自己想要的各种怪异的菜单,Delphi下的程序没有,有一个BCB下的程序实现了你的要求。
您可能没有权限使用网络资源。请与这台服务器的管理员联系以查明您是否有访问权限。拒绝访问解决方法
解决:在
开始菜单
运行中输入secpol.msc启动“本地安全策略”,本地策略 -> 用户权利分配,打开“拒绝从网络访问这台计算机”,删除guest用户。 5,防火墙规则。 症状:安装了防火墙(包括
WIN
XP系统自带的防火墙)...
Ghost 8.3 系统备份软件
先和平时一样将要 ghost 的分区做成一个 *.gho 文件,再在一台
win
98
上安装Symantec Ghost 企业版,重启。 1. 首先制作一张 ghost 带网卡驱动的启动盘。Start > Programs > Symantec Ghost > Ghost Boot Wizard...
Ghost 8.3 Enterprise
先和平时一样将要 ghost 的分区做成一个 *.gho 文件,再在一台
win
98
上安装Symantec Ghost 企业版,重启。 1. 首先制作一张 ghost 带网卡驱动的启动盘。Start > Programs > Symantec Ghost > Ghost Boot ...
代码语法错误分析工具pclint8.0
好了,这时VC tools菜单下应该又多了一个pclint_project项了,你以后可以用它来对一个VC项目运行lint检查程序了. (二)SourceInsight中集成pclint程序的方法.
Win
dows平台下也有好多人都喜欢用SourceInsight编辑C/...
VB编程资源大全(源码 网络)
(你需要在
Win
98
上首先安装20,Personal WebServer)(48KB) 20,autodial.ZIP 一个简单的拨号程序 (3KB) 21,iphost.ZIP 获得主机的IP地址(3KB) 22,connect.ZIP 建立拨号连接(2KB) 23,smtp.ZIP...
Delphi
5,388
社区成员
262,730
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章