![]() |
SetWindowPos Problem
Hi Leute,
also nachdem ich nun schon eine Weile google, einschlägige Seiten besucht habe und auch dieses Forum durchsucht habe, steh ich nach wie vor vor meinem Problem mit dem DC. Ich beschreib es euch mal: Ich erzeuge mit SDL ein Fenster (also kein Windows Standartform), indem später eine OpenGL Simulation abläuft aber das ist eher nebensächlich und für das Problem nicht relevant. Es gibt von SDL keine mitgelieferte Funktion, um die Position des Fensters festzulegen, deswegen will ich mir das fuer Windows und Linux separat schreiben. Was ich bisher habe:
Delphi-Quellcode:
Das Problem ist nun, es ist vollkommen egal, mit welchen Werten ich das Create aufrufe, die Position des Fensters stimmt nie. Erzeuge ich den DC falsch? Oder ruf ich die Funktion irgendwie falsch auf? Tapp hier grad echt im Dunkeln.TSE_Window = class(TObject) private fHandle : HDC; fParentHandle : HDC; [...] public property Handle : HDC read fHandle; property ParentHandle : HDC read fParentHandle; [...] end; constructor TSE_Window.Create (const NWindowCaption, NWindowIcon: pChar; NTop, NLeft, NScreenWidth, NScreenHeight: Integer; NBitPerPixel: Cardinal = 32; NFullScreen: Boolean = FALSE); var text:pchar; begin inherited Create; fHandle := CreateDC('DISPLAY',nil,nil,nil); fParentHandle := GetDesktopWindow(); [...Windowcreate; Videoflags,Attribute,Extensions lesen, usw...] SetWindowPos(Handle,HWND_TOP,NLeft,NTop,NScreenWidth,NScreenHeight,SWP_NOZORDER); end; Danke schonmal im Voraus. |
Re: SetWindowPos Problem
Hallo,
irgendwie ist mir der Quellcode nicht ganz klar. Du holst Dir mit CreateDC ein Handle auf den DC des Desktops. Danach verwendest Du dieses Handle als Fensterhandle, das Du an SetWindowPos weitergibst. Was willst Du damit erreichen? Ich kann in Deinem Quellcode auch nirgends erkennen, wo Du ein Fenster erstellst. Erzähl doch mal genau, was Du machen willst, und zeigt dabei vielleicht etwas mehr Code. Gruß xaromz |
Re: SetWindowPos Problem
Zitat:
![]() ![]() |
Re: SetWindowPos Problem
Ja ich habe in Setposition beim Beschreiben des Problems das f vergessen. Es haette
SetWindowPos(fHandle,HWND_TOP,NLeft,NTop,NScreenWi dth,NScreenHeight,SWP_NOZORDER); heissen muessen. Das parenthandle auf den Desktop war dazu da, dass ich die Auflösung ermitteln kann. Ich habe eine Übergangslösung herausgefunden:
Delphi-Quellcode:
fHandle, fParentHandle: HDC;
fParentWindowRect: TRect; fWindowInfo: TSDL_SysWMinfo; {$IFDEF WIN32} fHandle := CreateDC('DISPLAY',nil,nil,nil); fParentHandle := GetDesktopWindow(); GetWindowRect(fParentHandle, fParentWindowRect); {$ELSE} {$ENDIF} SDL_VERSION(fWindowInfo.version); SDL_GetWMInfo(@fWindowInfo); {$IFDEF WIN32} SetWindowPos(fWindowInfo.window,0,fLeft,fTop,0,0,SWP_NOSIZE OR SWP_NOZORDER OR SWP_SHOWWINDOW); {$ELSE} fWindowInfo.info.x11.lock_func(); XMoveWindow(fWindowInfo.info.x11.display,fWindowInfo.info.x11.wmwindow,fLeft,fTop); fWindowInfo.info.x11.unlock_func(); {$ENDIF} Ich benutze den ParentHandle, um die Auflösung des Bildschirms zu ermitteln, denn bevor ich Fullscreen aktiviere, muss ich mein Fenster auf diese Größe ausdehnen. Das Problem ist nun, dass ParentWindowRect vom Typ TRect ist, den möchte ich aber nicht verwenden, und da mein eigenes Rekord nicht bei der Funktion GetWindowRect funktioniert, brauche ich eine andere Möglichkeit die Auflösung herauszufinden. Kann sein, dass meine Variante, die Auflösung zu ermitteln, sehr umständlich ist, kommt mir zumindest so vor^^ |
Re: SetWindowPos Problem
Zitat:
![]() Wie bekomme ich einen Nagel in die Wand? Antwort: Mit einm Hammer. Wie bekomme ich eine Schraube in die Wand? Antwort: Mit eine Schraubenzieher. Wie bekomme ich eine Schraube mit einen Hammer in die Wand? Antwort: Gar nicht, dazu nimmt man den Schraubenzieher. Kurz, das eine hat mit dem anderen gar nichts zu tun. Und was die Bildschirmauflösung angeht: ![]() |
Re: SetWindowPos Problem
Du drehst ne Schraube mit nem Schraubenzieher in die Wand? oO
Ich habe doch eindeutig geschrieben, dass es mir inzwischen um die Funktion GetWindowRect geht und nichtmehr um SetWindowPos. Meine Positionierung habe ich ja schon hinbekommen, nur zieht meine Lösung ein weiteres Problem nach sich, nämlich dass ich die Auflösung meines Monitors ermitteln muss. Dazu nehm ich den Handle des Desktops und hol mir mit GetWindowRect die Maße. Ich möchte aber GetWindowRect nicht nehmen, wenn es sich nicht vermeiden lässt und da mir das sowieso alles ein wenig umständlich vorkommt, such ich nach einer eleganteren Lösung. Die momentan anstehende Frage lautet also schlicht: Wie bekomm ich so einfach wie möglich (nach Möglichkeit plattformunabhängig, muss aber nicht sein) die Auflösung raus? GetDeviceCaps hat mir dann geholfen ;) Danke |
Re: SetWindowPos Problem
Plattformunabhängig wird nicht gehen, da nur das Betriebssystem weiß welche Auflösung eingestellt ist.
|
Re: SetWindowPos Problem
Doch geht:
Delphi-Quellcode:
AvailableVModes : PPSDL_Rect;
AvailableVModes := SDL_ListModes(nil, SDL_FULLSCREEN or SDL_HWSURFACE); fScreenWidth := (AvailableVModes^)^.w; fScreenHeight := (AvailableVModes^)^.h; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:08 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