国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 學院 > 開發設計 > 正文

發掘ListBox的潛力(一):自動調整橫向滾動條寬度

2019-11-18 18:06:09
字體:
來源:轉載
供稿:網友
自繪ListBox的兩種效果》一文帖出之后,從反饋信息來看,大家對這種小技巧還是很認同。接下來我將繼續圍繞ListBox寫一系列的文章,進一步發掘ListBox的潛力,其中包括:自動調整橫向滾動條寬度、即時提示(Tips)、拖放插入點提示等,并在最后制作一個在滾動區內的ListBox組。

自動調整橫向滾動條寬度

  網上可以找到很多讓Listbox產生橫向滾動條的文章,其中的方法基本一樣,就是定義一個函數,遍歷Items取得最大的TextWidth值,然后發Listbox發消息LB_SETHORIZONTALEXTENT產生橫向滾動條。典型例子如下:

PRocedure SetWidth(Sender: TObject);
var
    i, w: Integer;
begin
    w := 0;
    with ListBox1 do begin
        for i:=0 to Items.Count -1 do begin
            if Canvas.TextWidth(Items[i]) > w then
                w := Canvas.TextWidth(Items[i]);
        end;
        SendMessage(Handle, LB_SETHORIZONTALEXTENT, w+4, 0);
    end;
end;
  以上代碼的確可用而且被廣泛使用,但它有一個很大的缺點:效率大低。因為每次在Listbox中追加、插入或刪除一個條目時,都要調用此函數重新計算橫向滾動條寬度,而遍歷所有項目和調用TextWidth都是很是很耗時的操作。如果用戶將條目從當前Listbox拖往另一個Listbox,那么用戶一個操作將有兩個Listbox必須重新計算橫向滾動條寬度,當Listbox內容有上百條的時候,你將明顯感覺反應遲緩。
  OK,現在換個思路。
  當追加或插入新條目時,只要判斷新內容的TextWidth是否大于滾動條寬度,如果是調整滾動條寬度即可。那么刪除呢?是的,遍歷是不可避免的,但并不是每次刪除都需要。可以定義一個變量記錄Listbox中TextWidth值最大的條目Index,只有刪除這個條目時才需要遍歷,其它時候完全可以不管它。
  還有一種情況必須考慮,用戶可能會改變屏幕字體,這時也必須重新計算橫向滾動條寬度。跟刪除操作一樣計算原最大條目的新TextWidth值即可。
  如果窗體上有多個Listbox,記錄每個Listbox的最大條目也是一件很麻煩的事,所以我把它封裝起來,下面給出完整代碼:

unit kktListBox;

{========================================================================
  DESIGN BY :  彭國輝
  DATE:        2004-12-24
  SITE:       
http://kacarton.yeah.net/
  BLOG:        http://blog.csdn.net/nhconch
  EMAIL:       kacarton#sohu.com

  文章為作者原創,轉載前請先與本人聯系,轉載請注明文章出處、保留作者信息,謝謝支持!
=========================================================================}

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, StdCtrls, Commctrl;

type
  TkktListBox = class(TListBox)
  private
    MaxLenItemIndex: Integer;
    FScrollWidth: Integer;
    procedure LBAddString(var Message: TMessage); message LB_ADDSTRING;
    procedure LBInsertString(var Message: TMessage); message LB_INSERTSTRING;
    procedure LBDeleteString(var Message: TMessage); message LB_DELETESTRING;
    procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
    procedure AdjuctScrollWidth(Message: TMessage);
    procedure ResetScrollWidth;

  protected

  public
    constructor Create(AOwner: TComponent); override;

  end;

procedure Register;

implementation

{ TkktListBox }

constructor TkktListBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  MaxLenItemIndex := -1;
  FScrollWidth := 0;
end;

procedure TkktListBox.LBAddString(var Message: TMessage);
begin
  inherited;
  if Message.Result = LB_ERR then Exit;
  AdjuctScrollWidth(Message);
end;

procedure TkktListBox.LBInsertString(var Message: TMessage);
begin
  inherited;
  if Message.Result = LB_ERR then Exit;
  AdjuctScrollWidth(Message);
end;

procedure TkktListBox.LBDeleteString(var Message: TMessage);
begin
  inherited;
  if Message.Result = LB_ERR then Exit;
  if Message.WParam = MaxLenItemIndex then ResetScrollWidth;
end;

procedure TkktListBox.CMFontChanged(var Message: TMessage);
var
  sz: SIZE;
begin
  inherited;
  if MaxLenItemIndex = -1 then Exit;
  //這里沒有使用TextWidth,而是用GetTextExtentPoint32函數,如果你有興趣的話
  //可以跟蹤一個TextWidth函數,它最終是調用GetTextExtentPoint32實現的

  GetTextExtentPoint32(Canvas.Handle, PChar(Items[MaxLenItemIndex]), Length(Items[MaxLenItemIndex]), sz);
  FScrollWidth := sz.cx + 4;
  Perform(LB_SETHORIZONTALEXTENT, FScrollWidth, 0);
end;

procedure TkktListBox.AdjuctScrollWidth(Message: TMessage);
var
  sz: SIZE;
begin
  GetTextExtentPoint32(Canvas.Handle, PChar(Message.LParam), StrLen(PChar(Message.LParam)), sz);
  if sz.cx + 4 > FScrollWidth then begin
    FScrollWidth := sz.cx + 4;
    Perform(LB_SETHORIZONTALEXTENT, FScrollWidth, 0);
    MaxLenItemIndex := Message.Result;
  end;
end;

procedure TkktListBox.ResetScrollWidth;
var
  i, MaxWidth: Integer;
  sz: SIZE;
begin
  MaxWidth := 0;
  i := Items.Count - 1;
  MaxLenItemIndex := -1;
  while i>=0 do begin
    sz.cx := 0;
    GetTextExtentPoint32(Canvas.Handle, PChar(Items[i]), Length(Items[i]), sz);
    if sz.cx + 4 > MaxWidth then begin
      MaxWidth := sz.cx + 4;
      MaxLenItemIndex := i;
    end;
    Dec(i);
  end;
  FScrollWidth := MaxWidth;
  Perform(LB_SETHORIZONTALEXTENT, FScrollWidth, 0);
end;

procedure Register;
begin
  RegisterComponents('Kacarton', [TkktListBox]);
end;

end.


上一篇:如何使程序在運行時自動注冊ActiveX控件

下一篇:CRC算法的實現

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
欧美日韩在线精品成人综合网| 美女被人操视频在线观看| www.狠狠色.com| 日p在线观看| 国产免费av高清在线| 国产免费a∨片在线观看不卡| 中文字幕成人乱码在线电影| 国产激情小视频在线| 天天干天天操天天爽| 国产免费自拍视频| 免费在线黄色网址| 国产精品视频一区麻豆| 亚洲久草视频| 国产精品伦理一区二区三区 | 国产毛片毛片| 国产极品嫩模在线视频一区| 精精国产xxxx视频在线动漫| 欧美婷婷久久五月精品三区| 午夜伦全在线观看| wwww亚洲| av福利在线观看| 国产黄在线播放| 日本国产在线| 在线观看国产视频| 国产青草视频在线观看视频| 国产免费高清| 欧美日韩亚洲第一页| 精品剧情v国产在线观看| 成人精品福利| 好男人免费精品视频| yjizz视频网站在线播放| 永久免费av网站| 国产精品黄页网站在线播放免费| 好男人社区在线视频| 国产在线第一页| 免费在线看v| 国产综合视频一区二区三区免费| 国产精品伦理一区二区三区| 中文字幕在线影院| 国产精品综合久久久久| 成网站在线观看人免费| 久热中文字幕在线观看| eeuss在线观看| 日本视频在线观看一区二区三区| 亚洲尤物在线视频| 日本成人在线播放| 国产在线一二| 国产欧美日韩精品综合| 国产精品美女一区二区三区四区| 国产精品剧情一区二区三区| 国产va在线| а√天堂www在线а√天堂视频| 91桃色在线| 日本黄在线观看| 最近免费中文字幕在线第一页| 国产精品一区牛牛影视| 国产欧美日韩第一页| 92久久精品| 开心婷婷激情| 国产精品毛片一区二区三区四区| 国产福利视频在线| wwww在线观看免费视频| 最新av中文字幕| av福利在线观看| 丁香花视频在线观看| 91www在线观看| www.大网伊人| 国产嫩草在线视频| 在线一二三区| 国产乱码在线| 中文资源在线网| 国产精品午夜久久久久久| 国产二区视频在线观看| 免费在线黄色网址| 精品欧美不卡一区二区在线观看| www免费在线观看| 国产成人久久精品77777| 日韩精品免费一区二区| 国产三级视频在线看| www在线视频| 最新国产在线精品91尤物| 亚洲欧洲成人| 国产偷激情在线| av中文在线资源| 国产传媒在线播放| 99视频免费| 久久香蕉av| а√最新版地址在线天堂| 国产精品va在线观看视色| 国产理论电影在线| 成年黄网站在线观看免费| 亚洲图区欧美| 影音av资源站| 精品国产免费观看一区| 国产一区二区三区不卡免费观看 | 在线播放av网站| 中文字幕在线视频观看| 开心激情五月婷婷| 九七电影韩国女主播在线观看| 精品国产免费观看一区| 国产91在线视频蝌蚪| 国产aa视频| 在线色视频观看| 91桃色在线| 香蕉视频在线观看www| 在线三级中文| 欧美日韩视频精品一区二区| 日韩不卡高清| 免费一区二区在线观看| 久久精品视频免费看| 日本中文字幕在线2020| 国产激情在线视频| 在线观看av资源网| 日本国产在线| 国产日产一区二区| 中文字幕av高清| 麻豆网站在线| 国产传媒在线播放| 青草在线视频在线观看| 国产精品综合久久久久| 91在线视频免费看| 亚洲大香人伊一本线| 牛牛热在线视频| 国产三级在线| 男人操女人免费网站| 91av久久| av中文在线| 国产黄在线观看免费观看不卡| 日本成人a视频| 国产网红在线观看| jizz性欧美| 2019中文字幕视频| 久久91精品视频| 国产国产人免费人成免费视频| eeuss影院在线观看第一页| 国产麻豆综合视频在线观看| 亚洲欧美精选| 国产超碰97| 国产在线www| av网址在线看| 91精品专区| 国产日产一区二区三区| 成人超碰在线| 美女网站在线观看| 亚洲精品午夜级久久久久| 国产精美视频| 中文字幕日本三级| 欧美日韩亚洲国内综合网| 永久免费不卡在线观看黄网站 | 日本中文字幕在线2020| 日本黄在线观看| 永久av在线| 在线午夜影院| 一级二级三级在线观看| 国产探花在线观看| 国产一级性片| 中文字幕毛片| 国产青草视频在线观看视频| 尤物在线视频| 99视频免费| 国产天堂av| 国产高清视频在线观看| 国产区视频在线| 国产激情视频网址| 国产成人福利| 在线观看中文字幕一区| ·天天天天操| av免费在线免费| www.夜夜操.com| 黄色在线视频观看网站| 99热在线免费观看| 国产一级免费看| 国产极品视频| 人日人天天爽| √天堂中文在线| 国产盗摄一区二区| 日本欧美在线视频免费观看| 久草在线视频网| 国产黄色在线网站| 午夜性爽视频男人的天堂| 久热中文字幕在线观看| 黄网站在线观看高清免费| 国产麻豆高清视频在线第一页| 国产女主播在线| 午夜影院在线免费观看| 国产女呦网站| 2020国产在线视频| 人成在线免费视频| 天堂中文在线视频| 在线观看午夜av| 综合蜜桃精品| 日本精品一区二区三区在线播放| 国产视频2区| 欧美亚洲系列| 中文字幕av中文字幕| 在线亚洲精品自拍| 国产男女无套在线播放| 亚洲一区免费在线| 国产二区视频| 国产三级视频在线|