AGB  ·  Datenschutz  ·  Impressum  







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

canvas probleme, oder so

Ein Thema von cherry · begonnen am 24. Aug 2007 · letzter Beitrag vom 3. Sep 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#1

canvas probleme, oder so

  Alt 24. Aug 2007, 08:55
hi

ich habe ein kleines Problem mit meiner Komponente...
und zwar habe ich folgenden bug entdeckt, und weiss nicht an was es liegt, vielleicht könnt ihr mir weiterhelfen.
Die ganze Komponente findet ihr in unsererOpen Source Library.

Das Problem:

Wenn ich ein Icon in mein Button zeichne soll er in die mitte kommen. In den meisten Konstellationen funktioniert das auch einwandfrei, habe ich aber ein icon 16*16 auf einer Canvas 22*22, ist das Bild, gerade nachdem ich mein Programm starte nicht in der mitte. Sobald ich dann mit der Maus darüberfahre, geht es in die mitte und wird von diesem Moment an immer korrekt angezeigt. Bis ich das Programm wieder neu starte... mit Bildern und Icons ab 32*32 habe ich dieses Problem nie!

hier die Routinen die das Bild zeichnen, vielleicht fällt euch ja etwas auf, PS: ich verwende nur ein Bild, also
PictureUseOnlyOne := true!

Delphi-Quellcode:
procedure TEButton.DrawPicture;
begin
 if (FPicture <> nil) then
   Canvas.Draw((Width - FPicture.Graphic.Width) div 2,(Height - FPicture.Graphic.Height) div 2 ,FPicture.Graphic);
end;

procedure TEButton.DrawPictureOver;
begin
 if (FPictureUseOnlyOne) then
 begin
  if (FPicture <> nil) then
   Canvas.Draw((Width - FPicture.Graphic.Width) div 2,(Height - FPicture.Graphic.Height) div 2 ,FPicture.Graphic);
 end
 else
 begin
  if (FPictureOver <> nil) then
  Canvas.Draw((Width - FPictureOver.Graphic.Width) div 2,(Height - FPictureOver.Graphic.Height) div 2 ,FPictureOver.Graphic);
 end;
end;

procedure TEButton.DrawPictureDown;
begin
 if (FPictureUseOnlyOne) then
 begin
  if (FPicture <> nil) then
   Canvas.Draw((Width - FPicture.Graphic.Width) div 2,(Height - FPicture.Graphic.Height) div 2 ,FPicture.Graphic);
 end
 else
 begin
  if (FPictureDown <> nil) then
   Canvas.Draw((Width - FPictureDown.Graphic.Width) div 2,(Height - FPictureDown.Graphic.Height) div 2 ,FPictureDown.Graphic);
 end;
end;
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: canvas probleme, oder so

  Alt 24. Aug 2007, 09:08
Beim ersten mal Zeichnen ist FPicture.Width und FPicture.Height = 32, warum auch immer.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#3

Re: canvas probleme, oder so

  Alt 24. Aug 2007, 09:12
tatsache?
wie hast du das rausbekommen? hast du mein beispiel nachkonstruiert und die Komponente runtergeladen?
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#4

Re: canvas probleme, oder so

  Alt 24. Aug 2007, 09:33
ich hab dasselbe icon in ein jpg umgewandelt. -> Das Problem besteht nur bei Icons!
Ich denke es liegt vielleicht daran das Standard Icons 32*32 sind, und er beim ersten ausrechnen
der canvas koordinaten die standard grössen statt der realen grösse verwendet.

Aber wie kann ich dieses Problem nur lösen??
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: canvas probleme, oder so

  Alt 24. Aug 2007, 10:03
Zitat von cherry:
tatsache?
wie hast du das rausbekommen? hast du mein beispiel nachkonstruiert und die Komponente runtergeladen?
Jep


Zitat von cherry:
ich hab dasselbe icon in ein jpg umgewandelt. -> Das Problem besteht nur bei Icons!
Ich denke es liegt vielleicht daran das Standard Icons 32*32 sind, und er beim ersten ausrechnen
der canvas koordinaten die standard grössen statt der realen grösse verwendet.
Jep

Er nimmt zu Anfang die Standardgrößen des Systems (MSDN-Library durchsuchengetsystemmetrics)
Das Zuweisen eines Icons bewirkt ja nur ein Hin- und Herschieben von einem Stream (urspr. FileStream der Icondatei). Der Header (beim Icon) wird nur ausgewertet, wenn das Icon das erste mal gezeichnet wird. Dies geschieht über die Methode TIcon.Handleneeded --> ReadIcon. Deswegen sind nach dem ersten Draw die Angaben richtig.
Demnach musst du dir nur ersatzweise das Handle besorgen "Button.Picture.Icon.Handle" oder den Stream selber auswerten ( Byte 7 und 8 )


Edit: "8 Klammer zu" wer denkt schon jedes mal daran 8)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#6

Re: canvas probleme, oder so

  Alt 24. Aug 2007, 14:12
danke für deine bestätigung... ich habe jetzt schon einiges probiert, aber ich kriegs nicht hin.
das arbeiten mit handle ist mir völlig fremd...

wär toll wenn du mir ein bisschen auf die Sprünge helfen könntest..
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: canvas probleme, oder so

  Alt 24. Aug 2007, 15:12
Mit dem Handle ist nur ein Trick
Du musst mit dem Handle nix machen. Einfach nur das Handle verlangen und dann wegschmeissen. Denn wenn du das Handle verlangst und das Icon ist grad neu geladen (ergo: er hat weder ein Handle noch die richtigen Angaben zu Höhe und Breite) dann besorgt er sich ein Handle und nebenbei schaut er noch nach, wie groß eigentlich das Icon ist. Das ist quasi von hinten durch die Brust ins Auge.

du musst also vorm ersten abfragen der Abmaße mal das Handle verlangen. Machs doch im OnChangeereignis:
Delphi-Quellcode:
procedure TEButton.PictureChanged(Sender:Tobject);
begin
  if (FPicture<>nil) and (FPicture.Graphic.ClassName='TIcon')
    then FPicture.Icon.handle; //nur verlangen, du brauchst dir das Handle nicht zu merken
   //stell dir einfach vor durch diese Methode verlangst du vom Objekt mal in den Icon-Header zu schauen
end;
Im Constructor:
Delphi-Quellcode:
FGradientDown:=gdTopToBottom;
FPicture:=TPicture.Create;
Fpicture.OnChange:=Picturechanged; //neue Zeile
FPictureOver:=TPicture.Create;
Das musst du wahrscheinlich auch noch für die anderen beiden TPicture machen.

Das scheint ein Fehler in der Implementierung von TPicture bzw TIcon zu sein. Man geht einfach nicht davon aus, dass jemand die Abmaße braucht bevor das Bild gezeichnet wird.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#8

Re: canvas probleme, oder so

  Alt 24. Aug 2007, 16:07
vielen Dank für deine Hilfe...
Es hat auf den ersten Bilck geklappt. Muss den Code noch vervollständigen...
ich schick dann am Montag noch den Code, wie ich es jetzt gemacht habe..

liebe grüsse und ein schönes wochenende

enemyleft
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#9

Re: canvas probleme, oder so

  Alt 31. Aug 2007, 13:31
So, ich hab das bei mir jetzt so implementiert. Ist das unschön? oder kann man das so lassen?

Delphi-Quellcode:
// Das Handle wird nicht benötigt.
// Durch diese Methode verlangt man vom Objekt mal in den Icon-Header zu
// schauen ansonsten könnte man die reale Icongrösse nicht erruieren bevor
// es das erste mal gezeichnet wird.

procedure TEButton.DrawPicture;
begin
  if (FPicture <> nil) then
  begin
    if (FPicture.Graphic is TIcon) then FPicture.Icon.handle;
    Canvas.Draw((Width - FPicture.Width) div 2,(Height - FPicture.Height) div 2 ,FPicture.Graphic);
  end;
end;

procedure TEButton.DrawPictureOver;
begin
 if (FPictureUseOnlyOne) then
 begin
  if (FPicture <> nil) then
  begin
   if (FPicture.Graphic is TIcon) then FPicture.Icon.handle;
   Canvas.Draw((Width - FPicture.Width) div 2,(Height - FPicture.Height) div 2 ,FPicture.Graphic);
  end;
 end
 else
 begin
  if (FPictureOver <> nil) then
  begin
   if (FPictureOver.Graphic is TIcon) then FPictureOver.Icon.handle;
   Canvas.Draw((Width - FPictureOver.Width) div 2,(Height - FPictureOver.Height) div 2 ,FPictureOver.Graphic);
  end;
 end;
end;

procedure TEButton.DrawPictureDown;
begin
 if (FPictureUseOnlyOne) then
 begin
  if (FPicture <> nil) then
  begin
   if (FPicture.Graphic is TIcon) then FPicture.Icon.handle;
   Canvas.Draw((Width - FPicture.Width) div 2,(Height - FPicture.Height) div 2 ,FPicture.Graphic);
  end;
 end
 else
 begin
  if (FPictureDown <> nil) then
  begin
   if (FPictureDown.Graphic is TIcon) then FPicture.Icon.handle;
   Canvas.Draw((Width - FPictureDown.Width) div 2,(Height - FPictureDown.Height) div 2 ,FPictureDown.Graphic);
  end;
 end;
end;

end.
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#10

Re: canvas probleme, oder so

  Alt 31. Aug 2007, 13:54
Zitat von cherry:
Ist das unschön? oder kann man das so lassen?
Na ja, programmiert nach dem Motto "blos nicht Code Teile wiederverwenden, lieber Copy & Paste"
Delphi-Quellcode:
procedure TEButton.DrawPictureOver;
begin
 if (FPictureUseOnlyOne) then
 begin
 (*
  if (FPicture <> nil) then
  begin
    if (FPicture.Graphic is TIcon) then FPicture.Icon.handle;
    Canvas.Draw((Width - FPicture.Width) div 2,(Height - FPicture.Height) div 2 ,FPicture.Graphic);
   end; *)

   DrawPicture; // das ist doch das Gleiche
 end
Andreas
  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 16:51 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