Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Горизонтальные полосы прокрутки в ListBox.


Автор: NiJazz 5.4.2004, 10:50
Если число строк в ListBox становится больше его высоты, то автоматически появляется скроллер. Как сделать так, чтобы горизонтальный тоже появлялся в случае надобности?

Автор: p0s0l 5.4.2004, 14:21
Это сложно. Нужно будет подменять WndProc, самому отрисовывать итемы и т.д.
Вот, например, скроллбар появится, но ничего не делает:
Код
var
 OldWndProc : pointer;

function LBWndProc (hwnd1 : HWND; uMsg : cardinal; wP : WPARAM; lP : LPARAM) : LRESULT; stdcall;
begin
 if uMsg = WM_HSCROLL then
 begin
// < скроллирование >
   Result := 0;
 end  
 else
 Result := CallWindowProc(OldWndProc, hwnd1, uMsg, wP, lP);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 with ListBox1 do
 begin
   SetScrollRange (Handle, SB_HORZ, 0, ClientWidth, False);
   EnableScrollBar (Handle, SB_BOTH, ESB_ENABLE_BOTH);
   ShowScrollBar (Handle, SB_BOTH, true);
   OldWndProc := pointer(SetWindowLong(Handle, GWL_WNDPROC, integer(@LBWndProc)));
 end;
end;

Автор: Alex 5.4.2004, 15:36
В Delphi компонент TListBox автоматически включает в себя вертикальный scrollbar. Полоска прокрутки появляется в том случае, если все элементы списка не помещаются в видимую область списка. Однако, list box не показывает горизонтального скролбара, когда ширина элементов превышает ширину списка. Конечно же существует способ добавить горизонтальную полосу прокрутки.

Добавьте следующий код в событие Вашей формы OnCreate.

Код
procedure TForm1.FormCreate(Sender: TObject);  
var  
 i, MaxWidth: integer;  
begin  
 MaxWidth := 0;  
 for i := 0 to LB1.Items.Count - 1 do  
 if MaxWidth < LB1.Canvas.TextWidth(LB1.Items.Strings[i]) then  
   MaxWidth := LB1.Canvas.TextWidth(LB1.Items.Strings[i]);  
 SendMessage(LB1.Handle, LB_SETHORIZONTALEXTENT, MaxWidth+2, 0);  
end;


Приведённый код определяет ширину в пикселях самой длинной строки списка. Затем он использует сообщение LB_SETHORIZONTALEXTENT, чтобы установить ширину горизонтального скролбара в пикселях. Два дополнительных пикселя добавленные к MaxWidth служат для стрелки в правом углу list box-а.

Автор: p0s0l 5.4.2004, 15:42
alex-co, а я замудрить опять хотел ... wink.gif


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)