AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Warum werden Regionen in meinem Programm nicht gezeichnet!

Warum werden Regionen in meinem Programm nicht gezeichnet!

Ein Thema von DualCoreCpu · begonnen am 5. Feb 2018 · letzter Beitrag vom 31. Aug 2019
Antwort Antwort
DualCoreCpu
(Gast)

n/a Beiträge
 
#1

Warum werden Regionen in meinem Programm nicht gezeichnet!

  Alt 5. Feb 2018, 20:30
Hallo,
ich beschäftige mich gerade mit dem Windows API. Dazu arbeite ich mir nicht nur Luckies Tutorial durch, sondern auch das Buch "Programming Windows Fifth Edition" von Charles Petzold, Verlag Microsoft Press.

Aus dem Buch habe ich das folgende Programm nach Pascal übertragen, von Seite 205ff des letzgenannten Buches.

Nun werden die erzeugten Regionen aber nicht gezeichnet. Ich verstehe leider nicht, warum?

Das Erzeugen eines Stiftes ist im Originalprogramm aus dem Buch nicht enthalten. So dachte ich zuerst, im Buch sei das weggelassen worden, weil es klar ist, daß ich zum Zeichnen einen Stift brauche (wie auf einem Blatt Papier) und so diesen Teil selber zum Programm hinzufügen müsse. Aber auch mit dem Stift bleibt der Fensterhintergrund weiß.

Hier ist das in Pascal transferierte Programm:

Delphi-Quellcode:
program region;

{$APPTYPE GUI}

uses
  SysUtils,
  Windows,
  Messages;

var
  wnd: HWND;
  msg: TMsg;
  wndclass: TWndClass;
  szAppName: PAnsiChar = 'Clover';

//Die Funktion hypot wird im C Originalprogramm verwendet. Die erzeugt die
//Hypotenuse von zwei gegebenen Dreiecksseiten. Habe ich von dieser Erklärung
//her zumindest so verstanden:
//C++ Reference:
[URL="http://www.cplusplus.com/reference/cmath/hypot/"]http://www.cplusplus.com/reference/cmath/hypot/[/URL]

function hypot(a,b: double): double;
var h: double;
begin
  h := sqr(a) + sqr(b);
  Result := sqrt(h);
end;

function WndProc(wnd: HWND; msg: UINT; w: WPARAM; l: LPARAM): LRESULT; stdcall;
var
  hrgnClip: HRGN;
  cxClient: Integer;
  cyClient: Integer;
  fAngle,fRadius: double;
  cursor: HCURSOR;
  dc: HDC;
  hrgnTemp: array[0..6] of HRGN;
  i: Integer;
  ps: TPaintStruct;
  pen,penold: HPEN;
begin
  case msg of
    WM_SIZE:
      begin
        cxClient := LOWORD(l);
        cyClient := HIWORD(l);
        cursor := SetCursor(LoadCursor(0, IDC_WAIT));
        ShowCursor(true);

        if hRgnClip <> 0 then DeleteObject(hRgnClip);

        hRgnTemp[0] := CreateEllipticRgn(0, cyClient div 3, cxClient div 2, 2*cyClient div 3);
        hrgnTemp[1] := CreateEllipticRgn(cxClient div 2, cyClient div 3, cxClient, 2*cyClient div 3);
        hrgnTemp[2] := CreateEllipticRgn(cxClient div 3, 0, 2*cxClient div 3, cyClient div 2);
        hrgnTemp[3] := CreateEllipticRgn(cxClient div 3, cyClient div 2, 2*cxClient div 3, cyClient);
        hrgnTemp[4] := CreateRectRgn(0,0,1,1);
        hrgnTemp[5] := CreateRectRgn(0,0,1,1);
        hRgnClip := CreateRectRgn(0,0,1,1);

        CombineRgn(hRgnTemp[4], hRgnTemp[0], hRgnTemp[1], RGN_OR);
        CombineRgn(hRgnTemp[5],hRgnTemp[2],hRgnTemp[3], RGN_OR);
        CombineRgn(hRgnClip, hRgnTemp[4], hRgnTemp[5], RGN_XOR);
        for i:=0 to 5 do DeleteObject(hRgnTemp[i]);
        SetCursor(cursor);
        ShowCursor(false);
      end;
    WM_PAINT:
      begin
        dc := BeginPaint(wnd, ps);

        SetViewPortOrgEx(dc, cxClient div 2, cyClient div 2, nil);
        SelectClipRgn(dc, hRgnClip);

        fRadius := hypot(cxClient / 2.0, cyClient / 2.0);

        //Hatte zuerst gedacht, ich brauchte einen Stift, um zeichnen zu
        //können, wie auch auf einem Blatt Papier
        pen := CreatePen(PS_SOLID,1,RGB(0,0,255));
        penold := SelectObject(dc, pen);
        SelectObject(dc,penold);
        //Der erzeugte Stift führt nicht zum Erfolg, die Region wird dennoch
        //nicht gezeichnet, der Fensterhintergrund bleibt weiß

        fAngle := 0.0;
        for i := 0 to 359 do
        begin
          MoveToEx(dc,0,0,nil);
          LineTo(dc,Round(fRadius*cos(fAngle)+0.5),Round(-fRadius*sin(fAngle)+0.5));
        end;

        DeleteObject(pen);

        EndPaint(wnd, ps);
      end;
    WM_DESTROY:
      begin
        DeleteObject(hRgnClip);
        PostQuitMessage(0);
      end;
  end;
  Result := DefWindowProc(wnd,msg,w,l);
end;

begin
  { TODO -oUser -cConsole Main : Insert code here }
  wndclass.style := CS_HREDRAW or CS_VREDRAW;
  wndclass.lpfnWndProc := @WndProc;
  wndclass.cbClsExtra := 0;
  wndclass.cbWndExtra := 0;
  wndclass.hInstance := hInstance; //Innerhalb Windows definiert!
  wndclass.hIcon := LoadIcon(hInstance,IDI_APPLICATION);
  wndclass.hCursor := LoadCursor(Longint(NIL), IDC_ARROW);
  wndclass.hbrBackground := HBRUSH(GetStockObject(WHITE_BRUSH));
  wndclass.lpszMenuName := NIL;
  wndclass.lpszClassName := szAppName;

  if not Boolean(RegisterClass(wndclass)) then
  begin
    MessageBox(0,'Dieses Programm erfordert Windows NT!', szAppName, MB_ICONERROR);
    Halt(1);
  end;

  wnd := CreateWindow(szAppName, 'Zeichne ein Kleeblatt',
               WS_OVERLAPPEDWINDOW,
               CW_USEDEFAULT, CW_USEDEFAULT,
               CW_USEDEFAULT, CW_USEDEFAULT,
               0, 0, hInstance, nil
          );

  ShowWindow(wnd, Sw_Shownormal);
  UpdateWindow(wnd);


  while GetMessage(msg,0,0,0) do
  begin
    TranslateMessage(msg);
    DispatchMessage(msg);
  end;

end.

P.S.:
Warum funktioniert das Einfügen von Internetlinks innerhalb der Klammer nicht?

Geändert von DualCoreCpu ( 5. Feb 2018 um 20:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.105 Beiträge
 
Delphi 12 Athens
 
#2

AW: Warum werden Regionen in meinem Programm nicht gezeichnet!

  Alt 5. Feb 2018, 20:34
Sicher, dass dein Klee nicht gezeichnet wird?


Zitat:
Delphi-Quellcode:
  while GetMessage(msg,0,0,0) do
  begin
    TranslateMessage(msg);
    DispatchMessage(msg);
  end;
Oder könnte es nicht auch sein, dass sich dein Programm fast sofort wieder beendet?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
DualCoreCpu
(Gast)

n/a Beiträge
 
#3

AW: Warum werden Regionen in meinem Programm nicht gezeichnet!

  Alt 6. Feb 2018, 11:33
Sicher, dass dein Klee nicht gezeichnet wird?
Ja sicher! Leider!

Zitat:
Delphi-Quellcode:
  while GetMessage(msg,0,0,0) do
  begin
    TranslateMessage(msg);
    DispatchMessage(msg);
  end;
Zitat:
Oder könnte es nicht auch sein, dass sich dein Programm fast sofort wieder beendet?
Wieso das? Wird nicht das Programm erst durch PostQuitmessage in der WM_DESTROY Message wirklich beendet?

Außerdem ist nach Programmsatart mein Anwendungsfenster, in dem das Kleeblatt gezeichnet werden soll, sichtbar. Nur bleibt der Hintergrund weiß. Kein Kleeblatt!

Das Fenster wird mit CreateWindow() erzeugt, danach mit ShowWindow() gezeichnet, UpdateWindow() zeichnet den Clientbereich, dann erst kommt die Nachrichtenschleife. Wieso sollte sich da mein Programm vor dem Zeichnen verabschieden?

Dem Fenster wird im WndClass Record die Window-Prozedur übergeben. Die dann innerhalb der Nachrichtenschleife ausgeführt wird. So wie ich die Funktion ShowWindow verstanden habe, sendet die eine WM_PAINT Message. So dürfte doch WM_DESTROY erst mit Klick auf den Schließen-Button rechts oben auf der Titelleiste oder mit Alt+F4 oder mit Schließen-Auswahl im Systemmenü abgesendet werden?

So muss mein Fehler eine andere Ursache haben. Aber welche?

.


.

Geändert von DualCoreCpu ( 6. Feb 2018 um 11:42 Uhr)
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#4

AW: Warum werden Regionen in meinem Programm nicht gezeichnet!

  Alt 6. Feb 2018, 12:27
Hmm..

Mehrere Fehler:
Delphi-Quellcode:
    WM_PAINT:
..
        SelectClipRgn(dc, hRgnClip); // HIER hat hRgnClip den Wert 0!!
// hRgnClip ist eine lokale Variable, welche beim Ersten Durchlauf im WM_SIZE zwar gesetzt
// wird, jedoch danach wieder weggeschmissen wird!!
// Somit wird mit hRgnClip = 0 die Region wieder gelöscht!

        fRadius := hypot(cxClient / 2.0, cyClient / 2.0);

        //Hatte zuerst gedacht, ich brauchte einen Stift, um zeichnen zu
        //können, wie auch auf einem Blatt Papier
// pen := CreatePen(PS_SOLID,1,RGB(0,0,255));
// penold := SelectObject(dc, pen);
// SelectObject(dc,penold);
        //Der erzeugte Stift führt nicht zum Erfolg, die Region wird dennoch
        //nicht gezeichnet, der Fensterhintergrund bleibt weiß

        fAngle := 0.0;
        for i := 0 to 359 do
        begin
          MoveToEx(dc,0,0,nil);

// Wo Wird hier dein fAngle verändert? Es bleibt IMMER 0.0
          LineTo(dc,Round(fRadius*cos(fAngle)+0.5),Round(-fRadius*sin(fAngle)+0.5));

// So sollte es funktionieren, wobei ich nicht weiß, ob die Berechnung passt..
          LineTo(dc,Round(fRadius*cos(i)+0.5),Round(-fRadius*sin(i)+0.5));

        end;

// DeleteObject(pen);

        EndPaint(wnd, ps);
      end;

Delphi-Quellcode:
WM_SIZE :
..
// Da hRgnClip lokal ist, wird es nie <> 0..
if hRgnClip <> 0 then DeleteObject(hRgnClip);
Habe dies nur angetestet..
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.105 Beiträge
 
Delphi 12 Athens
 
#5

AW: Warum werden Regionen in meinem Programm nicht gezeichnet!

  Alt 6. Feb 2018, 12:47
Wieso das? Wird nicht das Programm erst durch PostQuitmessage in der WM_DESTROY Message wirklich beendet?
Stimm, hast Recht.
Ich war es so gewohnt, dass oftmals PeekMessage verwendet wird, dass ich es wohl falsch sah.
Denn damit wäre es aus der Schleife, wenn keine anstehenden Messages mehr rum liegen.

Aber WM_QUIT
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Warum werden Regionen in meinem Programm nicht gezeichnet!

  Alt 6. Feb 2018, 13:16
Wie bereits gesagt hat der Source mehrere Fehler:
Als erstes:

Delphi-Quellcode:
 hrgnClip: HRGN;
  cxClient: Integer;
  cyClient: Integer;
Müssen Global definiert sein nicht in WndProc

Dann in der Schleife zum Zeichnen:
Delphi-Quellcode:
 for i := 0 to 359 do
        begin
          fangle := degToRad(i); // Umwandeln zu Bogenmass da die Winkelfunktion damit arbeiten
          MoveToEx(dc,0,0,nil);
          LineTo(dc,Round(fRadius*cos(fAngle)+0.5),Round(-fRadius*sin(fAngle)+0.5));
        end;
Auch solltest Du Dir angewöhnen die Rückgabe der WINAPI Funktion zu überprüfen
Also so etwas wie
(nur als Beispiel)
Delphi-Quellcode:
 lErrorRgn := CombineRgn(hRgnClip,hRgnTemp[4],hRgnTemp[5], RGN_XOR);
        case lErrorRgn of
          NULLREGION : hRgnClip := CreateRectRgn(0,0,100,100);
          SIMPLEREGION :;
          COMPLEXREGION :;
          ERROR : hRgnClip := 0;
       end;
Fritz Westermann
  Mit Zitat antworten Zitat
DualCoreCpu
(Gast)

n/a Beiträge
 
#7

AW: Warum werden Regionen in meinem Programm nicht gezeichnet!

  Alt 6. Feb 2018, 20:05
Danke für die Antworten und die Anregungen.

Prüfung des Rückgabewertes der WinApi-Funktion werde ich beherzigen, Danke für die Anregung!

Ich habe nun:

hrgnClip, cxClient und cyClient global definiert wie User @FritzeW angeregt hat und ich habe das Löschen der Clipregionen in die WM_DESTROY Message verbannt.

Außerdem habe ich die DegToRad() Umrechnung wie oben hinzugefügt und verwende nun diesen umgerechneten Winkelwert in der LineTo() Funktion wie oben.

Nun funktioniert es wie es soll.

Dies ist aber auch der Fall, wenn ich Mit MoveToEx(dc, 20,0, Nil) den Mittelpunkt verschiebe. Nur der bei (0,0) in der Mitte befindliche schwarze Bereich verschiebt sich dann, im obigen Fall nach rechts. Das Kleeblatt aber bleibt in seiner Position. Warum ist das so. Warum wird da nicht das ganze Kleeblatt verschoben?

fRadius wird mit der Hypot Funktion berechnet. Wieso aber befindet sich dann der Punkt 0,0 in der Mitte des Fensters? Wenn ein kartesisches Koordinatensystem bei Regionen gelten würde, müsste doch bei Verändern des Mittelpunktes das Kleebaltt insgesamt verschoben werden? Hier besteht noch eine Unklarheit.

Wer kann sie ausräumen?

.

Geändert von DualCoreCpu ( 6. Feb 2018 um 20:42 Uhr)
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Warum werden Regionen in meinem Programm nicht gezeichnet!

  Alt 7. Feb 2018, 08:27
Ich habe Dein Beispiel mal etwas überarbeitet.
Die ClipRegion gehört zum Fenster. Deshalb wird die Verschiebung des 0 Punktes dort
nicht berücksichtigt.

Vielleicht wird es etwas klarer:


Delphi-Quellcode:
program Project47;

{$APPTYPE GUI}

uses
  SysUtils,
  Windows,
  Messages,
  System.Math;

var
  wnd: HWND;
  msg: TMsg;
  wndclass: TWndClass;
  szAppName: PChar = 'Clover';


  hrgnClip: HRGN;
  cxClient: Integer;
  cyClient: Integer;


//Die Funktion hypot wird im C Originalprogramm verwendet. Die erzeugt die
//Hypotenuse von zwei gegebenen Dreiecksseiten. Habe ich von dieser Erklärung
//her zumindest so verstanden:
//C++ Reference:
//[URL="http://www.cplusplus.com/reference/cmath/hypot/"]http://www.cplusplus.com/reference/cmath/hypot/[/URL]

function hypot(a,b: double): double;
var h: double;
begin
  h := sqr(a) + sqr(b);
  Result := sqrt(h);
end;


function prepareRgn(const cxClient, cyClient : integer; const centerX, centery : integer) : HRGN;
 var lHrgn: array[0..5] of HRGN;
     lErrorRgn : integer;
     lTempRgn : HRGN;
     i : integer;
begin
  Result := 0;
  // Clear the Data
   fillchar(lHrgn, sizeof(lHrgn), 0);
 // Prepare the 4 Elliptic Regions
   lHrgn[0] := CreateEllipticRgn(0, cyClient div 3, cxClient div 2, 2*cyClient div 3);
   lHrgn[1] := CreateEllipticRgn(cxClient div 2, cyClient div 3, cxClient, 2*cyClient div 3);
   lHrgn[2] := CreateEllipticRgn(cxClient div 3, 0, 2*cxClient div 3, cyClient div 2);
   lHrgn[3] := CreateEllipticRgn(cxClient div 3, cyClient div 2, 2*cxClient div 3, cyClient);

   // Prepare 2 empty Regions;
   lHrgn[4] := CreateRectRgn(0,0,1,1);
   lHrgn[5] := CreateRectRgn(0,0,1,1);

  // Try to combine the Regions
  if (lHrgn[1] <> 0) and (lHrgn[0] <> 0) then
    lErrorRgn := CombineRgn(lHrgn[4], lHrgn[0], lHrgn[1], RGN_OR);
    if lErrorRgn in [SIMPLEREGION, COMPLEXREGION] then
    begin
       if (lHrgn[1] <> 0) and (lHrgn[0] <> 0) then
       lErrorRgn := CombineRgn(lHrgn[5], lHrgn[2], lHrgn[3], RGN_OR);
        if lErrorRgn in [SIMPLEREGION, COMPLEXREGION] then
        begin
          // Prepare the result
          lTempRgn := CreateRectRgn(0,0,1,1);
          lErrorRgn := CombineRgn(lTempRgn, lHrgn[4], lHrgn[5], RGN_OR);
           if lErrorRgn in [SIMPLEREGION, COMPLEXREGION] then
            begin
             // There is a valid result
              // Check for a Offset
              if (centerX <> 0) or (centery <> 0) then
              begin
                 lErrorRgn := OffsetRgn(lTempRgn, centerX, centery);
                  if lErrorRgn in [ERROR , NULLREGION] then
                  begin
                   DeleteObject(lTempRgn);
                   lTempRgn := 0;
                  end;
              end;
              result := lTempRgn;
            end
            // Delete the temprgn
            else DeleteObject(lTempRgn);
        end;
    end;

   if lErrorRgn in [ERROR , NULLREGION] then
    begin
     // Some Errorhandling here
    end;

  // Clean up used resources;
  for I := Low(lHrgn) to High(lHrgn) do
     if lHrgn[i] <> 0 then DeleteObject(lHrgn[i]);


end;




function WndProc(wnd: HWND; msg: UINT; w: WPARAM; l: LPARAM): LRESULT; stdcall;
var
  fAngle,fRadius: double;
  cursor: HCURSOR;
  dc: HDC;
  i: Integer;
  ps: TPaintStruct;
  pen,penold: HPEN;

begin
  case msg of
    WM_SIZE:
      begin
        cxClient := LOWORD(l);
        cyClient := HIWORD(l);
        cursor := SetCursor(LoadCursor(0, IDC_WAIT));
        ShowCursor(true);

        if hRgnClip <> 0 then DeleteObject(hRgnClip);

        // Create the RGN with a Offset from 100 from left top
        hRgnClip := prepareRgn(cxClient, cyClient, 100, 100);

        ShowCursor(false);
        SetCursor(cursor);

      end;
   
    WM_PAINT:
      begin
        dc := BeginPaint(wnd, ps);
         //SelectClipRgn(dc, hRgnClip);

        if hrgnClip <> 0 then
        begin
         FrameRgn(dc, hrgnClip, GetStockObject(LTGRAY_BRUSH), 2,2);
         SelectClipRgn(dc, hRgnClip);
        end;

         // Move the Drawing to the Center
        SetViewPortOrgEx(dc, cxClient div 2, cyClient div 2, nil);

        fRadius := hypot(cxClient / 2.0, cyClient / 2.0);

        //Hatte zuerst gedacht, ich brauchte einen Stift, um zeichnen zu
        //können, wie auch auf einem Blatt Papier
        pen := CreatePen(PS_SOLID,1,RGB(0,0,255));
        penold := SelectObject(dc, pen);

        fAngle := 0.0;
        for i := 0 to 359 do
        begin
          fangle := degToRad(i);
          MoveToEx(dc,0,0,nil);
          LineTo(dc,Round(fRadius*cos(fAngle)+0.5),Round(-fRadius*sin(fAngle)+0.5));
        end;

        // Restore old Pen and delete pen
        SelectObject(dc,penold);
        DeleteObject(pen);

        // Restore the Clip
        SelectClipRgn(dc, 0);
        EndPaint(wnd, ps);
      end;
    WM_DESTROY:
      begin
        DeleteObject(hRgnClip);
        PostQuitMessage(0);
      end;
  end;
  Result := DefWindowProc(wnd,msg,w,l);
end;

begin
  { TODO -oUser -cConsole Main : Insert code here }
  wndclass.style := CS_HREDRAW or CS_VREDRAW;
  wndclass.lpfnWndProc := @WndProc;
  wndclass.cbClsExtra := 0;
  wndclass.cbWndExtra := 0;
  wndclass.hInstance := hInstance; //Innerhalb Windows definiert!
  wndclass.hIcon := LoadIcon(hInstance,IDI_APPLICATION);
  wndclass.hCursor := LoadCursor(Longint(NIL), IDC_ARROW);
  wndclass.hbrBackground := HBRUSH(GetStockObject(WHITE_BRUSH));
  wndclass.lpszMenuName := NIL;
  wndclass.lpszClassName := szAppName;

  if not Boolean(RegisterClass(wndclass)) then
  begin
    MessageBox(0,'Dieses Programm erfordert Windows NT!', szAppName, MB_ICONERROR);
    Halt(1);
  end;

  wnd := CreateWindow(szAppName, 'Zeichne ein Kleeblatt',
               WS_OVERLAPPEDWINDOW,
               CW_USEDEFAULT, CW_USEDEFAULT,
               CW_USEDEFAULT, CW_USEDEFAULT,
               0, 0, hInstance, nil
          );

  ShowWindow(wnd, Sw_Shownormal);
  UpdateWindow(wnd);

  while GetMessage(msg,0,0,0) do
  begin
    TranslateMessage(msg);
    DispatchMessage(msg);
  end;

end.
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Warum werden Regionen in meinem Programm nicht gezeichnet!

  Alt 31. Aug 2019, 06:44
Ich habe noch einen schönen Grund gefunden, der mich gestern Abend 3-4 Stunden Verzweiflung gekostet hat:

TPolygon in System.Math.Vectors ist jetzt als array of TPointF declariert.
  TPolygon = array of TPointF; CreatePolygonRgn verlangt aber eigentlich ein "array of TPoint";

Da alles fehlerfrei compilierte, dachte ich, es gäbe eine überladene API-Funktion oder so...

Erst nach Stunden an Fehlersuche habe ich dann doch mal array of TPoint genutzt und alles klappte sofort...

Also ggf. mal mit darauf achten!
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.986 Beiträge
 
Delphi 12 Athens
 
#10

AW: Warum werden Regionen in meinem Programm nicht gezeichnet!

  Alt 31. Aug 2019, 08:23
CreatePolygonRgn verlangt aber eigentlich ein "array of TPoint";
Die Windows-API arbeitet gern mit typlosen Parametern und dann muss man natürlich genau schauen, was man da übergibt. Das ist vielleicht auch ein Grund, warum man mit direktem API-Zugriff immer soviel Zeit verbrät.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz