Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Etwas in eine Message Box zeichnen (Canvas) (https://www.delphipraxis.net/22792-etwas-eine-message-box-zeichnen-canvas.html)

isocam 23. Mai 2004 20:39


Etwas in eine Message Box zeichnen (Canvas)
 
hallo,

Ich möchte gerne in eine MessageBox etwas zeichnen, zb. einen Farbverlauf.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i,f,r,g:Integer;
begin

with CreateMessageDialog('Wie gehts ?',mtquestion,[mbyes,mbno]) do try
 ...
 f:=Round(255/Height);
 r:=0;
 g:=255;
 Canvas.Pen.Color:=RGB(r,g,100);
 FOR i:=0 TO Height do begin
  Canvas.MoveTo(0,i);
  Canvas.LineTo(Width,i);
  Inc(r,f);
  Dec(g,f);
  Canvas.Pen.Color:=RGB(r,g,100);
 end;
 repaint;
 ...
 finally
 ...
end;
end;
Ich habe diesen Code benutzt, um einen Farbverlauf in die MessageBox zu zeichnen. Aber es ist nur dieses schnöde Windowsgrau zu sehen. Keine Fehlermeldung vom Compiler.
Wäre schön, wenn mir jemand helfen könnte.

Christian Seehase 23. Mai 2004 20:52

Re: Etwas in eine Message Box zeichnen (Canvas)
 
Moin isocam,

das Problem wird sein, dass das Grau Standard ist.
Damit der Farbverlauf angezeigt wird, müsstest Du ihn zu dem Zeitpunkt aufbringen, wenn der Dialog gezeichnet wird, also müsstest Du noch eine Methode vom Typ TNotifyEvent einbauen, die dann dem OnPaint des Dialoges zugwiesen wird.
In dieser Methode wird dann der Verlauf gezeichnet.

Bernhard Geyer 23. Mai 2004 20:53

geht so nicht!
 
Dazu müsstest Du die Zeichenroutine im OnPaint-Ereignis unterbringen.

So wird zwar einmal der Farbverlauf temporär auf das Canvas gezeichnet, aber sobald dieser neu gezeichnet werden muß (z.B. wenn Formular angezeigt wird, wird der Cancas gelöscht.

Eine Möglichkeit wäre z.B. im Hintergrund des Formulars ein Image abzulegen, welcher den Farbverlauf beinhaltet.

isocam 23. Mai 2004 20:58

Re: Etwas in eine Message Box zeichnen (Canvas)
 
Und wie mache ich das?
(Ich bin kein Experte.)

Christian Seehase 23. Mai 2004 21:14

Re: Etwas in eine Message Box zeichnen (Canvas)
 
Moin isocam,

mal ein Beispiel:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    //...
    // OnPaint für den Dialog
    procedure MessageDlgPaint(Sender: TObject);
  private
    { Private-Deklarationen }
    FMessageDlg : TForm;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FMessageDlg        := CreateMessageDialog('Wie gehts ?',mtWarning,[mbyes,mbno]);
  FMessageDlg.OnPaint := MessageDlgPaint;
end;

procedure TForm1.MessageDlgPaint(Sender: TObject);

var
  i,f,r,g:Integer;

begin
  f:=Round(255/Height);
  r:=0;
  g:=255;
  FMessageDlg.Canvas.Pen.Color:=RGB(r,g,100);
  for i:=0 TO FMessageDlg.Height do begin
    FMessageDlg.Canvas.MoveTo(0,i);
    FMessageDlg.Canvas.LineTo(Width,i);
    Inc(r,f);
    Dec(g,f);
    FMessageDlg.Canvas.Pen.Color:=RGB(r,g,100);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if FMessageDlg.Showmodal = mrNo then exit;
end;

Bernhard Geyer 23. Mai 2004 21:16

Re: Etwas in eine Message Box zeichnen (Canvas)
 
Gerade fertig geworden - aber schon wieder zu langsam :wink:

isocam 23. Mai 2004 21:21

Re: Etwas in eine Message Box zeichnen (Canvas)
 
Danke für die Hilfe.
Das verstehe ich aber nicht. (vielleicht morgen wenn ich konzentriert bin)

Christian Seehase 23. Mai 2004 21:44

Re: Etwas in eine Message Box zeichnen (Canvas)
 
Moin isocam,

FMessageDlg ist ein privates Feld des Hauptformulares. Irgenwo muss der Dialog ja gespeichert werden, damit er mehrfach genutzt werden kann.
MessageDlgPaint ist das TNotifyEvent, dass der OnPaint Eigenschaft des Dialoges zugewiesen werden soll.

Beim Erzeugen des Hauptformulares werden dann der Dialog erzeugt, und die OnPaint Routine zugewiesen.

Die MessageDlgPaint Methode enthält dann das, was auf das Dialogformular gezeichnet werden soll, wenn es gezeichnet wird.
Diese Routine wird automatisch immer dann aufgerufen, wenn das Formular neu gezeichnet wird.

Bei der ButtonClick Methode handelt es sich nur um ein Beispiel den Dialog anzuzeigen.

isocam 24. Mai 2004 18:54

Re: Etwas in eine Message Box zeichnen (Canvas)
 
Vielen Dank.
Ich denke, dass ich es jetzt verstanden habe und anwenden kann.

Jens Schumann 24. Mai 2004 19:25

Re: Etwas in eine Message Box zeichnen (Canvas)
 
Hallo Christian,
guter Vorschlag! Nur leider ist das Label nicht transparent.
Das Label ist aber ein privates Feld von TMessageForm. Dummerweise
ist TMessageForm im implementation Abschnit von Dialogs implementiert.
Damit der Compiler nicht zickt habe ich die Deklaration in der
Form-unit einfach wiederholt:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    FMessageDlg : TForm;
    procedure MessageDlgPaint(Sender: TObject);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.MessageDlgPaint(Sender: TObject);
var
  i,f,r,g:Integer;
begin
  f:=Round(255/Height);
  r:=0;
  g:=255;
  FMessageDlg.Canvas.Pen.Color:=RGB(r,g,100);
  for i:=0 TO FMessageDlg.Height do begin
    FMessageDlg.Canvas.MoveTo(0,i);
    FMessageDlg.Canvas.LineTo(Width,i);
    Inc(r,f);
    Dec(g,f);
    FMessageDlg.Canvas.Pen.Color:=RGB(r,g,100);
  end;
end;

Type
  TMessageForm = class(TForm)
  private
    Message: TLabel;
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FMessageDlg        := CreateMessageDialog('Wie gehts ?',mtWarning,[mbyes,mbno]);
  TMessageForm(FMessageDlg).Message.Transparent:=True;
  FMessageDlg.OnPaint := MessageDlgPaint;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if FMessageDlg.Showmodal = mrNo then exit;

end;

end.
Komischerweise funktioniert das. Ich weiss aber nicht warum und habe deshalb ein ungutes Gefühl.
Evt. habe ich auch gerade ein Brett vor dem Kopf. Weiss jemand warum das hier klappt?
Oder sollte man soetwas nicht machen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:31 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz