Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi SetWindowPos Problem (https://www.delphipraxis.net/93281-setwindowpos-problem.html)

Shaddow 3. Jun 2007 20:16


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:

  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;
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.

Danke schonmal im Voraus.

xaromz 3. Jun 2007 20:44

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

Luckie 3. Jun 2007 23:29

Re: SetWindowPos Problem
 
Zitat:

Zitat von xaromz
Du holst Dir mit CreateDC ein Handle auf den DC des Desktops. Danach verwendest Du dieses Handle als Fensterhandle

Noch nicht mal das tut er. Das DC-Handle ist fHandle, das Handle für MSDN-Library durchsuchenSetWindowsPos ist Handle. Aber insgesamt stimmt es: MSDN-Library durchsuchenSetWindowsPos erwartet logischer weise ein Fenster-Handle und nix anderes.

Shaddow 3. Jun 2007 23:58

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^^

Luckie 4. Jun 2007 00:08

Re: SetWindowPos Problem
 
Zitat:

Zitat von Shaddow
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^^

Was hat das eine mit dem anderen zu tun? MSDN-Library durchsuchenSetWindowPos erwartet nun mal ein Fenster-Handle und nichts anderes. Was willst du da mit deiner Rect-Struktur?

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: MSDN-Library durchsuchenGetDeviceCaps.

Shaddow 4. Jun 2007 00:29

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

Luckie 4. Jun 2007 07:17

Re: SetWindowPos Problem
 
Plattformunabhängig wird nicht gehen, da nur das Betriebssystem weiß welche Auflösung eingestellt ist.

Shaddow 4. Jun 2007 13:03

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 09:05 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