Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Flackern des Formulars verhindern (https://www.delphipraxis.net/45967-flackern-des-formulars-verhindern.html)

MrKnogge 15. Mai 2005 18:48


Flackern des Formulars verhindern
 
Hallo,

wenn ich mit folgendem Code mein Formular auf "AlwaysOnTop" setze, flackert es kurzzeitig auf:
Delphi-Quellcode:
if CheckBox1.Checked then
  Form1.FormStyle := fsStayOnTop
else
   Form1.FormStyle := fsNormal;
nun ist mir kürzlich folgende Variante ins Auge gesprungen, bei der das Formular nicht flackert:
Delphi-Quellcode:
if Checkbox1.Checked then
  SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE)
else
  SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);

Nun stehe ich vor dem gleichen (flackerndem) Problem, beim setzen von AlphaBlending.
Gibt es hierzu auch eine Variante das Flackern zu umgehen ?

Kann mir jemand auserdem noch sagen, woran dies liegt, das es bei einer Anweisung zum flackern kommt, und bei einer anderen nicht ?


gruss Christian

PS:
DoubleBuffered habe ich schon versucht, funktioniert nicht, und da mir die obige (nicht flackernde) Lösung nach nonVCL aussah hab ich auch schon luckie's API-Tutorial durchsucht, leider ohne Erfolg.

toms 16. Mai 2005 00:18

Re: Flackern des Formulars verhindern
 
Hallo,

Stichwort: WM_SETREDRAW.
Beispiel: hier

MrKnogge 21. Mai 2005 18:17

Re: Flackern des Formulars verhindern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn ich es aber wie der Tipp beschreibt mache,

Delphi-Quellcode:
procedure LockControl(c: TWinControl; bLock: Boolean);
begin
  if (c = nil) or (c.Handle = 0) then Exit;
  if bLock then
    SendMessage(c.Handle, WM_SETREDRAW, 0, 0)
  else
  begin
    SendMessage(c.Handle, WM_SETREDRAW, 1, 0);
    RedrawWindow(c.Handle, nil, 0,
      RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  LockControl(Form1, True);
  try
    Form1.AlphaBlend := true;
    Form1.AlphaBlendValue := 135;
  finally
    LockControl(Form1, False);
  end;
end;
so bleiben überesste der "alten" Form zurück.

[add]
Das Formular ohne alpha-blending auf dem Bild exisitiert gar nocht mehr,
Windows überzeichnet es nur nicht direkt.

MrKnogge 27. Mai 2005 09:56

Re: Flackern des Formulars verhindern
 
Gibt es denn da wirklich keine andere Möglichkeit ?

gruss

Luckie 27. Mai 2005 10:15

Re: Flackern des Formulars verhindern
 
Dann ruf doch mal MSDN-Library durchsuchenInvalidateRect auf und erzwing ein Neuzeichen des Fesnters.

MrKnogge 27. Mai 2005 10:21

Re: Flackern des Formulars verhindern
 
Erst verhindere ich, dass das Fenster neu gezeichnet wird, und anschliesend zwinge ich es dazu sich neuzuzeichnen :gruebel:
Ist dann nicht alles beim alten ?

egal, ich werd's mal testen.

Luckie 27. Mai 2005 10:28

Re: Flackern des Formulars verhindern
 
Was erwartest du, wenn du du verhinderst, dass das Fenster neu gezeichnet wird? Wie sollen denn dann die Überreste verschwinden? :roll:

MrKnogge 27. Mai 2005 10:35

Re: Flackern des Formulars verhindern
 
also weder
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  LockControl(Form1, True);
  try
    Form1.AlphaBlend := true;
    Form1.AlphaBlendValue := 100;
  finally
    LockControl(Form1, False);
  end;
  InvalidateRect(Form1.Handle, nil, false);
end;
noch
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  LockControl(Form1, True);
  try
    Form1.AlphaBlend := true;
    Form1.AlphaBlendValue := 100;
  finally
    LockControl(Form1, False);
  end;
  InvalidateRect(Form1.Handle, nil, true);
end;
funktioniert :cry:

so hast du's doch gemeint, oder hab ich da was falsch verstanden ?

Zitat:

Zitat von Luckie
Was erwartest du, wenn du du verhinderst, dass das Fenster neu gezeichnet wird? Wie sollen denn dann die Überreste verschwinden? :roll:

klingt logisch, nur dachte ich mir, das dann das "flackern" ebenfalls wieder auftauchen würde.

MrKnogge 12. Jun 2005 14:31

Re: Flackern des Formulars verhindern
 
Kennt sonst noch jemand eine Möglichkeit ?

Ansonsten werd ich mich wohl mit dem Flackern abfinden müssen bzw. AlphaBlending konstant aktiviert lassen.


gruss

runger 12. Jun 2005 14:48

Re: Flackern des Formulars verhindern
 
doublebuffered:=true;

Khabarakh 12. Jun 2005 15:02

Re: Flackern des Formulars verhindern
 
Zitat:

Zitat von runger
doublebuffered:=true;

Zitat:

PS:
DoubleBuffered habe ich schon versucht, funktioniert nicht
:zwinker:

SirThornberry 12. Jun 2005 15:12

Re: Flackern des Formulars verhindern
 
du könntest es noch direkt über die api-funktionen versuchen denn wenn du über form.transparent etc. gehst müsste ein RecreateWindow oder so ausgeführt werden. probiers mal hiermit:
http://www.delphipraxis.net/internal...=340328#340328


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:10 Uhr.

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