1.新建一个PopupMenu1.设置OwnerDraw:=True; 
2.添加一个菜单项m1.设置m1.Caption:=''; 
  m1.Enabled:=False; 
3.添加一些你需要的菜单项m2,m3,m4,……. 
  其中设置m2.Break:=mbBreak; 
4.在m1的DrawItem中: 
procedure TForm1.m1DrawItem(Sender: TObject; ACanvas: TCanvas; 
  ARect: TRect; Selected: Boolean); 
var 
  i:word; 
  dy,y:real; 
  lf:TLogFont; 
  tf:TFont; 
begin 
  //画渐进色背景 
  dy:=(ARect.Bottom - ARect.Top)/256; 
  y:=0; 
  for i:=255 downto 0 do 
  begin 
    Acanvas.brush.color:=RGB(255-i,255-i,255); 
    Acanvas.fillrect(rect(0,round(y),ARect.Right - ARect.Left,round(y+dy))); 
    y:=y+dy; 
  end; 
  //写字 
  With ACanvas do 
    Begin 
      Brush.Style:=bsClear; 
      Font.Name:='宋体'; 
      Font.Size:=12; 
      Font.Color:=clred; 
      tf:=TFont.Create; 
      tf.Assign(Font); 
      GetObject(tf.Handle,sizeof(lf),@lf); 
      lf.lfEscapement:=900; 
      tf.Handle:=CreateFontIndirect(lf); 
      Font.Assign(tf); 
      tf.Free; 
      TextOut(ARect.Left +2,ARect.Bottom -2,'弹出菜单'); 
    End; 
end; 
5.在m1的MeasureItem中: 
procedure TForm1.m1MeasureItem(Sender: TObject; ACanvas: TCanvas; 
  var Width, Height: Integer); 
begin 
///////// 
  Width:= 10; 
  Height:= (PopupMenu1.Items.Count - 1) * 19; 
end; 
***********************************************
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;