BorderColor:TColor; //边框颜色
FillColor:TColor; //未选中填充颜色
TextColor:TColor; //未选中字体颜色
SelectTextColor:TColor; //选中字体颜色
SelectFillColor:TColor; //选中填充颜色
SideBuffer:Integer; //边框宽度
procedure TForm1.FormCreate(Sender: TObject);
begin
BorderColor:=clRed;
FillColor:=clWhite;
TextColor:=clBlue;
SelectTextColor:=clYellow;
SelectFillColor:=clGray;
SideBuffer:=1;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
po:TPoint;
begin
po.X:=TControl(Sender).Left;
po.Y:=TControl(Sender).Top+TControl(Sender).Height;
po:=ClientToScreen(po);
PopupMenu1.Popup(po.X,po.Y);
end;
procedure TForm1.N11DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selected: Boolean);
var
FocusRectBorder:TRect;
FocusRectFill:TRect;
TextRect:TRect;
MenuItem:TMenuItem;
Title:string;
begin
TextRect:=ARect;
MenuItem:=(Sender) as TMenuItem;
Title:=MenuItem.Caption;
// 填充菜单项背景颜色
ACanvas.Brush.Color:=FillColor;
ACanvas.FillRect(ARect);
//没有菜单内容就返回。
if Title='' then exit;
//选中菜单
if selected then
begin
//画菜单外面边框。
FocusRectBorder:=ARect;
ACanvas.Brush.Color := BorderColor;
ACanvas.FrameRect(FocusRectBorder);
//填充菜单内部
FocusRectFill := ARect;
//设置内部边框比外面要小点。
FocusRectFill.Top := FocusRectFill.Top + SideBuffer;
FocusRectFill.Left := FocusRectFill.Left + SideBuffer;
FocusRectFill.Right := FocusRectFill.Right - SideBuffer;
FocusRectFill.Bottom := FocusRectFill.Bottom - SideBuffer;
//设置为高度显示的颜色
ACanvas.Brush.Color := SelectFillColor;
ACanvas.FillRect(FocusRectFill);
//设置当菜单选中后字体的颜色
ACanvas.Font.Color := SelectTextColor;
ACanvas.Font.Style := ACanvas.Font.Style+[fsBold];
end
else //没有选中
begin
//设置当菜单字体的颜色
ACanvas.font.Color := TextColor;
ACanvas.Font.Style := ACanvas.Font.Style+[fsBold];
end;
//画图标
if MenuItem.ImageIndex<> -1 then
begin
ACanvas.Font.Style := ACanvas.Font.Style-[fsBold];
ImageList1.Draw(ACanvas,0,(MenuItem.ImageIndex)*27,MenuItem.ImageIndex);
end;
//写文字
TextRect.Left := TextRect.Left+5+24;
TextRect.Top := TextRect.Top + 1;
DrawText(ACanvas.Handle,PChar(Title),Length(title),TextRect,0);
end;