如何在菜单的左边加一个长方形的图片,就像WINDOWS的开始菜单?

解决方案 »

  1.   

    程序都写好了,现在需求要加上一个竖条的图片,最好能用delphi自带的东东实现
      

  2.   


    Graphics::TBitmap *bmp;                     // Line 1
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
        bmp = new Graphics::TBitmap;            // Line 2
        bmp->LoadFromFile("Bar.bmp");           // Line 3    // (bmp = new Graphics::TBitmap)->LoadFromFile("Bar.bmp");
        // 这样写又可以省一行,哈哈,不过怕新手看不明白 :)
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::BarItemMeasureItem(TObject *Sender,
          TCanvas *ACanvas, int &Width, int &Height)
    {
        Width += 2;                             // Line 4
        Height *= BarItem->Parent->Count - 1;   // Line 5
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::BarItemDrawItem(TObject *Sender, TCanvas *ACanvas,
          TRect &ARect, bool Selected)
    {
        ACanvas->Draw(0, 0, bmp);               // Line 6
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
        delete bmp;                             // Line 7
    }
    //--------------------------
      

  3.   

    var bmp:TBitmap;                     // Line 1
    //---------------------------------------------------------------------------
    procedure TForm1.Form1Create(Sender:TObject);
    begin
        bmp := TBitmap.Create;            // Line 2
        bmp.LoadFromFile('Bar.bmp');           // Line 3    // (bmp = new Graphics::TBitmap)->LoadFromFile("Bar.bmp");
        // 这样写又可以省一行,哈哈,不过怕新手看不明白 :)
    end;
    //---------------------------------------------------------------------------
    procedure TForm1.BarItemMeasureItem(Sender:TObject;
          ACanvas:TCanvas;Width,Height:integer);
    begin
        Width:=Width + 2;                             // Line 4
        Height := Height*(BarItem.Parent.Count - 1);   // Line 5
    end;
    //---------------------------------------------------------------------------
    procedure TForm1.BarItemDrawItem(Sender:TObject ; ACanvas:TCanvas;
          ARect:TRect ; Selected:boolean );
    begin
        ACanvas.Draw(0, 0, bmp);               // Line 6
    end;
    //---------------------------------------------------------------------------
    procedure TForm1.FormDestroy(Sender:TObject);
    begin
       bmp.Free;                             // Line 7
    end;
    //--------------------------
      

  4.   

    不好意思,译了一下flashtong(阿木)的代码
      

  5.   

    不好意思,请问BarItemDrawItem 是个什么事件啊,怎么和TPopupMenu控件联系起来呢
      

  6.   

    双击打开菜单设计器,点中一条菜单,在Object Inspector的Events页里就能找到OnDrawItem事件了,双击
      

  7.   

    我要的效果是类似windows 2000  server开始菜单 中左边通条长方形效果不是针对子项的
      

  8.   

    TPopupMenur控件OwnerDraw 属性要设为true
    图片定位有问题,象是加了个背景的效果,咋整
      

  9.   

    引自about:delphi programming,详情见:http://delphi.about.com/od/vclusing/a/owner_drawing.htm
    procedure TForm1.mnuBoldDrawItem (Sender: TObject; ACanvas: TCanvas; ARect: TRect; Selected: Boolean) ;
    var
     ImgID: integer;
    begin if Selected then
       ACanvas.Brush.Color := clHighlight
     else
       ACanvas.Brush.Color := clMenu; {move the rect to make place for the side bar}
     ARect.Left := 20; ACanvas.FillRect(ARect) ; if mnuBold.Checked then
       ImgID := 1 {thumb up in the ImageList}
     else
       ImgID := 0; {thumb down in the ImageList} ImageList1.Draw(ACanvas,22,ARect.Top + 2,ImgID) ; ACanvas.Font.Style := [fsBold]; {user defined text drawing function:}
     DrawItemText(45,ACanvas,ARect,'Bold') ;
    end;