自画PopMenu弹出

   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;

 

posted @ 2012-06-21 09:10  ftwsnow  阅读(820)  评论(0编辑  收藏  举报