Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.23;
Скачать: CL | DM;

Вниз

Скролл у наследника TCustomControl   Найти похожие ветки 

 
FrykT ©   (2005-12-17 04:35) [0]

Здравствуйте!
Пытаюсь написать компонент, наслденика TCustomControl. Отрисовка ручная, на канве. Попытался приделать скролл.
1. делал наследника TWinControl, на наго помещал мой  компонет (см. выше) и TScrollBar (Объявленный вне классов, просто выше)
2. в компоненте делал Align  alRight у Скролла.
3. Пытался сделать стандартно как-то, но показалось  глупо (не нашел признаков Скролла у  предков, разве что сообщения скролла для TWinControl).

Собсно вопрос, как прицепить скролл, и правильно ли я делал вышеописанное.


 
Наиль ©   (2005-12-20 18:08) [1]

Для начала, я думаю, стоит посмотреть на реализацию TScrollingWinControl (предок для TCustomForm).


 
FrykT ©   (2005-12-22 20:02) [2]

Спасиб за ответ, я  посмотрю


 
FrykT ©   (2005-12-24 19:32) [3]

Блин, не получается этот скролл приделать. Вот если сделать наследника TCustomControl, и послать сообщение для отображения скролла, то появляется, но изменять что-то не получилось (SetScrollinfo). Посмотрел этот  TScrollingWinControl, скроллы не смог разрулить, не отображаются никак. Помогите.


 
jack128 ©   (2005-12-25 12:43) [4]

Ну примерно вот так у меня было. +/- незначительные глюки, но в целом идея должна быть понятна..
const
 ScrollStep = 20;
 ScrollSize = 4000;

procedure TTransportSchemeDesigner.SetScrollBars(
 const Value: TScrollStyle);
begin
 if FScrollBars = Value then Exit;
 FScrollBars := Value;
 RecreateWnd;
end;

procedure TTransportSchemeDesigner.UpdateScrollBars;
var ScrollInfo : TScrollInfo;
begin
 if (ScrollBars = ssNone) or not HandleAllocated then Exit;
 ScrollInfo.cbSize := SizeOf(TScrollInfo);
 ScrollInfo.fMask := SIF_POS or SIF_RANGE or SIF_PAGE or SIF_DISABLENOSCROLL;
 ScrollInfo.nMin := 0;
 ScrollInfo.nMax := ScrollSize div ScrollStep;
 if ScrollBars in [ssBoth, ssHorizontal] then
 begin
   ScrollInfo.nPage := ClientWidth div ScrollStep;
   ScrollInfo.nPos := SchemeOrigin.X div ScrollStep;
   SetScrollInfo(Handle, SB_HORZ, ScrollInfo, True {или False});
 end;
 if ScrollBars in [ssBoth, ssVertical] then
 begin
   ScrollInfo.nPage := ClientHeight div ScrollStep;
   ScrollInfo.nPos := SchemeOrigin.Y div ScrollStep;
   SetScrollInfo(Handle, SB_VERT, ScrollInfo, True {или False});
 end;
end;

procedure TTransportSchemeDesigner.CreateWnd;
begin
 inherited;
 UpdateScrollBars
end;

procedure TTransportSchemeDesigner.WMHScroll(var Msg: TWMHScroll);
begin
 case Msg.ScrollCode of
   SB_LINELEFT: SchemeOrigin := Point(SchemeOrigin.X - ScrollStep, SchemeOrigin.Y);
   SB_LINERIGHT: SchemeOrigin := Point(SchemeOrigin.X + ScrollStep, SchemeOrigin.Y);
   SB_PAGELEFT: SchemeOrigin := Point(SchemeOrigin.X - ClientWidth, SchemeOrigin.Y);
   SB_PAGERIGHT: Point(SchemeOrigin.X + ClientWidth, SchemeOrigin.Y);
   SB_THUMBTRACK, SB_THUMBPOSITION:
     SchemeOrigin := Point(Msg.Pos * ScrollStep, SchemeOrigin.Y);
   SB_TOP: SchemeOrigin := Point(0, SchemeOrigin.Y);
   SB_BOTTOM: SchemeOrigin := Point(ScrollSize, SchemeOrigin.Y);
 end;
end;

procedure TTransportSchemeDesigner.WMVScroll(var Msg: TWMVScroll);
begin
 case Msg.ScrollCode of
   SB_LINEUP   : SchemeOrigin := Point(SchemeOrigin.X, SchemeOrigin.Y - ScrollStep);
   SB_LINEDOWN : SchemeOrigin := Point(SchemeOrigin.X, SchemeOrigin.Y + ScrollStep);
   SB_PAGEUP   : SchemeOrigin := Point(SchemeOrigin.X, SchemeOrigin.Y - ClientHeight);
   SB_PAGEDOWN : SchemeOrigin := Point(SchemeOrigin.X, SchemeOrigin.Y + ClientHeight);
   SB_THUMBPOSITION, SB_THUMBTRACK:
     SchemeOrigin := Point(SchemeOrigin.X, Msg.Pos * ScrollStep);
   SB_TOP      : SchemeOrigin := Point(SchemeOrigin.X, 0);
   SB_BOTTOM   : SchemeOrigin := Point(SchemeOrigin.X, ScrollSize);
 end;
end;

procedure TTransportSchemeDesigner.SetSchemeOrigin(Value: TPoint);
var
 Delta: TPoint;
 i: Integer;
begin
 if Value.X < 0 then Value.X := 0;
 if Value.Y < 0 then Value.Y := 0;
 if CompareMem(@FSchemeOrigin, @Value, SizeOf(Value)) then Exit;
 Delta.X := Value.X - FSchemeOrigin.X;
 Delta.Y := Value.Y - FSchemeOrigin.Y;
 FSchemeOrigin := Value;
 for i := 0 to ControlCount - 1 do
   with Controls[i] do
     SetBounds(Left - Delta.X, Top - Delta.Y, Width, Height);
 UpdateScrollBars;
end;


 
FrykT ©   (2005-12-25 20:46) [5]

jack128, а наследовал от КустомКонтрол?


 
jack128 ©   (2005-12-25 21:28) [6]

FrykT ©   (25.12.05 20:46) [5]
В данном конкретном случае - да, но мог бы и от TWinControl"a - это ничего бы не поменяло..


 
FrykT ©   (2005-12-26 02:26) [7]

Спасибо большое за пример,  ошибку понял, я не указывал ScrollInfo.fMask. Теперь всё в порядке


 
Rouse_ ©   (2005-12-30 14:20) [8]

Мммм, здается мне что раздувание кода из за реализации только скрола не самая удачная идея. Гораздо проще создать сам скрол и назначить ему предка. Обрабатывать уже его методы. А то какойто очередной велосипед получается...


 
FrykT ©   (2005-12-31 16:47) [9]

2 Rouse_
Я уже всё перепробывал)) Создавал отдельно экземляр TScrollBar внутри класса, и делал ему Align := alRight. Область прорисовки назначал AdjustClientRect (или както так). При частой перерисовке, скролл мерцает очень сильно.



Страницы: 1 вся ветка

Текущий архив: 2006.07.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.032 c
10-1122607111
just
2005-07-29 07:18
2006.07.23
CreateComObject в Builder C++


1-1149538626
Valera
2006-06-06 00:17
2006.07.23
Проблема с вызовом DLL на C из программы на Delphi


8-1139224538
Sco
2006-02-06 14:15
2006.07.23
Intel Jpeg Library


15-1150505780
ВиндосМЕ
2006-06-17 04:56
2006.07.23
Майкрософт прекращает поддержку Windows XP Service Pack 1


2-1151946511
Александра
2006-07-03 21:08
2006.07.23
FreeLibrary