Bildschirmauflösung (Zentrierte Formplatzierung)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Bildschirmauflösung (Zentrierte Formplatzierung)

    Hallo zusammen!

    Bin da gerade wieder bei einem Punkt stecken geblieben und zwar bei der Abfrage der Bildschirmauflösung in Pixel.
    Und zwar habe ich vor, meine erst geladene Form genau in die Mitte des jeweiligen User-Bildschirms zu platzieren.
    Dies möchte ich nun durch die Abfrage der Bildschirm-Auflösung realisieren.

    Gibt es eigentlich eine Funktion, die die Form zentriert lädt?? Habe da leider nichts gefunden.

    Nun zum Problem:

    Folgende Fehlermeldungen werden durch den unterstehenden Code ausgelöst:

    error C2065: 'SM_CXSCREEN' : undeclared identifier
    error C2065: 'SM_CYSCREEN' : undeclared identifier
    error C3861: 'GetSystemMetrics': identifier not found, even with argument-dependent lookup
    error C3861: 'GetSystemMetrics': identifier not found, even with argument-dependent lookup
    error C2365: 'GetSystemMetrics' : redefinition; previous definition was a 'formerly unknown identifier'
    (Dieser Fehler bezieht sich auf die WinUser Datei (WinUser.h)

    Quellcode

    1. private: System::Void Form1_Load(System::Object * sender, System::EventArgs * e)
    2. {
    3. int formHoehe, formBreite;
    4. //X- und Y-Achsen Pixel abfragen => Auflösung
    5. formBreite = GetSystemMetrics(SM_CXSCREEN);
    6. formHoehe = GetSystemMetrics(SM_CYSCREEN);
    7. }


    Fehler in WinUser.h

    Quellcode

    1. WINUSERAPI
    2. int
    3. WINAPI
    4. GetSystemMetrics(
    5. IN int nIndex); //Compiler motzt hier



    Habe schon gegoogelt und auf MSDN nachgeschaut, aber nichts gescheites gefunden zu diesem "GetSystemMetrics"-Fehler. Es sollte gehen..

    Könnt ihr mir auf die Sprünge helfen? Finde einfach nichts gescheites mehr..

    Danke!
    Gruss jott
  • Hab's in der Form1.cpp included, aber es ändert sich nichts. Wenn es hilft; hier die Liste des Eingefügten:

    Quellcode

    1. #include "stdafx.h"
    2. #include "Form1.h"
    3. #include "frmAnleitung.h"
    4. #include <windows.h>
    5. #include <stdio.h>
    6. #include <iostream>
    7. #include <stdlib.h>
    8. #include <WinUser.h>
    9. #using <mscorlib.dll>
    10. using namespace std;
    11. using namespace MoveUrBall;
    Alles anzeigen


    im namespace MoveUrBall ist folgendes enthalten:

    Quellcode

    1. using namespace System;
    2. using namespace System::IO;
    3. using namespace System::Text;
    4. using namespace System::ComponentModel;
    5. using namespace System::Collections;
    6. using namespace System::Windows::Forms;
    7. using namespace System::Data;
    8. using namespace System::Drawing;


    Hm, laut MSDN sollte es deklariert sein..ist es aber irgendwie nicht oder ich habe was vergessen.
    Help :D
  • Hi,
    das was du wirklich suchst ist :
    System::Windows::Forms::FormStartPosition::CenterScreen :wink:

    Ansonsten wenn du trotzdem die Bildschirmauflösung haben möchtest,dann schau dir mal System::Windows::Forms::SystemInformation::VirtualScreen an.

    Edit:
    Nur um es noch zu erwähnen.
    Ganz abgesehen davon dass du in ner NET Anwendung nicht direkt auf die WinApi zugreifen kannst,solltest du das auch nicht tun.
    Zumindest nicht solange es sich vermeiden lässt.Das NET Framework bietet für nahezu jede erdenkliche Begebenheit ne sichere Alternative.
    Die Ausführung von nativem Code(unter Zuhilfenahme von System::Runtime::InteropServices) innerhalb einer verwalteten Anwendung,
    ist potentiell gefährlich und kann dir schlimmstenfalls die ganze NET Runtime,und jede Anwendung die darin läuft abschießen.

    Gruß void
    "Probleme kann man niemals mit derselben Denkweise lösen,
    durch die sie entstanden sind." (A. Einstein)
  • Hi void, danke für die hilfreiche Antwort.

    Ok, das mit dem WinApi-Zugriff wusste ich nicht, bin noch ziemlich frisch in der C++-Welt, ich werde es mir zu Herze nehmen ;)

    Also nun zum Code, ich verwende nun "System::Windows::Forms::FormStartPosition::CenterScreen" um die Form zu zentrieren:

    Quellcode

    1. private: System::Void Form1_Load(System::Object * sender, System::EventArgs * e)
    2. {
    3. //Form auf dem Bildschirm zentriert in der Mitte ausgeben
    4. this->StartPosition = FormStartPosition::CenterScreen;
    5. }


    Dies funktioniert aber noch nicht, es startet die Form trotzdem links-oben im Eck des Bildschirm mit ein wenig Abstand.

    Ich habe das ganze noch auf einen Button gebinded, um zu schauen ob das geht. Geht aber auch nicht, wenn der Button gedrückt wird, wird die Form ganz oben-links ins Eck verschoben :S

    Quellcode

    1. private: System::Void btn_Click(System::Object * sender, System::EventArgs * e)
    2. {
    3. //Form zentrieren
    4. this->DesktopLocation = FormStartPosition::CenterScreen;
    5. }


    Es werden keine Fehlermeldungen ausgegeben, es zentriert es einfach nicht.
    Bitte um Rat.

    Gruss jott
  • Hi,
    der Konstruktor der zweiten Form ,oder eine entsprechende Init-Methode die im Konstruktor aufgerufen wird,wäre der richtige Ort um die Eigenschaft StartPosition zu setzen.
    Hast du die Form eigentlich von Hand geschrieben oder mit dem Form Designer vom Visual Studio entworfen? Im Designer solltest du eigentlich diese Eigenschaft problemlos einstellen können.

    Gruß void
    "Probleme kann man niemals mit derselben Denkweise lösen,
    durch die sie entstanden sind." (A. Einstein)
  • Ah, ich idiot. Sorry, habe zu kompliziert gedacht.
    Ja ich hab die Form mit dem Visual Designer erstellt und die Eigenschaft "StartPosition" gleich gefunden und entsprechend umgestellt. :D

    Sorry für die Umstände, dummer Patzer von mir. Aber jetz weiss ichs ja für die Zukunft. :)

    Danke nochmals void.

    Gruss jott