Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как перерисовать ListBox, при горизонтальном, скроллинге? 
:(
    Опции темы
ДЫМ
Дата 21.12.2004, 02:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 6.1.2004

Репутация: 8
Всего: 8



Как перерисовать ListBox, при горизонтальном скроллинге?


На форме есть ListBox со свойством Style=lbOwnerDrawFixed

вот прорисовка элементов

Код

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
 Rect: TRect; State: TOwnerDrawState);
// определяем максимальную ширину списка
function fcMaxWidth:Integer;
var i:Integer;
 begin
 Result := 0;
 for i := 0 to ListBox1.Items.Count - 1 do
 if Result < ListBox1.Canvas.TextWidth(ListBox1.Items[i])+2 then
   Result := ListBox1.Canvas.TextWidth(ListBox1.Items[i])+2;
  end;

begin
With ListBox1.Canvas do
 begin
  SendMessage((Control as TListBox).Handle, LB_SETHORIZONTALEXTENT, fcMaxWidth, 0);
 
  FillRect(Rect);

  // здесь выводим текст с обрезанием по правому краю (три точки в
  // конце, если текст не помещается)

  DrawTextEx(Handle, PChar((Control as TListBox).Items[Index]),
  Length(ListBox1.Items[Index]), Rect, DT_WORD_ELLIPSIS, nil);

 end;
end;


И все вроде нормально, но стоит прокрутить горизонтальный ScrollBar (вертикальный работает как надо) вправо ,то список не обновляется, вместо текста появляются какие-то куски.

Как бы отловить событие, возникающее при горизонтальной прокрутке, тогда туда можно запихнуть метод Refresh.







PM MAIL WWW   Вверх
dm9
Дата 21.12.2004, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



WM_HSCROLL ???
PM MAIL ICQ   Вверх
ДЫМ
Дата 22.12.2004, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 6.1.2004

Репутация: 8
Всего: 8



Цитата

WM_HSCROLL ???


А поподробнее можно?
PM MAIL WWW   Вверх
dm9
Дата 22.12.2004, 03:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Вот тебе набросок компонентика. Сейчас более продвинуто делать времени нет, но если не разберёшься сам - помогу.

Код

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;


Это сообщение отредактировал(а) dm9 - 22.12.2004, 03:32
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0491 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.