自绘ListBox的两种效果

frank射手7

frank射手7

2016-02-19 16:21

下面是个自绘ListBox的两种效果教程,撑握了其技术要点,学起来就简单多了。赶紧跟着图老师小编一起来看看吧!
本文利用Listbox自绘实现了两种特殊效果,其中第两种风格来自C++ Builder 研究 www.ccrun.com,老妖用BCB实现了,现在把它转换成Delphi代码。
  
  演示图片:
  
  
  //--------------------------------------------------------------------------
  
  unit DrawListItem;

  interface

  uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, ImgList, jpeg, ExtCtrls;

  type
    TForm1 = class(TForm)
      lsbRight: TListBox;
      ImageList1: TImageList;
      StaticText1: TStaticText;
      lsbLeft: TListBox;
      imgHouse: TImage;
      imgHouseGray: TImage;
      procedure FormCreate(Sender: TObject);
      procedure lsbRightDrawItem(Control: TWinControl; Index: Integer;
        Rect: TRect; State: TOwnerDrawState);
      procedure lsbRightClick(Sender: TObject);
      procedure FormShow(Sender: TObject);
      procedure lsbLeftDrawItem(Control: TWinControl; Index: Integer;
        Rect: TRect; State: TOwnerDrawState);
    private

    public
      { Public declarations }
    end;

  var
    Form1: TForm1;

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  implementation

  {$R *.dfm}
  
  {========================================================================
    DESIGN BY :  彭国辉
    DATE:        2004-11-29
    SITE:       
http://kacarton.yeah.net/
    BLOG:        http://blog.csdn.net/nhconch
    EMAIL:       kacarton@sohu.com

    文章为作者原创,转载前请先与本人联系,转载请注明文章出处、保留作者信息,谢谢支持!
  =========================================================================}
  

  procedure
TForm1.FormCreate(Sender: TObject);
  var
      i: integer;
  begin
      lsbRight.Style := lbOwnerDrawFixed;
      lsbRight.Ctl3D := false;
      lsbRight.ItemHeight := 50;
      lsbRight.Items.Add('C++ Builder 研究
www.ccrun.com'#13'致力于BCB的学习探讨和研究'#13'ccrun(老妖)');
      lsbRight.Items.Add('编程手札 My Developer Knowledge Base'#13'http://blog.csdn.net/nhconch'#13'天蝎蝴蝶');
      for i:=3 to 10 do begin
          lsbRight.Items.Add('ListBox Items of ' + IntTostr(i) + #13'Second of '
              + IntToStr(i) + #13'Third of ' + IntToStr(i));
      end;

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

      lsbLeft.Style := lbOwnerDrawFixed;
      lsbLeft.Ctl3D := false;
      lsbLeft.ItemHeight := 90;
      lsbLeft.Items.Add('编程手札');
      lsbLeft.Items.Add('My Developer Knowledge Base');
      lsbLeft.Items.Add('站长:天蝎蝴蝶');
      lsbLeft.Items.Add('http://blog.csdn.net/nhconch');
  end;

  procedure TForm1.lsbRightDrawItem(Control: TWinControl; Index: Integer;
    Rect: TRect; State: TOwnerDrawState);
  var
      strTemp: String;
  begin
      //文字颜色
      lsbRight.Canvas.Font.Color := clBlack;
      //设置背景颜色并填充背景
      lsbRight.Canvas.Brush.Color := clWhite;
      lsbRight.Canvas.FillRect (Rect);
      //设置圆角矩形颜色并画出圆角矩形
      lsbRight.Canvas.Brush.Color := TColor($00FFF7F7);
      lsbRight.Canvas.Pen.Color := TColor($00131315);
      lsbRight.Canvas.RoundRect(Rect.Left + 3, Rect.Top + 3,
              Rect.Right - 2, Rect.Bottom - 2, 8, 8);
      //以不同的宽度和高度再画一次,实现立体效果
      lsbRight.Canvas.RoundRect(Rect.Left + 3, Rect.Top + 3,
              Rect.Right - 3, Rect.Bottom - 3, 5, 5);
      //如果是当前选中项
      if(odSelected in State) then
      begin
          //以不同的背景色画出选中项的圆角矩形
          lsbRight.Canvas.Brush.Color := TColor($00FFB2B5);
          lsbRight.Canvas.RoundRect(Rect.Left + 3, Rect.Top + 3,
                  Rect.Right - 3, Rect.Bottom - 3, 5, 5);
          //选中项的文字颜色
          lsbRight.Canvas.Font.Color := clBlue;
          //如果当前项拥有焦点,画焦点虚框,当系统再绘制时变成XOR运算从而达到擦除焦点虚框的目的
          if(odFocused in State) then DrawFocusRect(lsbRight.Canvas.Handle, Rect);
      end;
      //画出图标
      ImageList1.Draw(lsbRight.Canvas, Rect.Left + 7,
              Rect.top + (lsbRight.ItemHeight - ImageList1.Height) div 2, Index, true);
      //分别绘出三行文字
      strTemp := lsbRight.Items.Strings[Index];
      lsbRight.Canvas.TextOut(Rect.Left + 32 + 10, Rect.Top + 4
  
                            , Copy(strTemp, 1, Pos(#13, strTemp)-1));
      strTemp := Copy(strTemp, Pos(#13, strTemp)+1, Length(strTemp));
      lsbRight.Canvas.TextOut(Rect.Left + 32 + 10, Rect.Top + 18,
                              Copy(strTemp, 1, Pos(#13, strTemp)-1));
      lsbRight.Canvas.TextOut(Rect.Left + 32 + 10, Rect.Top + 32,
                              Copy(strTemp, Pos(#13, strTemp)+1, Length(strTemp)));
  end;

  procedure TForm1.lsbRightClick(Sender: TObject);
  begin
      StaticText1.Caption := ' ' + lsbRight.Items.Strings[lsbRight.ItemIndex];
  end;

  procedure TForm1.FormShow(Sender: TObject);
  begin
      lsbRight.ItemIndex := 0;
      lsbRight.Repaint();

      lsbLeft.ItemIndex := 0;
      lsbLeft.Repaint();
  end;

  procedure TForm1.lsbLeftDrawItem(Control: TWinControl; Index: Integer;
    Rect: TRect; State: TOwnerDrawState);
  var
      r: TRect;
  begin
      with lsbLeft.Canvas do begin
          //设置填充的背景颜色并填充背景
          Brush.Color := clWhite;
          FillRect (Rect);
          //绘制圆角矩形
          if (odSelected in State) then   //选中项的圆角矩形颜色
              Pen.Color := $FFB2B5
          else                            //未选中项的圆角矩形颜色
              Pen.Color := clSilver;
          Brush.Style := bsClear;
          SetRect(r, Rect.Left+3, Rect.Top+3, Rect.Right-3, Rect.Bottom-3);
          RoundRect(r.Left, r.Top, r.Right, r.Bottom, 10, 10);
          //画出图标
          if (odSelected in State) then   //选中项的图像
              Draw(r.Left + (r.Right - r.Left - imgHouse.Width) shr 1,
                  r.Top + 2, imgHouse.Picture.Graphic)
          else                            //未选中项的图像
              Draw(r.Left + (r.Right - r.Left - imgHouseGray.Width) shr 1,
                  r.Top + 2, imgHouseGray.Picture.Graphic);
          //填充文字区背景
          r.Top := r.Bottom - Abs(Font.Height) - 4;
          Brush.Style := bsSolid;
          if (odSelected in State) then   //选中项的背景颜色
              Brush.Color := $FFB2B5
          else                            //未选中项的背景颜色
              Brush.Color := clSilver;
          FillRect(r);
          //输出文字,仅支持单行
          Font.Color := clBlack;
          r.Top := r.Top + 2; //计算文字顶点位置,(水平居中,DT_CENTER不可用)
  
        DrawText(Handle, PChar(TListBox(Control).Items.Strings[Index]), -1, r
                  , DT_CENTER or DT_END_ELLIPSIS{ or DT_WORDBREAK});
          //画焦点虚框,当系统再绘制时,变成XOR运算,从而达到擦除焦点虚框的目的
          if(odFocused in State) then DrawFocusRect(Rect);
      end;
  end;

  end.
  

展开更多 50%)
分享

猜你喜欢

自绘ListBox的两种效果

编程语言 网络编程
自绘ListBox的两种效果

ListBox编程两例

编程语言 网络编程
ListBox编程两例

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

两种廉价菜防癌效果奇好

疾病预防
两种廉价菜防癌效果奇好

凉粉的两种吃法

生活常识 生活小常识
凉粉的两种吃法

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

椰子的两种吃法

营养价值
椰子的两种吃法

抄手的两种做法

生活常识 生活小常识
抄手的两种做法

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

.Net环境下基于Ajax的MVC方案

.Net环境下基于Ajax的MVC方案

ASP入门基础教程-内容链接组件

ASP入门基础教程-内容链接组件
下拉加载更多内容 ↓