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