Конференция "WinAPI" » Не работает ScrollWindowEx
 
  • Unknown_user (30.11.10 18:32) [0]
    Посоветуйте, пожалуйста. Хочу сделать плавную прокрутку окна. Прочитал 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. Все работает отлично. В чем модет быть дело?
  • Leonid Troyanovsky © (30.11.10 21:28) [1]

    > Unknown_user   (30.11.10 18:32)  

    >    Flags := SW_SMOOTHSCROLL;
    >    Flags := Flags or (1000 shl 16);

    Что это?

    --
    Regards, LVT.
  • Unknown_user (01.12.10 01:22) [2]
    >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.
  • Unknown_user (01.12.10 01:25) [3]
    комментирование строки

    >Flags := Flags or (1000 shl 16);

    тоже не избавляет от ошибки. Если время скроллирования не задано, должно использоваться некое значение по-умолчанию. Я так думаю. Или даже нулевое значение времени, которое отменяет плавный скроллинг.
  • Leonid Troyanovsky © (01.12.10 22:58) [4]

    > 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.
  • Unknown_user (03.12.10 07:42) [5]
    Спасибо, Леонид. Только какое отношение весь этот код имеет к функции ScrollWindowEx, которую я пытаюсь заставить работать с флагом SW_SMOOTHSCROLL?

    Как вообще должна работать эта функция в указанном режиме? Может есть примеры ее использования?
  • Leonid Troyanovsky © (03.12.10 17:35) [6]

    > Unknown_user   (03.12.10 07:42) [5]

    > Спасибо, Леонид. Только какое отношение весь этот код имеет
    > к функции ScrollWindowEx, которую я пытаюсь заставить работать
    > с флагом SW_SMOOTHSCROLL?

    Я (и Питер) про то, что кроме вызова оной функции нужно еще
    немало кода, после написания которого может выясниться,
    что особой нужды в оном вызове и не было.

    --
    Regards, LVT.
  • Leonid Troyanovsky © (03.12.10 17:52) [7]

    > Unknown_user   (03.12.10 07:42) [5]

    >  Может есть примеры ее использования?

    http://msdn.microsoft.com/en-us/library/bb787531

    --
    Regards, LVT.
  • Unknown_user (03.12.10 19:52) [8]
    Меня интересует почему не работает плавная прокрутка в ScrollWindowEx. Это когда кликаешь по скроллбару и окно прокручивается на заданный шаг не моментально, а плавно, за указанное время.

    Про такую возможность сказано в хелпе http://msdn.microsoft.com/en-us/library/bb787593

    SW_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 не используется.
  • clickmaker © (24.01.11 13:39) [9]
    SW_SMOOTHSCROLL flag results that the scroll is animated, and thus requres the target window to handle WM_PRINTCLIENT. See http://msdn.microsoft.com/en-us/library/ms534913(VS.85).aspx
 
Конференция "WinAPI" » Не работает ScrollWindowEx
Есть новые Нет новых   [134431   +12][b:0][p:0.001]