Regionen übergeben



  • Hallo Leute,

    In meinem Programm erstelle ich an einer Stelle eine Region, was auch alles wunderbar funktioniert.

    Nun möchte ich die Region an eine andere Funktion in meinem Programm übergeben, was leider nicht funktioniert.

    Hier ein Beispiel:

    // Die Region wird erstellt:
    HRGN Region;
    Region = CreateRectRgn(...);
    // ... weiteres anpassen der Region ...
    
    // Jetzt wird die Region an die Funktion übergeben:
    Musterfunktion(Region);
    
    // Weiter in der Funktion:
    void __fastcall TForm1::Musterfunktion(HRGN Musterregion)
    {
      // Wenn ich jetzt auf Musterregion zugreife, so ist diese Region leer!!!
    }
    

    Meine Frage ist nun: Warum ist die Region leer und wie kann ich die Region auf anderem Weg in die Funktion übergeben???

    Vielen Dank für eure Hilfe,
    Euer Entertainer



  • Hast Du die Region VOR Aufruf der Funktion einer Form zugewiesen?

    Damit wird die ungueltig.



  • Nein, das habe ich nicht. Die Musterregion wird einfach erstellt und dann in die Funktion übergeben, weiter nichts.

    Wo liegt hier das Problem???

    Vielen Dank,
    Euer Entertainer



  • Kennt denn niemand eine Antwrt???

    Wie übergebt ihr denn eine Region???

    Vielen Dank,
    Euer Entertainer



  • Man erkennt in deinem Quelltext keinen Fehler. Das müsste genau so funktionieren. Die Variable Region ist ja bloß ein Handle, also eine einfache Variable wie int oder void*.

    Was meinst du denn damit wenn du sagst, dass die Region leer ist?



  • Steht das Ding auf INVALID_HANDLE_VALUE oder so?



  • Bzw. Wird CreateRectRgn() überhaupt korrekt ausgeführt? Was gibt es zurück, wenn die Funktion fehlschlägt? Wieso schlägt sie fehl?

    -junix



  • Probier erst mal den Code von Musterfunktion da einzusetzen wo es aufgerufen wird, also erstmal ohne Funktionsaufruf, um das Problem etwas einschränken zu können.
    Dann wenns klappt, kannst du ja als notlösung dieses HRGN als global definieren und ggf. mit extern einbinden.



  • Probier mal, die Region zu kopieren, um dann die neue an die Funktion zu übergeben.

    BOOL CopyRegion(HRGN& hDestRgn, HRGN hSrcRgn)
    {
       // get the size of the region object
       int iSize = GetRegionData(hSrcRgn, 0, NULL);
    
       // allocate space for it
       LPRGNDATA pData = new RGNDATA[iSize];
       if(!pData)
          return FALSE;
    
       // get the region as binary data
       if( !GetRegionData(hSrcRgn, iSize, pData) )
          return FALSE;
    
       hDestRgn = ExtCreateRegion(NULL, iSize, pData);
    
       if(!hDestRgn)
          return FALSE;
    
       delete[] pData;
       return TRUE;
    }
    


  • Hallo Leute,

    Ich möchte euch allen recht herzlich danken!!!

    Ich habe nun einige Tests unternommen und somit festgestellt, dass, wie ihr bereits angekündigt habt, die Region doch richtig übergeben wird. Überdies bin ich so auf ein anderes Problem gestoßen. Die Funktion, die die Region verarbeitet befindet sich in dem Code einer Komponente, die ich von TPanel abgeleitet habe. Am Ende der Funktion ist eben die Region soweit bearbeitet, dass damit weitergearbeitet werden kann. So soll am Ende der Funktion der Komponente eben die Form der Region zugewiesen werden. Dies mache ich so:

    SetWindowRgn(Handle, MusterRegion, true);
    

    Jedoch passiert gar nichts. Ich bin davon ausgegangen, dass eben der Inhalt der Region verloren gegangen ist, daher ja auch meine Anfrage. Um dies nun auszuprobieren habe ich folgendes probiert: Statt die Region der Komponente zuzuweisen, habe ich die Region zeichnen lassen:

    Graphics::TBitmap* Bitmap = new Graphics::TBitmap();
    Bitmap->Height = 500;
    Bitmap->Width = 500;
    Bitmap->Canvas->Brush->Color = clRed;
    PaintRgn(Bitmap->Canvas->Handle, MusterRegion);
    Bitmap->SaveToFile(...);
    

    Das Ergebnis war, dass die Bitmap- Datei richtig mit den Daten der Region gefüllt und abgespeichert wurde. Somit kann der Inhalt der Region ja nicht verloren sein.

    Warum aber nimmt meine Komponente nicht die Form der Region an???

    PS: Die Funktion CopyRegion von WebFritzi finde ich auch außerhalb meines Programms sehr hilfreich, also dafür noch zusätzlicher Dank!!!

    Vielen Dank für eure Hile,
    Euer Entertainer


Anmelden zum Antworten