Конференция "KOL" » Титры
 
  • Vladimir Kladov © (14.02.12 21:38) [20]
    Список демок смотрели?
  • Крош (14.02.12 22:01) [21]
    Спасибо, Smooth scrolling on paint box using thread.
    Буду изучать.
  • RusSun © (16.02.12 20:32) [22]
    program Project1;

    uses
     windows,messages,
     kol;
    type  TOnEvent = procedure( Sender: PObj )of object;
           TOnThreadExecute = function(Sender:PThread): Integer of object;
            TObjectMethod = procedure of object;

    {$R *.res}
    var
    form,PBox,Pan,
    EB1,B1,B2,L1,
    Use_Scroll,Half_pixel:PControl;

    Thread1:PThread;

    OffsetX: Integer;
    //LastTik: DWORD;
    Bmp, Bmp2: PBitmap;

    TextToScroll: String = 'Sample smooth scrolling text';
       Period: DWORD = 16; // better values = N * (1000 / VSync_in_Hertz)
       useScroll: Boolean = TRUE;
       halfPixel: Boolean = TRUE;
       step: Integer;

    //область для процедур
    procedure PBoxPaint(dummy:pointer;Sender: PControl; DC: HDC);
    var R: TRect;
       Big, B: PBitmap;
       h: Integer;
    begin
       if  (Bmp <> nil)
       and (Bmp.Width <> PBox.Width)
       and (Bmp.Height <> PBox.Height) then
           Free_And_Nil( Bmp );
       if  Bmp = nil then
       begin
           Bmp := NewBitmap( PBox.Width, PBox.Height );
           Bmp.Canvas.Brush.Color := clWindow;
           Bmp.Canvas.Font.Assign( PBox.Font );
           Bmp.Canvas.Font.FontQuality := fqAntialiased;
           h := Bmp.Canvas.TextHeight(TextToScroll);
           Bmp.Canvas.TextRect( Bmp.BoundsRect, 0, (Bmp.Height - h) div 2,
               TextToScroll );
           //Bmp.SaveToFile( GetStartDir + 'bmp.bmp' );

           Big := NewDibBitmap( Bmp.Width*2, Bmp.Height, pf32bit );
           Big.Canvas.Brush.Color := clWindow;
           Big.Canvas.FillRect( Big.BoundsRect );
           SetStretchBltMode( Big.Canvas.Handle, halftone );
           Bmp.StretchDraw( Big.Canvas.Handle, MakeRect( 1, 0, Big.Width+1, Big.Height ) );

           Bmp2 := NewDibBitmap( Bmp.Width, Bmp.Height, pf32bit );
           SetStretchBltMode( Bmp2.Canvas.Handle, halftone );
           Big.StretchDraw( Bmp2.Canvas.Handle, Bmp2.BoundsRect );
           //Bmp2.SaveToFile( GetStartDir + 'bmp2.bmp' );
           Big.Free;
       end;

       if  step and 1 = 1 then
           B := Bmp
       else
           B := Bmp2;
       R := PBox.ClientRect;
      //  OffsetRect( R, -OffsetX,0  );
       OffsetRect( R, 0, -OffsetX);
       B.Draw( Sender.Canvas.Handle, R.Left, R.Top );
       // OffsetRect( R, PBox.Width, 0  );
       OffsetRect( R,  0, PBox.Height );
       B.Draw( Sender.Canvas.Handle, R.Left, R.Top );

       if  Thread1.Suspended then
           Thread1.Resume;
    end;
    procedure FormDestroy(dummy:pointer;Sender: PObj);
    begin
       Free_And_Nil( Bmp );
       Free_And_Nil( Bmp2 );
    end;

    procedure EB1Change(dummy:pointer;Sender: PObj);
    var n: Integer;
    begin
       n := Str2Int( EB1.Text );
       if  n > 0 then
           Period := n;
    end;

    procedure B1Click(dummy:pointer;Sender: PObj;var mouse:TMouseEventData);
    var n: Integer;
    begin
       n := Str2Int( EB1.Text ) - 1;
       if  n > 0 then
           EB1.Text := Int2Str( n );
    end;

    procedure B2Click(dummy:pointer;Sender: PObj;var mouse:TMouseEventData);
    var n: Integer;
    begin
       n := Str2Int( EB1.Text ) + 1;
       if  n > 0 then
           EB1.Text := Int2Str( n );
    end;

    function PBoxMessage(dummy:pointer;var Msg: tagMSG;
     var Rslt: Integer): Boolean;
    begin
       Result := FALSE;
       if  Msg.message = WM_ERASEBKGND then
       begin
           Result := TRUE;
           Rslt := 1;
       end;
    end;

    {procedure TForm1.KOLForm1FormCreate(Sender: PObj);
    begin
       //SetThreadPriority( GetCurrentThread, THREAD_PRIORITY_ABOVE_NORMAL );
    end; }


    procedure Use_ScrollClick(dummy:pointer;Sender: PObj);
    begin
       useScroll := Use_Scroll.Checked;
    end;

    function Thread1Execute(dummy:pointer;Sender: PThread): Integer;
    begin
       step := 0;
       while not AppletTerminated do
       begin
           inc( step );
           if  (step and 1 = 0) or not halfPixel then
           begin
               inc( OffsetX );
               if  OffsetX >= PBox.Height then   // PBox.Width
                   OffsetX := 0;
           end;
           if  useScroll
           and (not halfPixel
               or halfPixel and (step and 1 = 0)) then
           begin
               ScrollWindow( PBox.Handle, 0,-1 , nil, nil );
           end
             else
           begin
               PBox.Invalidate;
           end;
           PBox.Update;
           Sleep( Period );

       end;
       Result := 0;
    end;

    procedure PBoxResize(dummy:pointer;Sender: PObj);
    begin
       PBox.Invalidate;
       PBox.Update;
    end;

    procedure Half_pixelClick(dummy:pointer;Sender: PObj);
    begin
       halfPixel := Half_pixel.Checked;
    end;

    Begin
    form:=NewForm(Applet,'Form1').SetClientSize( 431, 71 ).setposition(330,300);
    form.Font.FontHeight := 16;
    form.Font.FontName := 'Arial';
    PBox := NewPaintBox( Form ).SetAlign ( caClient );
    {$IFDEF UNICODE_CTRLS}
    PBox.SetUnicode(TRUE);
    {$ENDIF UNICODE_CTRLS}  //for win7
    PBox.Font.FontStyle := [ fsBold ];
    Pan := NewPanel(Form, esRaised ).SetAlign ( caBottom ).SetSize( 0, 33 );

    {$IFDEF UNICODE_CTRLS}
    Panel1.SetUnicode(TRUE);
    {$ENDIF UNICODE_CTRLS}

    L1 := NewLabel( Pan, 'Period: ' ).SetAlign ( caLeft ).AutoSize( TRUE );

    {$IFDEF UNICODE_CTRLS}
    L1.SetUnicode(TRUE);
    {$ENDIF UNICODE_CTRLS}

    L1.VerticalAlign := KOL.vaCenter;

    EB1 := NewEditBox( Pan, [  ] ).SetAlign ( caLeft ).SetSize( 108, 0 );
    {$IFNDEF UNICODE_CTRLS}EB1.SetUnicode( TRUE );{$ENDIF}
    EB1.Text := '16';
    EB1.Color := TColor(clWindow);  // Цвет окна
    B1 := NewButton( Pan, '<' ).SetAlign ( caLeft ).SetSize( 30, 0 );
    {$IFDEF UNICODE_CTRLS}
    B1.SetUnicode(TRUE);
    {$ENDIF UNICODE_CTRLS}

    B2 := NewButton(Pan, '>' ).SetAlign ( caLeft ).SetSize( 30, 0 );
    {$IFDEF UNICODE_CTRLS}
    B2.SetUnicode(TRUE);
    {$ENDIF UNICODE_CTRLS}

    Use_Scroll := NewCheckBox( Pan, 'Use Scroll' ).SetAlign ( caLeft ).AutoSize( TRUE );
    {$IFDEF UNICODE_CTRLS}
    Use_Scroll.SetUnicode(TRUE);
    {$ENDIF UNICODE_CTRLS}
    Use_Scroll.Checked := TRUE;
       // Result.Half_pixel.TabOrder = 4
    Half_pixel := NewCheckBox( Pan, '1/2 pixel' ).SetAlign ( caLeft );

    {$IFDEF UNICODE_CTRLS}
    Half_pixel.SetUnicode(TRUE);
    {$ENDIF UNICODE_CTRLS}
    Half_pixel.Checked := TRUE;

    //.centeronparent.Tabulate;
    //область для работы
    form.OnDestroy:=TOnEvent(MakeMethod(nil,@FormDestroy));
    Thread1:= NewThreadEx(TOnThreadExecute(MakeMethod(nil,@Thread1Execute)));
    Thread1.Resume;

    EB1.OnChange :=TOnEvent(MakeMethod(nil,@EB1Change));
    B1.OnClick :=TOnEvent(MakeMethod(nil,@B1Click));
    B2.OnClick :=TOnEvent(MakeMethod(nil,@B2Click));
    PBox.OnMessage :=TOnMessage(MakeMethod(nil,@PBoxMessage));
    PBox.OnPaint :=TOnPaint(MakeMethod(nil,@PBoxPaint));
    PBox.OnResize :=TOnEvent(MakeMethod(nil,@PBoxResize));
    Half_pixel.OnClick :=TOnEvent(MakeMethod(nil,@Half_pixelClick));
    Use_Scroll.OnClick :=TOnEvent(MakeMethod(nil,@Use_ScrollClick));
    Run(form);
    end.

  • RusSun © (16.02.12 20:59) [23]
    НЕ
    Panel1.SetUnicode(TRUE);

    -опечатка, а
    Pan.SetUnicode(TRUE);

  • rdnks (18.02.12 18:50) [24]
    http://narod.ru/disk/41126662001/
    ddd.7z.html

    Пример здоровый из-за zlib и grush, так как просто из проекта выдернул.
  • rdnks (18.02.12 18:50) [24]
    http://narod.ru/disk/41126662001/
    ddd.7z.html

    Пример здоровый из-за zlib и grush, так как просто из проекта выдернул.
  • rdnks (18.02.12 18:50) [24]
    http://narod.ru/disk/41126662001/
    ddd.7z.html

    Пример здоровый из-за zlib и grush, так как просто из проекта выдернул.
  • rednakse © (22.09.12 13:36) [27]
    2 RusSun стоит убедится что модуль uFMOD совместим с редакцией Delphi, указатели в параметрах, которые передаются в функции not nil =)

    Вот страница на sourceforge. Была полная документация, вроде как даже русская.
    http://ufmod.sourceforge.net/
 
Конференция "KOL" » Титры
Есть новые Нет новых   [118455   +50][b:0][p:0.005]