-
Посоветуйте, пожалуйста. Хочу сделать плавную прокрутку окна. Прочитал MSDN, где пишут про флаг SW_SMOOTHSCROLL. Написал следующий код.
Flags := SW_SMOOTHSCROLL;
Flags := Flags or (1000 shl 16);
Res := ScrollWindowEx(Handle,0,VShift,nil,nil,0,@UpdateRect,Flags);
Однако скроллинга окна не происходит и функция возвращает False. В переменную UpdateRect записывается мусор. Если убрать SW_SMOOTHSCROLL. Все работает отлично. В чем модет быть дело?
-
> Unknown_user (30.11.10 18:32)
> Flags := SW_SMOOTHSCROLL; > Flags := Flags or (1000 shl 16);
Что это?
-- Regards, LVT.
-
>Flags := SW_SMOOTHSCROLL;
включаем плавное скроллирование
>Flags := Flags or (1000 shl 16);
записываем в старшие 2 байта диапазон скроллирования 1000 мс. Следовал справке, не обессудьте :)
>Scrolls using smooth scrolling. Use the HIWORD portion of the flags parameter to indicate how much time, in milliseconds, the smooth-scrolling operation should take.
-
комментирование строки
>Flags := Flags or (1000 shl 16);
тоже не избавляет от ошибки. Если время скроллирования не задано, должно использоваться некое значение по-умолчанию. Я так думаю. Или даже нулевое значение времени, которое отменяет плавный скроллинг.
-
> Unknown_user (01.12.10 01:22) [2]
Надо начинать с простейших способов ловли:
In article <7u79dd$gss15@forums.borland.com>, Sarana Tasanasant wrote: > But I need more a little bit advance, so, If in Form, I have an image, how > can I display scroll text by use transparent mode ? >
This does not work using the mechanism i posted (ScrollWindow) since you probably want only the *text* to scroll, not the bitmap. The only way to achieve this is to paint the *complete* area occupied by the scrolling text, background and all, to an offscreen bitmap first and then paint that bitmap in toto onto the form. Here is an example, see form resource at end of message. I cut the bitmap data to conserve space, load the skyline.bmp into the image1 before you try to compile the example. The code assumes that image1 is located at (0,0) in the form.
unit ScrollTextUnit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls;
type TForm1 = class(TForm) Panel1: TPanel; StartButton: TButton; StopButton: TButton; Image1: TImage; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure StartButtonClick(Sender: TObject); procedure StopButtonClick(Sender: TObject); procedure FormPaint(Sender: TObject); private { Private declarations } FScrollText: String; FDisplay: TBitmap; FScrollStart: Integer; public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject); var temp: TStringlist; begin image1.hide; Brush.Style := bsClear; temp := TStringList.Create; try temp.LoadFromfile( ExtractFilePath( ParamStr(0) )+ 'scrolltextunit1.pas' ); FScrollText := temp.Text; finally temp.free; end; FDisplay := TBitmap.Create; FDisplay.Width := image1.clientwidth; FDisplay.Height:= image1.clientHeight; FScrollStart := image1.clientheight - 10; end;
procedure TForm1.Timer1Timer(Sender: TObject); var r: TRect; begin Dec( FScrollStart ); r:= image1.BoundsRect; InvalidateRect( handle, @r, false ); end;
procedure TForm1.StartButtonClick(Sender: TObject); begin timer1.enabled := true; end;
procedure TForm1.StopButtonClick(Sender: TObject); begin timer1.enabled := false; end;
procedure TForm1.FormPaint(Sender: TObject); var r: TRect; begin if not timer1.enabled then Canvas.Draw( 0, 0, image1.picture.bitmap ) else begin timer1.enabled := false; FDisplay.Canvas.Draw( 0, 0, image1.Picture.Bitmap ); r:= Rect( 10, FScrollStart, image1.width - 10, image1.height - 10 ); FDisplay.Canvas.Font := Font; FDisplay.Canvas.Font.Color := clYellow; SetBKMode( FDisplay.Canvas.Handle, TRANSPARENT ); DrawText( FDisplay.Canvas.Handle, PChar( FScrollText ), Length( FScrollText ), r, DT_LEFT or DT_NOPREFIX ); Canvas.Draw( 0, 0, FDisplay ); timer1.enabled := true; end; end;
end.
object Form1: TForm1 Left = 249 Top = 133 AutoScroll = False Caption = 'Form1' ClientHeight = 222 ClientWidth = 240 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -13 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate OnPaint = FormPaint PixelsPerInch = 120 TextHeight = 16 object Image1: TImage Left = 0 Top = 0 Width = 240 Height = 181 Align = alClient end object Panel1: TPanel Left = 0 Top = 181 Width = 240 Height = 41 Align = alBottom TabOrder = 0 object StartButton: TButton Left = 8 Top = 8 Width = 75 Height = 25 Caption = 'Start' TabOrder = 0 OnClick = StartButtonClick end object StopButton: TButton Left = 88 Top = 8 Width = 75 Height = 25 Caption = 'Stop' TabOrder = 1 OnClick = StopButtonClick end end object Timer1: TTimer Enabled = False Interval = 10 OnTimer = Timer1Timer Left = 180 Top = 185 end end Peter Below (TeamB) 100113.1101@compuserve.com)
-- Regards, LVT.
-
Спасибо, Леонид. Только какое отношение весь этот код имеет к функции ScrollWindowEx, которую я пытаюсь заставить работать с флагом SW_SMOOTHSCROLL?
Как вообще должна работать эта функция в указанном режиме? Может есть примеры ее использования?
-
> Unknown_user (03.12.10 07:42) [5]
> Спасибо, Леонид. Только какое отношение весь этот код имеет > к функции ScrollWindowEx, которую я пытаюсь заставить работать > с флагом SW_SMOOTHSCROLL?
Я (и Питер) про то, что кроме вызова оной функции нужно еще немало кода, после написания которого может выясниться, что особой нужды в оном вызове и не было.
-- Regards, LVT.
-
-
Меня интересует почему не работает плавная прокрутка в ScrollWindowEx. Это когда кликаешь по скроллбару и окно прокручивается на заданный шаг не моментально, а плавно, за указанное время. Про такую возможность сказано в хелпе http://msdn.microsoft.com/en-us/library/bb787593SW_SMOOTHSCROLL
Windows 98/Me, Windows 2000/XP: Scrolls using smooth scrolling. Use the HIWORD portion of the flags parameter to indicate how much time, in milliseconds, the smooth-scrolling operation should take.И у меня не получается заставить ScrollWindowEx работать с этим флагом (функция возвращает False). Вот и все, что меня интересует. Как организовать работу скроллбаров я знаю. Просто хочется чтобы прокрутка была плавной. И не понимаю почему не работает, описанная в справке возможность. P.S. В приведенном выше примере флаг SW_SMOOTHSCROLL не используется.
-
|