首先声明:
怎样在有主菜单的窗体右上角加上图标(像IE一样)的说法有点问题, IE的菜单不是直接放在窗口上面的,是放在一个容器上的,然后再容器右边放图标,你的要求是在窗口的主菜单右边放图标,跟IE的做法不同;
如果用Coolbar 和 Toolbar, 在Toolbar的ToolButton 上 “映射” 菜单, 以后再CoolBar右边放图标,也可以实现,但我没有这样做
我现在采用的方法;
增加一个菜单项 logo1(这个菜单就是你要求的图标)
在form 的 onCreate中 将菜单放到右边
if not isRunOnWIN98(false) then
ModifyMenu(MM.Handle, 4, mf_ByPosition or mf_help or MF_OWNERDRAW, 4, nil)
else
logo1.Visible:=false;
然后就是自画菜单啦!!!(不能直接用菜单的OnDrawitem,为什么我也不知道),只能拦截WM_DRAWITEM 消息。
procedure wmDrawitem(var msg: TwmDrawitem); message WM_DRAWITEM;
...
procedure TfmMain.wmDrawitem(var msg: TwmDrawitem);
var
R: TRect;
cvs: TControlCanvas;
begin
if msg.DrawItemStruct.CtlType=ODT_MENU then
begin
cvs:=TControlCanvas.Create;
Try
cvs.Handle:=msg.DrawItemStruct.hDC;
R:=msg.DrawItemStruct.rcItem;
cvs.FillRect(R);
cvs.Draw(R.Left+4, R.Top, Image1.Picture.Graphic); 这里就是啦!!!
cvs.Pen.Color:=clEnd;
cvs.MoveTo(R.Left, R.Top);
cvs.LineTo(R.Left, R.Bottom);
finally
Cvs.Free;
end;
end else inherited;
end;
如果需要,你还可以改变菜单(图标)的宽度(高度不能改变,系统定死了)
procedure logoMM(Sender: TObject; ACanvas: TCanvas; var Width,
Height: Integer);
procedure TfmMain.logoMM(Sender: TObject; ACanvas: TCanvas;
var Width, Height: Integer);
begin
width:=image1.Picture.Width-4;
end;
[
][
]OK? 好像在Win98下面有点问题。