AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi SetWindowPos Problem

SetWindowPos Problem

Ein Thema von Shaddow · begonnen am 3. Jun 2007 · letzter Beitrag vom 4. Jun 2007
Antwort Antwort
Shaddow

Registriert seit: 3. Jun 2007
4 Beiträge
 
#1

SetWindowPos Problem

  Alt 3. Jun 2007, 20:16
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.
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: SetWindowPos Problem

  Alt 3. Jun 2007, 20:44
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
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)
Online

Registriert seit: 29. Mai 2002
35.141 Beiträge
 
Delphi 2006 Professional
 
#3

Re: SetWindowPos Problem

  Alt 3. Jun 2007, 23:29
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.
Michael
"Every language has an optimization operator. In Delphi that operator is: //"
  Mit Zitat antworten Zitat
Shaddow

Registriert seit: 3. Jun 2007
4 Beiträge
 
#4

Re: SetWindowPos Problem

  Alt 3. Jun 2007, 23:58
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^^
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)
Online

Registriert seit: 29. Mai 2002
35.141 Beiträge
 
Delphi 2006 Professional
 
#5

Re: SetWindowPos Problem

  Alt 4. Jun 2007, 00:08
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.
Michael
"Every language has an optimization operator. In Delphi that operator is: //"
  Mit Zitat antworten Zitat
Shaddow

Registriert seit: 3. Jun 2007
4 Beiträge
 
#6

Re: SetWindowPos Problem

  Alt 4. Jun 2007, 00:29
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)
Online

Registriert seit: 29. Mai 2002
35.141 Beiträge
 
Delphi 2006 Professional
 
#7

Re: SetWindowPos Problem

  Alt 4. Jun 2007, 07:17
Plattformunabhängig wird nicht gehen, da nur das Betriebssystem weiß welche Auflösung eingestellt ist.
Michael
"Every language has an optimization operator. In Delphi that operator is: //"
  Mit Zitat antworten Zitat
Shaddow

Registriert seit: 3. Jun 2007
4 Beiträge
 
#8

Re: SetWindowPos Problem

  Alt 4. Jun 2007, 13:03
Doch geht:
Delphi-Quellcode:
    AvailableVModes : PPSDL_Rect;

  AvailableVModes := SDL_ListModes(nil, SDL_FULLSCREEN or SDL_HWSURFACE);

    fScreenWidth := (AvailableVModes^)^.w;
    fScreenHeight := (AvailableVModes^)^.h;
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf