Page 1 of 6 1 2 3 ... LastLast
Results 1 to 15 of 89

Thread: Winapi.GdipApi, Winapi.GdipObj,

  1. #1

    Winapi.GdipApi, Winapi.GdipObj,

    Hoi mede programmeurs,

    Deze procedure roep ik aan in een TIMER en dat werkt perfect. Let niet op de Function. Dat moet gewoon Procedure zijn.
    Goed zover prima met gebruik TGPGraphics en Create handle. Werkt super.

    Nu zou ik graag de TGPGraphics Create in Form.OnCreate willen en bij Form.OnDestroy. Logisch?
    Probreem is dat de Clock maar eenmaal getekend wordt.
    Is dit een denkfout en moet dit gewoon zo?
    Zie vaak bij OnPaint ook bij voorbeelden die zo gaan.
    Hoe kan ik dat anders schrijven, dus mis ik iets met de GdipApi?
    Is daar een aanroep voor.

    Bedankt alvast.


    Code:
    function TfrmClockAnalog.DrawGlyph(Handle: HWND; X, Y: Integer): Integer;
    var
      FGraphics: TGPGraphics;
    
      procedure PaintElements;
      var
        Hour, Minute, Second, MSec: Word;
        State: GraphicsState;
        Dx, Dy, Ox, Oy: Single;
        AngleS, AngleM, AngleH: Single;
      begin
        DecodeTime(Now, Hour, Minute, Second, MSec);
    
        AngleS := Second * 6;
        AngleM := Minute * 6 + AngleS / 60;
        AngleH := Hour * 30 + AngleM / 12;
    
        // 211 Width
        Dx := ClockImage.Width / 2 - 1;
        Dy := ClockImage.Height / 2 - 1;
        Ox := -6; // -13 div 2
        Oy := -79; // -159 div 2
    
        with FGraphics do
        begin
          State := Save();
    
          TranslateTransform(Dx, Dy);
    
          RotateTransform(AngleH);
          DrawImage(FHour, Ox, Oy, 13, 159);
          RotateTransform(-AngleH);
    
          RotateTransform(AngleM);
          DrawImage(FMinute, Ox, Oy, 13, 159);
          RotateTransform(-AngleM);
    
          RotateTransform(AngleS);
          DrawImage(FSecond, Ox, Oy, 13, 159);
          RotateTransform(-AngleS);
    
          DrawImage(FDot, Ox, Oy, 13, 159);
    
          Restore(State);
        end;
      end;
    
      // Je moet elke keer Create gebruiken anders werkt het niet. Clock wordt niet geupdated.
      // Create voor Handle bij OnCreate werkt ook niet want er zijn schijnbaar geen Handles geldig.
    
    begin
      ClockImage.Canvas.Lock;
      try
        FGraphics := TGPGraphics.Create(Handle);
        try
          FGraphics.Clear($00000000);
          FGraphics.SetSmoothingMode(SmoothingModeHighQuality);
          FGraphics.DrawImage(FOverlay, X, Y, 211, 211);
          FGraphics.DrawImage(FBackground, X, Y, 211, 211);
          PaintElements;
    
        finally
          FGraphics.Free;
        end;
      finally
        ClockImage.Canvas.Unlock;
        ClockImage.Invalidate;
      end;
    end;

  2. #2
    Zou je misschien het projectje in een zip kunnen proppen en er bij zetten?
    Dan probeer ik het zelf ook even te draaien.

    En welke Delphi gebruik je?

  3. #3
    Delphi 10.2

  4. #4
    Kan de images niet sturen
    Te groot dan.

  5. #5

  6. #6
    Oops ik spreek voor mijn beurt.

  7. #7
    Waarom? Heb je gezien?

  8. #8
    Ik dacht dat het allemaal werkte tot ik nog een keer de vraag las en toen eindelijk door had wat het probleem was

  9. #9
    Het werkt wel maar met Create en Free in de timer. Niet op een andere manier. Iemand?

  10. #10
    Hoop iemand het weet. Is Toch GDI+ iets met tekenen tweemaal

  11. #11
    Goed ik weet inmiddels iets meer maar nog geen oplossing voor je gevonden.
    Ik weet wel waarom het niet werkt als je TGPGraphics maar 1x maakt en die herbruikt.

    Ik heb in je timerevent de volgende regel toegevoegd:
    Click image for larger version. 

Name:	Naamloos.png 
Views:	91 
Size:	5.4 KB 
ID:	7902

    En heb even een gifje gemaakt (helaas is ie erg traag)


    Dus de handle van het canvas wijzigt steeds, als je dan blijft tekenen op met de oude handle dan doet het niets

  12. #12
    Dank voor het uitzoeken. Wat betreft die Handle daar had ik helemaal niet bij stilgestaan.
    Ik ga eens verder kijken.
    Het werkt nu wel goed met dus Create en Free.

    Dit is trouwens de originele source maar werkt direct op de Desktop. Ik heb dus wat moeten schuiven. Daar werkt het wel met Create globaal. Maar snap er niets van
    http://www.shenturk.com/delphi/delphi-ile-analog-clock
    Last edited by DragonFly; 23-Mar-19 at 12:18.

  13. #13
    Zelfde probleem (zonder oplossing).
    https://stackoverflow.com/questions/...as-tgpgraphics

    Ten eerste moet je volgens mij nooit die ClockImage.Canvas.Handle gebruiken. Die is iedere keer anders. Beter zou het zijn om de ClockImage.Bitmap.Canvas.Handle te gebruiken. die blijft n.l. hetzelfde zolang je de breedte en hoogte niet aanpast.

    Tweede probleem is dat de ClockImage.Bitmap.Canvas in de FormCreate nog geen handle heeft. Je zou dan in de Draw eenmalig de FGraphics aan kunnen maken want op dat moment is de Handle wel bekend.

    En in het originele voorbeeld gebruiken ze een TGPBitmap en kennen de HBITMAP daarvan toe aan Picture.Bitmap.Handle.

    (heb nu geen tijd om het werkend te krijgen maar volgens mij zou het dan wel moeten lukken)

  14. #14
    Bedankt tot zover...

    ClockImage.Bitmap.Canvas.Handle werkt niet want Bitmap is niet public. Bij help zie ik dat wel met FMX. Die gebruik ik dus niet.
    http://docwiki.embarcadero.com/Libra....TImage.Bitmap
    Deze pakt ook niet: ClockImage.Picture.Bitmap.Canvas.Handle

    Probleem Handle bij OnCreate is bekend. Daar kwam ik ook pas na een dag achter
    Ja en het schuiven wat ik doe komt steeds uit op wat ik al heb. Via Google kom je veel Create/Free voorbeelden tegen.
    Trouwens TPaintBox gaat ook niet. Verschijnt een keer en dan blank.

    Afwachten maar.

  15. #15
    Je zou een hack class kunnen maken.
    Zelf een afstammeling maken van het image component en daar een GetBitmapHandle toevoegen, die afstammeling kan er dan wel bij namelijk.

Page 1 of 6 1 2 3 ... LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •