SetWindow(Panel.Handle, elptRgn) i rysowanie bitmapy na pane

0

Witam,
mam taką procedurkę:

Var C:TCanvas; bmp: TBitmap; rgn: HRGN;
Begin
  bmp:= TBitmap.Create;
  bmp.LoadFromFile('D:\STARE SMIECI\BPT475.bmp');
  C:=TCanvas.Create;

  C.Handle:=GetDC(Panel1.Handle);
 // C.Draw(0, 0, bmp);
    rgn:= CreateEllipticRgn(50,50, 400, 180);
    SetWindowRgn(Panel1.Handle, rgn, True);

    C.Draw(0, 0, bmp);

  ReleaseDC(Panel1.Handle, C.Handle);
  C.Free;
  bmp.FreeImage;
  bmp.Free;
  DeleteObject(rgn);
end;

Jak nie robie elipsy z panela, to działa elegancko,
natomiast po zmianie kształtu panela - nie rysuje bitmapy.
Co robie nie tak?
Dzieki za wyrozumiałość i wszelkie wskazówki.

0
var C:TCanvas; bmp: TBitmap; rgn: HRGN;
begin
bmp:= TBitmap.Create;
C:=TCanvas.Create;
try
  bmp.LoadFromFile('c:\windows\kawa.bmp');
  rgn:=CreateEllipticRgn(50, 50, 400, 180);
  SetWindowRgn(Panel1.Handle, rgn, True);
  DeleteObject(rgn);

  Application.ProcessMessages;

  C.Handle:=GetDC(Panel1.Handle);
  C.Draw(0, 0, bmp);
  ReleaseDC(Panel1.Handle, C.Handle);
finally
  C.Free;
  bmp.Free;
  end;
end;

Problem leży w tym nieszczęsnym Application.ProcessMessages. Zmiana regionu kontrolki wywołuje też wysłanie komunikatu o jej odmalowanie. Zatem po tym, jak narysujesz bitmapę, przychodzi wspomniany komunikat, a w procedurze obsługi jego odmalowania nie ma rysowania bitmapy; więc jej nie widać

0

W SetWindowRgn prosisz o redraw, wiec poczekaj na komunikat i daj mu szanse application.ProcessMessages;. Odmalowanie powinno odbywac sie w procedurze WM_PAINT (mozesz
sobie odziedziczyc po panelu TPanel i zrobic TMojEliptycznyPanel klase wraz z OnPaint)

Var C:TCanvas; bmp: TBitmap; rgn: HRGN;
Begin
  bmp:= TBitmap.Create;
  bmp.LoadFromFile('D:\STARE SMIECI\BPT475.bmp');
  C:=TCanvas.Create;
  C.Handle:=GetDC(Panel1.Handle);
  rgn:= CreateEllipticRgn(50,50, 400, 180);
  SetWindowRgn(Panel1.Handle, rgn, true);
  application.ProcessMessages;
  C.Draw(0, 0, bmp);
  ReleaseDC(Panel1.Handle, C.Handle);
  C.Free;
  bmp.Free;
  DeleteObject(rgn);
end;
</delphi>

@Szczawik: che che za dluga przerwe sobie zrobilem ....
@zibicoder: no i nalepiej jak bys polaczyl obydwa kody: klasa, try, kolejnosc (szczawik)

0

No dzieki wielkie! O to chodziło!

1 użytkowników online, w tym zalogowanych: 0, gości: 1