Einzelnen Beitrag anzeigen

oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#85

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 6. Sep 2007, 20:40
Hi torud,

ein paar Tipps kann ich dir geben.

Als Member der Klasse und zwei Methoden:
Delphi-Quellcode:
  TMyControl = class(TCustomControl)
  private
    FullRgn, PointRgn : THandle;
......
  protected
    procedure DoInvisible;
    procedure DoVisible;
......
Mit Aufruf DoInvisible wird der überflüssige Tein unsichtbar, mit DoVisible alles sichtbar.

Delphi-Quellcode:
procedure TMyControl.DoVisible;
begin
  if FullRgn <> 0 then
    DeleteObject(FullRgn);
  FullRgn := CreateRectRgn(0, 0, Width, Height);
  CombineRgn(FullRgn, FullRgn, FullRgn, RGN_COPY);
  SetWindowRgn(Handle, FullRgn, TRUE);
end;
Das kann man so übernehmen.

Delphi-Quellcode:
procedure TMyControl.DoInvisible;
begin
  //gesamten Clientbereich erfassen
  if FullRgn <> 0 then
    DeleteObject(FullRgn);
  FullRgn := CreateRectRgn(0, 0, Width, Height);
  //'Mask' alles unsichtbar
  CombineRgn( FullRgn, FullRgn, FullRgn, RGN_DIFF );

  // alle sichtbaren Bereiche einblenden
  PointRgn := CreateRectRgn( X, Y, Width, Hight); // das ist ein Bereich im Rect der eingeblendet wird
  CombineRgn( FullRgn, FullRgn, PointRgn, RGN_OR );
  DeleteObject(Pointrgn);

  // alles Kombiniert und fertig
  SetWindowRgn(Handle, FullRgn, TRUE);
end;
Das Teilstück von PointRgn bis DeleteObject kann beliebig wiederholt werden. Somit kann mann mehrere Clientbereiche auf den FullRgn kombinieren. Hier ist beispielhaft ein RectRgn verwendet. Das gibt es auch für Polygon usw. Einfach in die MS-Hilfe schauen.

Vergiß nicht im Destructor den Speicher wieder frei zu geben.
Delphi-Quellcode:
destructor TMyControl.Destroy;
begin
  try
    DeleteObject(FullRgn);
    DeleteObject(PointRgn);
  except end;
Ach so, wenn es ein fester Bereich ist, reicht es einmal DoInvisible (zum Bsp. im CreateWnd) aufzurufen. Dann sollte man das immer wieder tun, wenn sich die Größe ändert. Erst DoVisible und dann DoInvisible.

Gruß oki
42
  Mit Zitat antworten Zitat