Hi,
Du sagst, es hilft nicht wirklich...
Mein Post sollte ja nur ein Denkanstoss sein.
Prinzipiell denke ich schon, dass man mit ScaleBy arbeiten könnte.
Unten habe ich einen weiteren DENKASTOSS (KEINE LÖSUNG) gegeben, wie man die WM_SIZE Message behandeln könnte.
Das Beispiel funktioniert NUR für die Änderung der Breite - und hat jede Menge Schönheitsfehler...
Probleme dabei:
- bei mehrfachem Zoom ändern sich die Schriftgrößen --> müsste also durch "intelligentes" Runden der Zoomfaktoren abgefangen sein
- wenn man die höhe und breite des Fensters gleichzeitig ändert, dann muss man dafür sorgen, dass die Proportionen beibehalten werden...
- es sollte verhindert werden, dass das Fenster kleiner gezoomt werden kann, als es beim Programmstart war
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls;
type
TForm1 =
class(TForm)
Button1: TButton;
Memo1: TMemo;
ComboBox1: TComboBox;
ProgressBar1: TProgressBar;
procedure FormCreate(Sender: TObject);
private
{ Private-Deklarationen }
breite_original: integer;
breite_mininmal: integer;
public
{ Public-Deklarationen }
procedure WndProc(
var Message: TMessage);
override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WndProc(
var Message: TMessage);
var
breite_neu: integer;
begin
if Message.Msg = WM_SIZING
then begin
// die neuen Dimensionen merken
breite_neu := Form1.Width;
// Breite auf die ursprüngliche Breite zurückstellen - sonst funktionier das Skalieren nicht
Form1.Width := breite_original;
// das Fenster soll nicht kleiner gezoomt werden können, als es bei Programmstart war
if breite_neu < breite_mininmal
then begin
breite_neu := breite_mininmal;
end;
// Fenster skalieren
Form1.ScaleBy(breite_neu , breite_original);
// alles neu zeichnen
Form1.Realign;
Form1.Repaint;
Form1.Refresh;
// die aktuelle Breite merken
breite_original := Form1.Width;
end;
inherited WndProc(
Message);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
breite_original := Form1.Width;
breite_mininmal := breite_original;
end;
end.
Mit Anchors habe ich auch schon mal probiert - bin aber auch nicht glücklich damit geworden...
Falls Du eine Lösung findest, interessiert es mich...
Gruß,
Poolspieler