我想把菜单搞得漂亮些。
解决方案 »
- 设计一个木马程序,检测系统中有哪些启动项目,把可疑的东西显示出来
- Simpledataset的lookup问题
- 线程生成一个窗口出错? 紧急求救大虾帮助啊
- 怎样把一个字符串数组存入Access数据库?
- 几个小问题请教各位了!
- 各位大哥,谁能发给我一个sncCurrency财务凭证控件,先用100大洋做酬谢!!
- 紧急求助,怎么样在Pchar类型字符串中添加字符
- delphi循环问题
- 难到这个问题没人回答吗?????http://www.csdn.net/Expert/topic/430/430088.shtm
- 有关动态生成控钮的问题:)
- 一个很简单的问题?有分,别错过
- 请教:如下代码在WIN98下运行正常,在WIN2K下不行,而且什么提示都没有,何故?
DeleteMenu(mymenu, 0, MF_BYPOSITION); //把系统的菜单一个个去掉。
Windows, Graphics, Forms, Menus, Classes;type
TfrmMain = class(TForm)
mnuPopup: TPopupMenu;
MainMenu1: TMainMenu;
sdfsdf1: TMenuItem;
sdfsdf2: TMenuItem;
dfgdfg1: TMenuItem;
dfgdfg2: TMenuItem;
N1: TMenuItem;
werwer1: TMenuItem; procedure DrawMenu(Sender: TObject; ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState);
procedure MeasureMenu(Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
end;var
frmMain: TfrmMain;
bmp1:tbitmap;
implementation{$R *.DFM}procedure TfrmMain.DrawMenu(Sender: TObject; ACanvas: TCanvas; ARect: TRect; State: TOwnerDrawState);
var
cTemp: TCanvas;
sText: String;
mWnd: HWND;
rMenu: TRect;begin ACanvas.BrushCopy(ARect, bmp1, ARect, clBlack);
ACanvas.Brush.Style := bsclear;
sText := TMenuItem(Sender).Caption;
acanvas.Font.Color:=clred;
with ACanvas do begin
if odSelected in State then begin
pen.Style:=psInsideFrame;
Brush.Color := RGB(110, 131, 184);
Pen.Color := RGB(47, 60, 93);
Rectangle(ARect);
end; if sText = '-' then begin
// Draw line
ACanvas.Pen.Color := RGB(0, 0, 0);
MoveTo(ARect.Left, ARect.Top + ((ARect.Bottom - ARect.Top) div 2));
LineTo(ARect.Right, ARect.Top + ((ARect.Bottom - ARect.Top) div 2));
end else begin
// Draw text
Inc(ARect.Left, 12);
DrawText(Handle, PChar(sText), Length(sText), ARect, DT_LEFT or DT_VCENTER or DT_SINGLELINE);
end;
end;
// 画边框的,效果是平面的
mWnd := WindowFromDC(ACanvas.Handle); if mWnd <> Self.Handle then begin
cTemp := TCanvas.Create();
cTemp.Handle := GetDC(0); Windows.GetWindowRect(mWnd, rMenu); cTemp.Brush.Color := RGB(120, 120, 120);
cTemp.FrameRect(rMenu); InflateRect(rMenu, -1, -1);
cTemp.Brush.Color := RGB(240, 240, 240);
cTemp.FrameRect(rMenu); InflateRect(rMenu, -1, -1);
cTemp.FrameRect(rMenu); ReleaseDC(0, cTemp.Handle);
cTemp.Free(); end;end;procedure TfrmMain.MeasureMenu(Sender: TObject; ACanvas: TCanvas; var Width, Height: Integer);
begin
Inc(Width,50);//调整菜单的宽度 inc(height,15);//调整每一个item的高度,这一句可以不要,使用默认值
end;procedure TfrmMain.FormCreate(Sender: TObject);
begin
bmp1:=tbitmap.Create;
bmp1.loadfromfile('e:\aaa.bmp');
end;procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
bmp1.Free;
end;end.
记得要把owerdraw设为true。
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Menus;type
TForm1 = class(TForm)
Image1: TImage;
MainMenu1: TMainMenu;
aa1: TMenuItem;
bb1: TMenuItem;
cc1: TMenuItem;
procedure aa1MeasureItem(Sender: TObject; ACanvas: TCanvas;var Width, Height: Integer);
procedure bb1MeasureItem(Sender: TObject; ACanvas: TCanvas;var Width, Height: Integer);
procedure cc1MeasureItem(Sender: TObject; ACanvas: TCanvas;var Width, Height: Integer);
procedure aa1DrawItem(Sender: TObject; ACanvas: TCanvas;ARect: TRect; Selected: Boolean);
procedure bb1DrawItem(Sender: TObject; ACanvas: TCanvas;ARect: TRect; Selected: Boolean);
procedure cc1DrawItem(Sender: TObject; ACanvas: TCanvas;ARect: TRect; Selected: Boolean);
private
{ Private declarations }
public
{ Public declarations }
procedure DrawItem(Sender: TMenuItem; ACanvas: TCanvas;ARect: TRect; Selected: Boolean;strOUt:String);
end;var
Form1: TForm1;
i,iH,Ind,iW,iRate:Integer;
rTemp:TRect;
iG1,iG2:Integer;implementation{$R *.dfm}
procedure TForm1.DrawItem(Sender: TMenuItem; ACanvas: TCanvas;ARect: TRect;Selected: Boolean;strOut:String);
var
j:Integer;
begin
i:=ARect.Bottom -ARect.Top; //获得贴图的高度和宽度
Ind:=Sender.MenuIndex;
iH:=Round(Image1.Height/6*Ind); //获得贴图位置
//将Image上相应位置的位图复制到菜单上 StretchBlt(ACanvas.Handle,ARect.Left,ARect.Top,iW,i,Image1.Canvas.Handle,0,iH,Image1.Width,Round(Image1.Height/6),SRCCOPY); if Selected then begin //该菜单项被选中 ACanvas.Font.Color := clWhite;
rTemp:=ARect; rTemp.Left := rTemp.left+iW;
iG1:=Round((rTemp.Right - rTemp.Left)/10); rTemp.Right := rTemp.Left +iG1;
for j:= 0 to 9 do begin //通过循环设置色彩渐变效果
ACanvas.Brush.Color := RGB(0,0,j*25);
ACanvas.FillRect(rTemp); rTemp.Left := rTemp.Left +iG1;
rTemp.Right := rTemp.Left +iG1;
end;
end
else begin //该菜单项没有被选中
ACanvas.Brush.Color := cl3DLight; //设置背景色为浅灰
rTemp:=ARect;
rTemp.Left := rTemp.left+iW;
ACanvas.FillRect(rTemp);
ACanvas.Font.Color := clBlack;
end;
//设置Canvas的画笔填充模式为透明
ACanvas.Brush.Style:=bsClear;
//在菜单上输出文字
ACanvas.TextOut(ARect.Left+iW+5,ARect.Top,strOut);
end;procedure TForm1.aa1MeasureItem(Sender: TObject; ACanvas: TCanvas;var Width, Height: Integer);
begin
//在OnMeasureItem事件中改变菜单的宽度和高度,下面5个程序同
//改变菜单的宽度和高度以容纳文本
Height:=ACanvas.TextHeight('Caption1')+5;
Width:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
Width:=Width+iW; //根据计算改变菜单宽度以容纳附加的文本
end;procedure TForm1.bb1MeasureItem(Sender: TObject; ACanvas: TCanvas;var Width, Height: Integer);
begin
Height:=ACanvas.TextHeight('Caption1')+5;
Width:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
Width:=Width+iW;
end;procedure TForm1.Cc1MeasureItem(Sender: TObject; ACanvas: TCanvas;
var Width, Height: Integer);
begin
Height:=ACanvas.TextHeight('Caption1')+5;
Width:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(Height*6));
iW:=Round(Image1.Width /iRate);
Width:=Width+iW;
end;procedure TForm1.aa1DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selected: Boolean);
begin
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'aa');
end;procedure TForm1.bb1DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selected: Boolean);
begin
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'bb');
end;
procedure TForm1.cc1DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selected: Boolean);
begin
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'cc');
end;end.