AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi UpdateLayerWindow - Invalid Parameter
Thema durchsuchen
Ansicht
Themen-Optionen

UpdateLayerWindow - Invalid Parameter

Ein Thema von Neutral General · begonnen am 20. Mär 2008 · letzter Beitrag vom 23. Mär 2008
Antwort Antwort
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

UpdateLayerWindow - Invalid Parameter

  Alt 20. Mär 2008, 15:36
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: UpdateLayerWindow - Invalid Parameter

  Alt 22. Mär 2008, 14:32
Wollte mal nachfragen ob mir da vielleicht doch jemand helfen kann?
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#3

Re: UpdateLayerWindow - Invalid Parameter

  Alt 22. Mär 2008, 14:37
Hallo, vielleicht hilft dir das weiter
Thomas
  Mit Zitat antworten Zitat
VnCoders

Registriert seit: 19. Mär 2008
4 Beiträge
 
#4

Re: UpdateLayerWindow - Invalid Parameter

  Alt 22. Mär 2008, 14:46
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
Build your own Defragger, File Recovery... at: http://VnCoders.com
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: UpdateLayerWindow - Invalid Parameter

  Alt 22. Mär 2008, 14:53
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
VnCoders

Registriert seit: 19. Mär 2008
4 Beiträge
 
#6

Re: UpdateLayerWindow - Invalid Parameter

  Alt 23. Mär 2008, 16:59
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.
Build your own Defragger, File Recovery... at: http://VnCoders.com
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#7

Re: UpdateLayerWindow - Invalid Parameter

  Alt 23. Mär 2008, 17:51
Setzte AlphaBlend vor dem Aufruf der Funktion UpdateLayerWindow auf False,
und rufe zusätzlich vorher

    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;
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: UpdateLayerWindow - Invalid Parameter

  Alt 23. Mär 2008, 20:49
Zitat:
Eine Erklärung dafür habe ich noch nicht.
Auf was beziehst du das? Auf den benötigten Aufruf von SetWindowLong?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#9

Re: UpdateLayerWindow - Invalid Parameter

  Alt 23. Mär 2008, 21:03
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?
Genau, da SetWindowLong ja auch beim Setzen von AlphaBlend = True aufgerufen wird.
Thomas
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:18 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