Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi UpdateLayerWindow - Invalid Parameter (https://www.delphipraxis.net/110598-updatelayerwindow-invalid-parameter.html)

Neutral General 20. Mär 2008 16:36


UpdateLayerWindow - Invalid Parameter
 
Hi,

Habe hier ein Formular mit WS_EX_LAYERED. Jedoch flackert das Fenster relativ stark beim resizen und verschieben. Also schätze ich muss ich beim resizen und verschieben UpdateLayeredWindow aufrufen.

Wenn das bis hierhin falsch ist, dann braucht ihr gar nicht weiterzulesen, dann klärt mich auf^^

So ich tue das im Moment so:

Delphi-Quellcode:
WM_SIZE: begin
            // bf: _BLENDFUNCTION      
            bf.BlendOp := AC_SRC_OVER;
            bf.BlendFlags := 0;
            bf.AlphaFormat := 0;
            bf.SourceConstantAlpha := FAlpha;
            // NewSize: TSize
            NewSize.cx := FWidth;
            NewSize.cy := FHeight;

            if not UpdateLayeredWindow(Handle,0,nil,@NewSize,GetDC(Handle),nil,0,@bf,ULW_ALPHA)
              ShowMessage(SysErrorMessage(GetLastError)); // Zu testzwecken
          end;
Ich bekomme immer den Fehler:

Zitat:

---------------------------
Message
---------------------------
The parameter is incorrect
---------------------------
OK
---------------------------
Was mache ich denn da falsch? Habs mir bei MSDN angeguckt und ich mache alles so wies da steht. Habs auch schon mit CreateCompatibleDC(GetDC(Handle)) versucht statt nur GetDC(Handle), ändert aber nichts.

Gruß
Neutral General

Neutral General 22. Mär 2008 15:32

Re: UpdateLayerWindow - Invalid Parameter
 
Wollte mal nachfragen ob mir da vielleicht doch jemand helfen kann?

toms 22. Mär 2008 15:37

Re: UpdateLayerWindow - Invalid Parameter
 
Hallo, vielleicht hilft dir das weiter

VnCoders 22. Mär 2008 15:46

Re: UpdateLayerWindow - Invalid Parameter
 
I saw that there is not anything wrong with UpdateLayeredWindow parameters, you use wrong "if...then" clause.
The correct is
Code:
if not UpdateLayeredWindow(Handle,0,nil,@NewSize,GetDC(Handle),nil,0,@bf,ULW_ALPHA) then

Neutral General 22. Mär 2008 15:53

Re: UpdateLayerWindow - Invalid Parameter
 
Hi,

Oh yes I see, but that was only a mistake caused by copy&paste ;)
In the original code it looks like this:

Delphi-Quellcode:
if not UpdateLayeredWindow(Handle,0,nil,@NewSize,GetDC(Handle),nil,0,@bf,ULW_ALPHA) then
  ShowMessage('Fehler!');
@toms: Ne das ist nicht das Problem. Die Deklaration von UpdateLayeredWindow ist bei mir in Ordnung. Benutze Delphi7.

Gruß
Neutral General

VnCoders 23. Mär 2008 17:59

Re: UpdateLayerWindow - Invalid Parameter
 
I use Delphi 7 also. I complied your code with the correct "if...then" and everything is fine. Maybe there is a library declaration conflict with your Delphi. Some libraries have the same API header but different parameters.

toms 23. Mär 2008 18:51

Re: UpdateLayerWindow - Invalid Parameter
 
Setzte AlphaBlend vor dem Aufruf der Funktion UpdateLayerWindow auf False,
und rufe zusätzlich vorher

Delphi-Quellcode:
    SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
auf. Dann gibt es keinen Fehler (getestet unter D6 & D2007)
Eine Erklärung dafür habe ich noch nicht.

Testfunktion:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Bmp: TBitmap;
  BlendFunc: TBlendFunction;
  PosPt, ZeroPt: TPoint;
  Size: TSize;
begin
  // Create bitmap for our layered window
  Bmp := TBitmap.Create;
  Try
    Bmp.Width := Width;
    Bmp.Height := Height;
    Bmp.Canvas.Brush.Color := clBlue;
    Bmp.Canvas.FillRect(Rect(0, 0, Bmp.Width, Bmp.Height));
    {>>>>} AlphaBlend := False;
    // Enable the layered style
    SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
    // Assign the bitmap to the layered window
    BlendFunc.BlendOp := AC_SRC_OVER;
    BlendFunc.BlendFlags := 0;
    BlendFunc.SourceConstantAlpha := 128;
    BlendFunc.AlphaFormat := 0;
    PosPt := BoundsRect.TopLeft;
    Size.cx := Width;
    Size.cy := Height;
    ZeroPt := Point(0, 0);
    Win32Check(UpdateLayeredWindow(Handle, GetDC(0), @PosPt, @Size, Bmp.Canvas.Handle,
      @ZeroPt, clnone, @BlendFunc, ULW_ALPHA));
  finally
     Bmp.Free;
  end;

end;

SirThornberry 23. Mär 2008 21:49

Re: UpdateLayerWindow - Invalid Parameter
 
Zitat:

Eine Erklärung dafür habe ich noch nicht.
Auf was beziehst du das? Auf den benötigten Aufruf von SetWindowLong? :gruebel:

toms 23. Mär 2008 22:03

Re: UpdateLayerWindow - Invalid Parameter
 
Zitat:

Zitat von SirThornberry
Zitat:

Eine Erklärung dafür habe ich noch nicht.
Auf was beziehst du das? Auf den benötigten Aufruf von SetWindowLong? :gruebel:

Genau, da SetWindowLong ja auch beim Setzen von AlphaBlend = True aufgerufen wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:04 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 by Thomas Breitkreuz