Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Probleme beim zeichnen auf ein Panel (https://www.delphipraxis.net/52128-probleme-beim-zeichnen-auf-ein-panel.html)

SarDGer 24. Aug 2005 09:18


Probleme beim zeichnen auf ein Panel
 
Hallo Leute,

Ich hab ein kleines Problem:
Ich möchte ein Modales Fenster aufrufen, worauf ein TPanel liegt.
Auf diesem TPanel möchte ich ein TBitmap zeichnen lassen.
Also habe ich eine Procedure (ZeichneBMP) geschrieben die im wesentlichen so aussieht :

Delphi-Quellcode:
Procedure ZeichneBMP(DestHandle : HWND; drawRect : TRect; Bitmap : graphics.TBitMap);
Begin
  BitBlt(getDC(DestHandle), 0,0, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle, 0, 0, SRCCOPY);
end;
Als DestHandle übergebe ich das Panel-Handle.
Die Funktion rufe ich im OnPaint auf.
So weit so gut, funktioniert ja auch, wenn ich die Form nachträglich in der grösse verändere. Also
dafür sorge das das OnPaint nochmal ausgeführt wird.

Es sieht so aus als ob mein bmp zuerst gezeichnet wird und dann erst das Panel als solches,
mein bmp wird also überzeichnet. :shock:

Klar ich könnte jetzt ein wenig rumtricksen und den Funktionsaufruf ins OnResize und im
OnConstrainedResize ein Refresh legen. :gruebel:
Aber das wäre eben nur getrickst. Also wenn jemand 'ne gute Idee hat wäre ich echt dankbar.

Grüsse,
Sar

Khabarakh 24. Aug 2005 09:25

Re: Probleme beim zeichnen auf ein Panel
 
Ein Panel ist eben nicht zum Zeichnen da :wink: .
Spricht etwas gegen TPaintbox?

[add]
  1. Musst du den DC nicht mit MSDN-Library durchsuchenReleaseDC wieder freigeben?
  2. Bei mir funktioniert alles perfekt :gruebel: .
Delphi-Quellcode:
procedure TForm1.FormPaint(Sender: TObject);
var
  DC: HDC;
begin
  DC := GetDC(Panel1.Handle);
  BitBlt(DC, 0,0, Image1.Picture.Bitmap.Width, Image1.Picture.Bitmap.Height,
   Image1.Picture.Bitmap.Canvas.Handle, 0, 0, SRCCOPY);
  ReleaseDC(Panel1.Handle, DC);
end;
[/add]

SarDGer 24. Aug 2005 10:12

Re: Probleme beim zeichnen auf ein Panel
 
Klar ist ein Panel nicht zum Zeichnen da, aber manchmal
kann man es sich leider nicht aussuchen...

Klar gebe ich den DC wieder frei, ist kein muss sondern
NUR eine Speichersauerei, hab's in dem Beispiel nur mal
weggelassen.

Aber wichtiger: Warum funktioniert es bei Dir??? :wall:

Ich hab eine Form mit einem Panel und einem TImage (vis = False)
im FormPaint tue ich GENAU das selbe wie Du. Sollte dann auch
nicht das selbe passieren?? :gruebel:

Ich hab hier Delphi7 und winXP aber daran sollte es nu wirklich nicht liegen.
:coder2:

Khabarakh 24. Aug 2005 10:38

Re: Probleme beim zeichnen auf ein Panel
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von SarDGer
Klar ist ein Panel nicht zum Zeichnen da, aber manchmal
kann man es sich leider nicht aussuchen...

Und wann wäre das :gruebel: .

Was bei deinem ersten Post nicht deutlich erkennbar ist: änderst du die Größe des Panels auch? Denn damit funktioniert es bei mir auch nicht.
Ich hänge mal meine Beispiel-Echse an. links oben ist das Image, rechts daneben ein Panel mit fester Größe, drunter eines mit Align = alBottom.

SarDGer 24. Aug 2005 11:50

Re: Probleme beim zeichnen auf ein Panel
 
z.B. Wenn Du 'ne spezielle Komponente entwickeln willst. :wink:

Bei deiner exe Funktioniert es - hast ja auch nur im OnActivate
2x repaint drin (FormPaint gilt hir als repaint) und das OnShow
mit OnActvate verlinkt - fazit alles wird dreimal gezeichnet.
Wenn ich die repaints rausschmeisse hab ich wieder das selbe Problem.

:coder: wenn du alles wieder rausschmeisst
- bis auf FormPaint versteht sich - und nur im OnResize 2x repaint;
reinhaust, dann funktioniert es.
Ist aber ebenso nur getrickst - da sind wir wieder am Anfang. :wall:

tigerman33 24. Aug 2005 12:34

Re: Probleme beim zeichnen auf ein Panel
 
Bin mir jetzt nicht sicher, aber hat TCanvas nicht eine Methode um eine Grafik an einer bestimmten Stelle auszugeben? Dann müsstest du ja nur noch auf die Canvas-Eigenschaft vom Panel zugreifen. (Der hat doch eine, oder?)

SirThornberry 24. Aug 2005 12:37

Re: Probleme beim zeichnen auf ein Panel
 
und wie wärs wenn du von TPanel ableitest und Paint überschreibst?
Du hast auch nicht zufällig das OnPaint des Forms genommen? Das wäre nämlich mehr als falsch denn das Panel hat ein eigenes Handle und somit bekommt das Form nicht in jedem Fall ein Paint wenn auch das Panel ein Paint bekommt.

SarDGer 24. Aug 2005 13:15

Re: Probleme beim zeichnen auf ein Panel
 
Zitat:

Dann müsstest du ja nur noch auf die Canvas-Eigenschaft vom Panel zugreifen. (Der hat doch eine, oder?)
Hat das Panel leider nicht

@SirThornberry
eigentlich will ich in garkein OnPaint - ich möchte im Prinzip
ein Modales Fenster aufmachen - da einmal eine Funktion aufrufen
die mir was auf ein Panel malt - und gut ist.

Aber irgentwie bin ich da zu dämlich für. :cry:

SirThornberry 24. Aug 2005 13:17

Re: Probleme beim zeichnen auf ein Panel
 
wenn du es möglichst einfach haben willst kannst du auch einfach ein TImage auf das Panel packen und darein dein bild laden.

SarDGer 24. Aug 2005 13:21

Re: Probleme beim zeichnen auf ein Panel
 
hehe, danke. Aber soooo einfach mache ich mir das auch wieder nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:37 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