WinAPI ersetzen möglich?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

WinAPI ersetzen möglich?

Beitrag von DarkSoul »

Ich versuche immer, direkte WinAPI-Aufrufe zu vermeiden, weil dadurch die Kompatiblität zu Linux verloren geht. Ich meine damit diejenigen Befehle, die direkt aus den Windows-Bibliotheken stammen und mit einem '_' enden.

Manchmal bekomme ich es nicht ohne hin.

Gibt es für diese 3 nachfolgenden Codefragmente bessere Lösungen, so dass sie unter Linux funktionieren?

Wenn es ohne API nicht geht, wie sehen dann die Linux-Gegenstücke aus?

(Die vorangehenden Initialisierungen usw. habe ich mal weggelassen, weil das zu viel sein wird. Also OpenWindow() etc. passiert vorher und der Eventteil befindet sich in wirklichkeit in einer größeren Schleife)

Code: Alles auswählen

;define a color as transparent to get a shaped window
SetWindowLong_(WindowID(0), #GWL_EXSTYLE, #WS_EX_LAYERED | #WS_EX_TOPMOST)
SetLayeredWindowAttributes_(WindowID(0), transparentColor, 0, #LWA_COLORKEY) ;transparentColor = $ff00ff or $00ff00

;Mousecursor = Zeigefingerhand
SetClassLong_(WindowID(0), #GCL_HCURSOR, LoadCursor_(0, #IDC_HAND))

;entire window is draggable (by simulating the click-event to the title bar)
event = WaitWindowEvent(mainLoopInterval)
If event = #WM_LBUTTONDOWN 
  SendMessage_(WindowID(0), #WM_NCLBUTTONDOWN, #HTCAPTION, 0) 
EndIf
- Die Fensterform wird durch eine Bilddatei bestimmt. Eine Farbe bestimmt, welche Bereiche transparent sind
- Die Bilddatei ändert sich zur Laufzeit, so dass auch das Fenster die Form ändert
- Die Bilddatei befindet sich in einem ImageGadget, welches hinter allem anderen liegt.
- Man muss durch die transparenten Bereiche hindurchklicken können
- Der nicht-transparente Bereich muss Klick-Events akzeptieren
- Der Hand-Cursor muss unter Linux nicht zwingend funktionieren, hier reicht auch der normale Pfeil. Notfalls wird das mit CompilerIf umschifft. Wichtiger sind die anderen 2
- Egal, wo man auf das Fenster klickt und zieht, es muss sich verschieben lassen.
- Das Fenster ist borderless und immer im Vordergrund
- MacOS ist egal. Wird eh nicht unterstützt
Bild
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: WinAPI ersetzen möglich?

Beitrag von RSBasic »

Ohne API ist das nicht möglich.

Fenstertransparent:
http://www.chabba.de/Linux/Window/Windo ... parency.pb
http://www.chabba.de/Linux/Window/Windo ... arency2.pb

Mauscursor ändern: http://www.chabba.de/Linux/Window/Window_SetCursor.pb

Fenster mit der Maus verschieben: http://www.chabba.de/Linux/Window/Windo ... yBgDrag.pb

Die Linux-Beispielcodes habe ich aber nicht getestet, da ich kein Linux habe.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
udg
Beiträge: 568
Registriert: 20.06.2013 23:27

Re: WinAPI ersetzen möglich?

Beitrag von udg »

DarkSoul hat geschrieben: - Die Bilddatei befindet sich in einem ImageGadget, welches hinter allem anderen liegt.
- Man muss durch die transparenten Bereiche hindurchklicken können
- Der nicht-transparente Bereich muss Klick-Events akzeptieren
- Egal, wo man auf das Fenster klickt und zieht, es muss sich verschieben lassen.
- Das Fenster ist borderless und immer im Vordergrund
- MacOS ist egal. Wird eh nicht unterstützt
Diese Methode habe ich bei meinem Musik v2m player angewandt und funktioniert einwandfrei.
Der Player kann mit der Maus verschoben werden.
Meine Methode:
Rahmenloses Fenster. In diesem als Hintergrund Grafik die Player Grafik. Alpha key für schwarz festgelegt.
Das zweite Fenster liegt darüber und beinhaltet eigene grafikbuttons, EQs, vu meter usw. Dieses Fenster ist ebenfalls Rahmenlos und transparent, zeigt nur an was ich festgelegt habe.
Zum Schluss beide sticky und nun hat man theoretisch 1 Fenster. Die Form gibt die Grafik an und es kann an jeder Stelle mit der Maus gegrab'd werden und verschoben.

Windows

Bild
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: WinAPI ersetzen möglich?

Beitrag von DarkSoul »

@RSBasic:
Das habe ich befürchtet... Muss ich mich wohl da durch die Links durchnagen. Ich habe von Linux auch keine Ahnung. :cry:
Mist.....

@udg:
Dein Beitrag habe ich nicht wirklich verstanden. Was heißt das in Code bzw. wie hast du das konkret gemacht? Mit zwei Fenstern übereinander stelle ich mir das irgendwie wackelig und unelegant vor.
Meine Methode erfreut sich ebenfalls bester Funktionalität - Nur leider derzeit Windows-only, aber dafür mit nur einem Fenster. :wink:
Was auf deinem Screenshot zu sehen ist, ist genau das, was ich brauche (bis auf die Alpha-Abstufungen. 1-Bit-Transparenz reicht in meinem Fall völlig).
Kann ich mir das Programm, das im Screenshot zu sehen ist, irgendwo herunterladen?
Bild
Benutzeravatar
udg
Beiträge: 568
Registriert: 20.06.2013 23:27

Re: WinAPI ersetzen möglich?

Beitrag von udg »

Der Player ist noch nicht codeseitig aufgeräumt :mrgreen: und auch noch nicht public. Bin zu 98% fertig. Muss noch createmutex einbauen das der Player sich nur einmal starten kann. Drag and drop ist auch noch nicht fertig,playlist und kleinigkeiten aber ansonsten geht er schon sehr gut. Beim starten wird die dateiendung sowie das programm icon registriert damit v2m music mein icon der exe zugewiesen bekommt und es nun per doppelklick auf einen v2m Song den Player automatisch startet.
http://www74.zippyshare.com/v/0i3C02m9/file.html

Ist nun leider auch Zippyshare. Kenne keinen anderen schnellen freehoster.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
Bisonte
Beiträge: 2474
Registriert: 01.04.2007 20:18

Re: WinAPI ersetzen möglich?

Beitrag von Bisonte »

Aber nur Windows, oder ? DS fragte ja nach Windows UND Linux. Nützt ja nix, wenn es nur auf einem der beiden OS läuft.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
udg
Beiträge: 568
Registriert: 20.06.2013 23:27

Re: WinAPI ersetzen möglich?

Beitrag von udg »

Der Player ist Windows.
Ob man meine Fenster - Funktion mit Linux nutzen kann weiß ich nicht. Ich poste später mal den Code.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Antworten