AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zeichnen auf MDI-Form...

Ein Thema von bingo72 · begonnen am 4. Okt 2007 · letzter Beitrag vom 8. Okt 2007
Antwort Antwort
Seite 1 von 2  1 2      
bingo72

Registriert seit: 18. Aug 2006
Ort: Österreich
180 Beiträge
 
Delphi 5 Professional
 
#1

Zeichnen auf MDI-Form...

  Alt 4. Okt 2007, 20:13
Hallo Kollegen!!

Ich bräuchte wiedermal eure Hilfe:

Ich habe eine MDI-Form auf der links ein MenüTree ist, der in seiner Breite verschiebbar ist. Auf der verbleibenden Fläche der Applikation, soll ein Hintergrundlogo mittig zentriert plaziert werden und die Fläche selbst eine Hintergrundfarbe bekommen.
Die Applikation selbst ist in seiner Größe ebenfalls veränderbar.

Das Hintergrundlogo (jpeg) hab ich mal als erstes in eine TImage-Komponente verpackt und diese auf der Form platziert. Als nächstes habe ich eine Canvas-Komponente erzeugt und lasse das in ein Bitmap umgewandelte Hintergrundlogo, zeichnen (mittels Draw).
Dies funktioniert soweit auch schon.

Das Problem ist, daß wenn ich entweder beim Verändern der MenüTree-Breite oder beim Verändern der Größe des Applikationsfensters, ein massives 'Neuzeichnen'-Problem bekomme. Soll heissen, das Logo plaziert sich nicht neu in die neue Mitte bzw. wird das Logo beim Verkleinern des Fensters einfach mit der Hintergrundfarbe 'übermalt'. Nur wenn ich das Fenster minimiere oder ein anderes Fenster anklicke (zufällig geöffnete Datei) scheint es sich neu zu zeichnen....nicht aber eben beim Ändern der Applikations-Fenstergröße!!

Wem mit Code geholfen ist, kann ich morgen in der Früh Code-Stücke beifügen...

Ich hoffe es kennst sich wer damit aus...

LG
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von peschai
peschai

Registriert seit: 15. Feb 2004
Ort: Göppingen
270 Beiträge
 
Delphi XE5 Professional
 
#2

Re: Zeichnen auf MDI-Form...

  Alt 5. Okt 2007, 08:09
Hallo
Zitat:
habe ich eine Canvas-Komponente erzeugt
Wie hast du das gemacht ?
Warum verwendest du nicht den Canvas der Form selber ?
Benutzt du OnPaint und eventuell auch Invalidate?
Peter Schaible
  Mit Zitat antworten Zitat
bingo72

Registriert seit: 18. Aug 2006
Ort: Österreich
180 Beiträge
 
Delphi 5 Professional
 
#3

Re: Zeichnen auf MDI-Form...

  Alt 5. Okt 2007, 08:27
Hey!!

Bin jetzt schon ein gutes Stück weitergekommen und hab im Netz doch noch wertvolle Tipps gefunden:

Vielleicht mal ein wenig Code:

Im Create mach ich das:
Delphi-Quellcode:
fLogo := imLogo.Picture.Graphic;

  fBkBrush := CreateSolidBrush(GetColor);
  fClientInstance := MakeObjectInstance(MainClientWndProc);
  fPrevClientProc := Pointer (GetWindowLong(ClientHandle, GWL_WNDPROC));
  SetWindowLong(ClientHandle, GWL_WNDPROC, Longint(fClientInstance));
  
  fCanvas := TCanvas.Create;
  fCanvas.Handle := GetDC(ClientHandle);
und im Destroy das...
Delphi-Quellcode:
DeleteObject(fBkBrush);
  ReleaseDC(ClientHandle, fCanvas.Handle);

  fCanvas.Free;
im ClientWindowProc(var Message: TMessage) das:

Delphi-Quellcode:
var
  lDC : HDC;
  lBrushOld : HBRUSH;
begin
  with Message do begin
    case Msg of WM_ERASEBKGND:
      begin
        lDC := TWMEraseBkGnd(Message).DC;
        lBrushOld := SelectObject(lDC, fBkBrush);
        FillRect(lDC, ClientRect, fBkBrush);
        SelectObject(lDC, lBrushOld);
        Result := 1;
      end else begin
        Result := CallWindowProc (fPrevClientProc, ClientHandle, Msg, wParam, lParam);
      end;
    end;
  end;
end;
und zu guter Letzt die DrawBackground-Methode:
Delphi-Quellcode:
var
  lImage : TGraphic;
  lBitmap : TBitmap;
  lLeft : Integer;
  lTop : Integer;
  lRect : TRect;
begin
    if Assigned (fCanvas) then begin
      lLeft := (ClientWidthEx - fBitmap.Width) div 2;
      lTop := (ClientHeightEx - fBitmap.Height) div 2;

      if Assigned (fBitmap.Canvas) then begin
        fCanvas.Draw(lLeft, lTop, fBitmap);
      end;
    end;
end;
Es funktioniert schon recht gut und die Effekte sind so wie ich es mir vorstelle...eigentlich fertig oder??

Naja nicht ganz...wenn ich nämlich die Applikation beende bekomme ich im DrawBackground eine AccessViolation-Exception an der Draw-Position...drum hab ich dort auch schon alles abgetestet, was nil sein könnte??
Vielleicht findet ja wer gleich den Grund??

LG
Thomas
  Mit Zitat antworten Zitat
bingo72

Registriert seit: 18. Aug 2006
Ort: Österreich
180 Beiträge
 
Delphi 5 Professional
 
#4

Re: Zeichnen auf MDI-Form...

  Alt 5. Okt 2007, 08:37
Ich hab jetzt festgestellt, daß mein Resize-Event, nach dem Destroy nochmals die Background-Methode aufruft und da natürlich kracht es...
Is doch unlogisch oder, daß nach dem Destroy nochmals ein Resize aufgerufen wird....wie kann man das verhindern??
  Mit Zitat antworten Zitat
Benutzerbild von peschai
peschai

Registriert seit: 15. Feb 2004
Ort: Göppingen
270 Beiträge
 
Delphi XE5 Professional
 
#5

Re: Zeichnen auf MDI-Form...

  Alt 5. Okt 2007, 08:41
Hallo

Die Reihenfolge im Destroy und deine Variable fCanvas war noch mit einer Adresse belegt obwohl das Object eventuell schon freigegen war ... FreeAndNil!
Delphi-Quellcode:
ReleaseDC(ClientHandle, fCanvas.Handle);
FreeAndNil(fCanvas);
DeleteObject(fBkBrush);
Peter Schaible
  Mit Zitat antworten Zitat
bingo72

Registriert seit: 18. Aug 2006
Ort: Österreich
180 Beiträge
 
Delphi 5 Professional
 
#6

Re: Zeichnen auf MDI-Form...

  Alt 5. Okt 2007, 08:50
Vielen Dank für Deinen Tipp...

Dennoch besteht nachwievor das seltsame Verhalten, daß nach einem Destroy nochmals ein Resize aufgerufen wird. Der Grund den ich ermitteln konnte war, daß die fBitmap-Variable nach dem Destroy nil, aber dadurch das nachher nochmals Resize ausgeführt wird und somit DrawBackground kracht es natürlich. Ich hab mir jetzt mal dadurch abgeholfen, daß ich Assigned(fBitmap) im Resize checke und nur dann die DrawBackground ausgeführt wird, wenn fBitmap einen Wert hat.

Sauber find ichs nicht und ich würde gerne den Grund für dieses seltsame Verhalten in Erfahrung bringen...
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#7

Re: Zeichnen auf MDI-Form...

  Alt 5. Okt 2007, 09:30
Versuch mal im OnResize csDestroying im ComponentState abzufragen. Zeichnen tust Du dann nur wenn es nicht enthalten ist.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
bingo72

Registriert seit: 18. Aug 2006
Ort: Österreich
180 Beiträge
 
Delphi 5 Professional
 
#8

Re: Zeichnen auf MDI-Form...

  Alt 5. Okt 2007, 09:59
Ja danke es funktioniert...ich hab noch zuwenig Erfahrung in Delphi....drum frag ich nochmals....ist ein Aufruf von Resize nach Destroy normal??
  Mit Zitat antworten Zitat
bingo72

Registriert seit: 18. Aug 2006
Ort: Österreich
180 Beiträge
 
Delphi 5 Professional
 
#9

Re: Zeichnen auf MDI-Form...

  Alt 5. Okt 2007, 13:01
Ein Problem hab ich allerdings noch wenn ich mit meinem linken Menübaum (der aus einer TreeView mit einem Splitter besteht) hin und herfahre...dann passiert es, daß es noch immer so aussieht...

http://www.bos.at/downloads/LogoNOK.jpg

Bitte um weitere Tipps...

Danke!!
  Mit Zitat antworten Zitat
bingo72

Registriert seit: 18. Aug 2006
Ort: Österreich
180 Beiträge
 
Delphi 5 Professional
 
#10

Re: Zeichnen auf MDI-Form...

  Alt 5. Okt 2007, 13:06
Wenn ich allerdings das Fenster minimiere und wieder aufklappe, dann zeichnet er es neu und damit richtig...
Gibt es keinen Befehl mit dem ich ein Minimieren 'Simulieren' kann, ohne das sich das Fenster zwar minimiert, aber dennoch auf die gleiche Weise neu zeichnet??
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:46 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