Вот тебе набросок компонентика. Сейчас более продвинуто делать времени нет, но если не разберёшься сам - помогу.
| Код | unit MyListBox;
interface
uses SysUtils, Classes, Controls, StdCtrls, Dialogs, Messages, Windows, Graphics;
type TMyListBox = class(TListBox) private { Private declarations } protected { Protected declarations } procedure HScroll (var Msg : TMessage); message WM_HSCROLL; procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override; public { Public declarations } constructor Create (AOwner : TComponent); override; published { Published declarations } end;
procedure Register;
implementation
constructor TMyListBox.Create; begin inherited Create (AOwner); Self.Parent := TWinControl(AOwner); Self.Items.Add ('First'); Self.Items.Add ('Second'); Self.Items.Add ('Third'); Self.Style := lbOwnerDrawFixed; Self.Perform (LB_SETHORIZONTALEXTENT, 150, 0); end;
//Эта процедура сейчас подчистую скатана из класса-родителя TCustomListBox. Измени её под свои нужды. procedure TMyListBox.DrawItem; begin TControlCanvas(Self.Canvas).UpdateTextFlags; if Assigned(OnDrawItem) then OnDrawItem(Self, Index, Rect, State) else begin Canvas.FillRect(Rect); if Index >= 0 then Canvas.TextOut(Rect.Left + 2, Rect.Top, Items[Index]); end; end;
procedure TMyListBox.HScroll; var SBHWND : HWND; begin SBHWND := Msg.LParam; //handle скроллбара //Делаешь с этим скроллбаром что хочешь //На сколько сдвинули скроллбар - см. справку по WM_HSCROLL (Help -> Windows SDK) Msg.Result := 0; //Мы сами обрабатываем сообщение - должны вернуть ноль end;
procedure Register; begin RegisterComponents('MyGroup', [TMyListBox]); end;
end.
| Добавлено @ 03:30 Тестировать так можно, например:
| Код | procedure TForm1.Button1Click(Sender: TObject); var g : TMyListBox; begin g := TMyListBox.Create (Self); g.Left := 10; g.Top := 200; g.Width := 100; g.Height := 100; end;
| |