亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

發掘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算法的實現

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

新聞熱點

疑難解答

圖片精選

網友關注

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
美女久久久久久久久久久| 午夜精品一区二区三区在线| 尤物九九久久国产精品的特点| 欧美在线观看日本一区| 亚洲日本欧美日韩高观看| 伊人青青综合网站| 国产男女猛烈无遮挡91| 日韩精品中文字幕有码专区| 在线一区二区日韩| 久久久这里只有精品视频| 大伊人狠狠躁夜夜躁av一区| 青草青草久热精品视频在线观看| 国产精品欧美在线| 精品国产依人香蕉在线精品| 亚洲石原莉奈一区二区在线观看| 国产成人av在线播放| 欧美专区福利在线| 亚洲自拍偷拍区| 亚洲欧洲日韩国产| 91牛牛免费视频| 欧美性jizz18性欧美| 国产精品久久久久久久久久免费| 久久久久久中文字幕| 欧美尤物巨大精品爽| 欧美孕妇毛茸茸xxxx| 免费99精品国产自在在线| 欧美性猛交xxxx久久久| 亚洲综合精品伊人久久| 日韩免费观看高清| 另类图片亚洲另类| 国产69久久精品成人看| 久久精品中文字幕| 精品视频在线播放色网色视频| 国产精品视频一区国模私拍| 91丨九色丨国产在线| 国产精品视频99| 亚洲综合色激情五月| 亚洲的天堂在线中文字幕| 91成人免费观看网站| 日韩中文字幕网站| 国产aⅴ夜夜欢一区二区三区| 中文字幕欧美日韩va免费视频| 欧美老妇交乱视频| 日韩中文字幕国产| 2018国产精品视频| 欧美成年人视频| 亚洲欧美三级在线| 2019精品视频| 96精品久久久久中文字幕| 欧美成人免费在线观看| 国外成人免费在线播放| 亚洲另类图片色| 欧美理论片在线观看| 91精品视频免费看| 中文日韩在线观看| 91在线视频成人| 日韩电影中文字幕在线| www.久久草.com| 91欧美精品成人综合在线观看| 日本亚洲欧洲色α| 亚洲第一页在线| 精品一区二区三区电影| 国产日本欧美一区二区三区| 91免费国产视频| 欧美日韩国产成人| 九色精品免费永久在线| 国产精品h在线观看| 精品国产欧美一区二区三区成人| 国产成人精品最新| 亚洲成人性视频| 国产自产女人91一区在线观看| 欧美成人精品三级在线观看| 国产精品入口夜色视频大尺度| 日韩欧美亚洲成人| 亚洲一区亚洲二区亚洲三区| 在线观看日韩专区| 欧美激情一区二区三级高清视频| 国产极品jizzhd欧美| 国内精品视频一区| 成人免费视频网址| 精品国产一区二区三区久久狼5月| 国产91精品视频在线观看| 奇米一区二区三区四区久久| 亚洲在线视频观看| 日韩乱码在线视频| 岛国视频午夜一区免费在线观看| 亚洲视频日韩精品| 中文字幕亚洲第一| 国产精品国产三级国产专播精品人| 国产成人拍精品视频午夜网站| 88国产精品欧美一区二区三区| 国产精品日韩一区| 91性高湖久久久久久久久_久久99| 欧美在线免费看| 国产精品高清在线观看| 日韩电影在线观看中文字幕| 欧美电影在线观看| 日韩中文字幕精品视频| 成人有码视频在线播放| 美女国内精品自产拍在线播放| 国产精品吴梦梦| 青青a在线精品免费观看| 97在线看免费观看视频在线观看| 久久国产精品久久久久| 永久免费精品影视网站| 在线成人一区二区| 最近更新的2019中文字幕| 中文字幕av一区中文字幕天堂| 欧美日韩国产中文精品字幕自在自线| 久久精品欧美视频| 久久精品91久久香蕉加勒比| 欧美另类极品videosbestfree| 精品亚洲夜色av98在线观看| 国产亚洲精品久久久优势| 亚洲国产中文字幕在线观看| 色伦专区97中文字幕| 91精品成人久久| 1769国产精品| 欧美体内谢she精2性欧美| 亚洲午夜未删减在线观看| 久久视频在线视频| 亚洲成人网在线观看| 国产91精品久久久| 国产精品极品美女粉嫩高清在线| 欧美日韩另类字幕中文| 国产精品日韩在线| 在线精品国产欧美| 中文字幕亚洲精品| 国产精品免费看久久久香蕉| 久久青草福利网站| 国产精品第8页| www日韩欧美| 国产精品久久久久久久久久东京| 国产va免费精品高清在线| 亚洲天堂网在线观看| 久久久www成人免费精品张筱雨| 日韩av在线影视| 精品国产鲁一鲁一区二区张丽| 久久夜色精品国产| 97在线视频免费| 国产精品视频不卡| 欧美激情欧美狂野欧美精品| **欧美日韩vr在线| 免费av在线一区| 91精品国产综合久久男男| 午夜精品99久久免费| 亚洲成人黄色在线| 日韩国产欧美精品一区二区三区| 不卡av在线网站| 亚洲**2019国产| 国产精品久久久久av免费| 国产欧美精品va在线观看| 色妞在线综合亚洲欧美| 91亚洲永久免费精品| 久久97久久97精品免视看| 国产精品久久久久久久久久三级| 日韩成人在线电影网| 夜夜嗨av一区二区三区免费区| 北条麻妃在线一区二区| 欧美高清videos高潮hd| 欧美午夜精品在线| 亚洲精品一区二三区不卡| 欧美日韩999| 欧美激情一级欧美精品|