Merken der Window-Position, immer +8, +30 unter Win7



  • Hi,

    ich versuche derzeit mir die Position meines Hauptanwendungsfensters in einer Konfigurationsdatei zu merken.

    Dazu habe ich in der WndProc das WM_MOVE Event abgefangen und merke mir dort die Fensterpositon wie folgt:

    case WM_MOVE:
    {
      UINT left = LOWORD(lParam);
      UINT top = HIWORD(lParam);
      ConfigurationManager::getInstance()->setMainWindowLeft((int)left);
      ConfigurationManager::getInstance()->setMainWindowTop((int)top);
    }
    

    Nun stelle ich aber fest, dass left stets +8 und top stets +30 ist.

    Dann habe ich probiert dies mit einer Abfrage von
    ::GetSystemMetrics(SM_CXEDGE) und ::GetSystemMetrics(SM_CXFIXEDFRAME) zu kompensieren, aber SM_CXEDGE liefert gerade mal den Wert 2 und SM_CXFIXEDFRAME gerade mal den Wert 3. Also beides viel zu gering.

    Somit habe ich den Effekt, dass mein Hauptfenster immer um 8, 30 Pixel wandert wenn ich das Programm starte, selbst wenn ich das Fenster halt nicht bewege und es eigentlich bei 0, 0 stehen sollte.

    Woran liegt das? Und wie kann ich das kompensieren? Ich kann ja sicherlich den Offset von +8/+30 nicht fest codieren, denn die Rahmen- und Titelgröße kann ja sicherlich von Windows-Version und Skin je nach Anwender variieren, oder?

    Viele Grüße und vielen Dank für alle Antworten im voraus,
    Bojana



  • Falsches Forum, du willst zur Winapi.
    Du kannst das Problem mit AdjustWindowRect beheben.



  • GetWindowRect



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Bitte entschuldigt, dass ich das im falschen Bereich gepostet habe.

    Wo muss ich eine der beiden o.g. Funktionen anwenden? Beim speichern der Position oder beim lesen? Sorry, dass ist mir noch nicht klar.

    Viele Grüße
    Bojana



  • GetWindowPlacement() ist, was du suchst... 😉



  • Das was du suchst ist GetWindowRect().
    Die Positionen werden in RECT gespeichert, und dann kannst du sie auswerten.



  • das ist ja ne lustige rate-runde hier^^



  • Hi,

    WM_MOVE schickt wie WM_SIZE die Position (resp. Größe) der ClientArea mit. Beim Erzeugen eines Fensters gibst Du aber die Position und Größe des ganzen Fensters an.

    Warum willst Du auch die Position des Fensters beim Erhalt von WM_MOVE speichern? Es genügt doch diese beim Beenden Deiner Applikation zu speichern. Wie auch immer: Du benötigst, wie schon andere geschrieben haben, die Funktion GetWindowRect.

    void getPosition( int *xPos, int *yPos )
    {
    	RECT	rect;
    
    	GetWindowRect( winHandle, &rect );
    	*xPos = rect.left;
    	*yPos = rect.top;
    }
    

    mfg Martin



  • Um die Platzierung des Fensters deiner Anwendung vollständig speichern und wiederherstellen zu können, reicht es im Allgemeinen nicht, einfach nur die Position und Größe des Fensters beim Programmende zu speichern. Man muss auch so Dinge berücksichtigen wie ob das Fenster minimiert oder maximiert ist. Man kann jetzt natürlich alle möglichen Messages abfangen und sich intern alles mitschreiben, sodass man dann alle notwendigen Infos speichern kann. Oder man kann einfach GetWindowPlacement() aufrufen. Windows hat all diese Infos notwendigerweise sowieso...


Anmelden zum Antworten