SetLayeredWindowAttributes
-
Hallo, ich möchte:
SetLayeredWindowAttributes(...);
verwenden.
Ich verwende MS Visual c++ standart.
ich habe schon das SDK installiert und MS Visual Studio Service Pack 5 installiert.Ich habe die Windows.h , Winuser.h includiert und die User32.lib.
Trotzdem kommt 'SetLayeredWindowAttributes' : nichtdeklarierter Bezeichner
1.Was kann ich noch tun?
2.Funktioniert bei euch der Befehl?
3.Gibt es sonnst noch eine Möglichkeit für habtransparente Fenster?Ps. Warum wird das d a r t bei standart weggemacht?
-
Winuser.h musst / sollst du nicht direkt einbinden ("Declared in Winuser.h, include Windows.h")
Da du ja den aktuellen PSDK installiert hast kann ich mir nur noch vorstellen, dass du unter Optionen? bei den Verzeichnissen für Includes und Libs die PSDK-Verzeichnisse nicht ganz oben stehen hast
-
Hallo nochmal!
Also bevor ich das SDK installiert habe funktionierte z.B. RasGetConnectionStatistics() nicht;
Jetzt funktioniert es aber! => Sdk ist wohl richtig installiert, oder?
Ich verstehe noch nicht den Unterschied zwischen
Declared in Winuser.h und include Windows.h.1.Was bedeutet Declared in ?
2.Ich habe nur #include <Windows.h> und user32.lib eingebunden (hoffentlich richtig)3.Ich habe unter Projekt Einstellungn Linker All Versions user32.lib schon eingetragen gefunden. Das reicht doch ,oder?
-
"Declared in" bedeutet, dass diese Funktion in diesem Header deklariert ist. Du darfst aber winuser.h nicht direkt einbinden, das steht da auch: "Declared in Winuser.h, include Windows.h". Wenn du windows.h einbindest, wird winuser.h automatisch mit eingebunden. Immer.
Zu deinem Fehler:
Tu mal "/D_WIN32_WINNT=0x0500" zu den Compiler-Optionen (in den Projekte-Einstellungen ganz rechts unten beim Reiter C/C++) dazu. SetLayeredWindowAttributes gibts erst ab Windows 2000.btw:
Das Wort heißt Standard.
-
ich habe es jetzt so versucht:
#ifndef WS_EX_LAYERED #define WS_EX_LAYERED 0x00080000 #define LWA_ALPHA 0x00000002 #endif typedef bool (CALLBACK* LPFNDLLFUNC1)(HWND,COLORREF,BYTE,DWORD ); HINSTANCE hDLL; LPFNDLLFUNC1 lpfnDllFunc1; hDLL = LoadLibrary("user32.dll"); if (hDLL != NULL) { lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"SetLayeredWindowAttributes"); if (!lpfnDllFunc1) { MessageBox(NULL,"Fehler beim Laden der dll","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION); FreeLibrary(hDLL); } else { SetWindowLong(hMain, GWL_EXSTYLE,GetWindowLong(hMain, GWL_EXSTYLE) | WS_EX_LAYERED); bool klappt; klappt=lpfnDllFunc1(hMain, 0, (255 * 70) / 100, LWA_ALPHA); if (klappt==false) MessageBox(NULL,"Ausführungsfehler","Fehler",MB_OK | MB_ICONINFORMATION); FreeLibrary(hDLL); }
Ich bekomme die 2. Messagebox mit "Ausführungsfehler"
-
und die tranzparenz klappt auch nicht!
-
Wie so oft: Was sagt GetLastError?
-
GetLastError() sagt "Falscher Parameter"
Ich muss noch hinzufügen, dass WS_EX_LAYERED und LWA_ALPHA auch nicht
bekannt sind. Die benuzten Definitionen hab ich auf irgend einer Seite gesehen(die ich leider nicht mehr finde).
Ob diese richtig sind weis ich leider nicht!
-
Dehr Fehler tritt erst in der Zeile
klappt=lpfnDllFunc1(hMain, 0, (255 * 70) / 100, LWA_ALPHA);
auf.
Vorher ist kein Fehler vorhanden!
Das bedeutet doch das die Funktion in der user32.dll gefunden wird, oder?
-
Hast du das #define _WIN32_WINNT 0x0500 ganz oben eingebaut bzw. bei den Compiler-Optionen dann sollte er die Konstanten eigentlich kennen (wenn der Pfade zu den neue Includes des PSDK ganz oben in der Liste steht)
-
Hallo, es klappt jetzt! DANKE !!!
-
Hallo,
das Programm läuft jetzt unter WinXp perfekt.(das Fenster ist halptransparent)
Allerdings möchte ich das Programm auch unter Win 98 und Win Me laufen lassen.
Da es dort die SetLayeredWindowAttributes nicht gibt , erfolgt die Meldung:
Das Programm verweist auf die nicht vorhandene SetLayeredWindowAttributes in user32.dllWie kann ich es machen, daß das Programm trotzdem läuft.?
Ich meine damit das unter Win 98 und co diese Funktion einfach unberücksichtigt bleibt und die Anwendung einfach in einem nicht transparenten
Fenster läuft(anstatt abzustürzen), ohne dass ich 2 Versionen compilieren muss!
-
Wenn du die DLL dynamisch lädst, so wie du das in dem oben geposteten Quellcode gemacht hast, sollte das doch eigentlich kein Problem sein
-
Hallo,
ich konnte das Problem eingrenzen.
Irgendwie mag Win Me
DestroyWindow(GetParent(hMain));
nicht mehr, nachdem ich die Funktion aus der Dll geladen hab.
Es stürzt kommentarlos ab, also auch keine chance für GetLastError!Ohne den versuch die Funktion aus der Dll zu laden is alles OK!
Woran kann das liegen?
-
Hm komisch - ich würde dir aber auf alle Fälle mal empfehlen bei deinem if-else-Konstrukt die geschweiften Klammern so zu setzen, dass es unmissverständlich wird.
if(...) { if(...) { } else { }
Hier siehst du nicht sofort, wozu das else gehört (oder zumindest nicht das ungeschulte Auge
)
-
Hi!
Ich wollte gerade auch einen Transparency-Regler in eine Anwendung einbinden und stieß auf die gleichen Probleme:
1. Nicht Auffinden von den Defines (WS_EX_LAYERED und LWA_ALPHA)
2. Kann ich die Methode "SetLayeredWindowAttributes"Natürlich kann ich die defines nochmal selber definieren und auch die DLL dynamisch laden. Dann klappt es auch.
Aber sollte es nicht reichen die user32.lib in den Projekteigenschaften mit einzubinden? Oder übersehe ich das gerade noch ein kleines Problem?
-
Wenn deine header und libs aktuell sind, sollte das eigentlich auch direkt gehen, imho
-
flenders schrieb:
Wenn deine header und libs aktuell sind, sollte das eigentlich auch direkt gehen, imho
Also da ich mir nicht sicher war habe ich mir mal die Mühe gemacht und nach den defines gesucht und sie auch in dem include-verzeichnis der PSDK innerhalb der datei "winuser.h" gefunden.
Das ist auch in den Optionen mein erstes Verzeichnis zum Suchen nach den includes...
*schaut ratlos*
Ist in den letzten Monaten ne so stark veränderte PSDK gekommen? Meine ist vom Stand Februar 2003. Habe noch keine neuere (gibts überhaupt eine?) installiert da ich noch nie gelesen habe das ich eine Neuere benötige für die Sachen die ich hier gerade benutze.
-
Hab gerade keine aktuellen Header da
, aber evtl. hängt die Definition dieser Konstanten von anderen Konstanten ab (#ifdef)
-
Ich habe es gefunden.........
Da es ja nur ab Win2k geht muß man entweder in jeder Sourcefile nen Define machen oder halt dem Compiler den Parameter:
/D_WIN32_WINNT=0x0500
mitgeben......
Das gleiche Problem habe ich auch gerade mit AllowSetForegroundWindow() gehabt.....
Frage: Laufen die Anwendungen dann eigentlich noch unter zB Win98? Vorausgesetzt natürlich ich achte darauf, daß die entsprechenden Befehle nicht ausgeführt werden können.