You are not logged in.

  • Login

1

Tuesday, November 21st 2006, 11:28am

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)

C Quellcode

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


Fehler in WinUser.h

C Quellcode

1
2
3
4
5
WINUSERAPI
int
WINAPI
GetSystemMetrics(
    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

2

Tuesday, November 21st 2006, 12:27pm

Was hast du included in deinem Programm WinUser.h oder Windows.h?

3

Tuesday, November 21st 2006, 12:29pm

Habe <windows.h> included.

4

Tuesday, November 21st 2006, 5:24pm

Include mal WinUser.h, denn laut MSDN ist das Zeug deklariert.

5

Tuesday, November 21st 2006, 6:42pm

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

C Quellcode

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


im namespace MoveUrBall ist folgendes enthalten:

C Quellcode

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


Hm, laut MSDN sollte es deklariert sein..ist es aber irgendwie nicht oder ich habe was vergessen.
Help :D

6

Tuesday, November 21st 2006, 7:59pm

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

7

Wednesday, November 22nd 2006, 9:24am

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:

C Quellcode

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


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

C Quellcode

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


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

Gruss jott

8

Wednesday, November 22nd 2006, 7:46pm

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

9

Wednesday, November 22nd 2006, 9:53pm

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

Social bookmarks