Registriert: Di Okt 13, 2009 17:25 Beiträge: 365
Programmiersprache: C++
Es gibt unter Windows von den meisten Funktionen eine ANSI- und eine Unicode-Version - z.B. CreateWindowExA und CreateWindowExW. Du scheinst irgendwo im Code oder in den Compilereinstellungen
Code:
#define _UNICODE
stehen zu haben. Wenn du das wegnimmst, sollte automatisch die ANSI-Version von CreateWindowEx verwendet werden und dann funktioniert auch das title.c_str() von darkinsanity. Dann musst du dich auch überhaupt nicht mit dem Konvertieren ins Unicode-Format herumschlagen.
Also eigentlich solltest es schon beim Aufruf von RegisterClass einen Fehler geben, das du keine Callback Funktion für deine WindowClass angeben hast. Deswegen würde ich dir dieses Tutorial http://cpp-tutor.de/mfc/hinweis.htm empfehlen. Ist zwar ein etwas älteres Mfc Tutorial, aber in den ersten Kapitln wird erst mal mit der Win32 Api ein Fenster erstellt und die WndProc, die Callback Funktion, die aufgerufen wird, wenn du Nachrichten von Windows bekommst, erklärt.
Code:
error C2664: 'CreateWindowExW': Konvertierung des Parameters 3 von 'const char *' in 'LPCWSTR' nicht möglich
[/quote]
In Visual Studio ist das zb unter Projekt -> "Projektname" - Eigenschaften -> Konfigurationseinstellungen -> Zeichemsatz. Dort Multibyte auswählen und das komische _UNICODE define is weg.
Hey, ich bins nochmal hab alles fortgeworfen und das fenster neu geschrieben... das geht jetzt auch soweit wenn man es anmacht könnte man denken es funktioniert aber da gibt es noch 2 kleine probleme
1. Der Fullscreen geht nicht 2. Das Fenster reagiert nicht auf Events oder Nachrichten
erstmal zu 1.
hier bricht die routine beim umschalten in den vollbildmodus ab. hier:
if(MessageBox(NULL, "Vollbild nicht unterstützt, im Fenster weiter?", "Fehler", MB_YESNO)==IDYES)
{
Application.FullscreenMode=false;
}
else
{
return false;
}
}
}[...]
dieser codeschnipsel wird nur ausgeführt wenn Fullscreen aktiviert werden soll und genau im roten sagter eben nö^^
2. und das ist eigentlich wichtiger ist die nicht funktionierende eventroutine
ich habe einen wert "active" der auf true gesetzt wird wenn das Programm WM_ACTIVATE bekommt hier:
Code:
[...] switch (uMsg)
{
case WM_ACTIVATE:
{
if(!HIWORD(wParam))
{
Application.active=true;
}
else
{
Application.active=true;
}
return 0;
}[...]
Doch dieser bleibt immer auf false und damit wird kein SwapBuffers und keine Zeichenprocedure ausgeführt. hat jemand ne idee? oder muss ich ganz andere sachen dafür posten?
Registriert: Di Okt 13, 2009 17:25 Beiträge: 365
Programmiersprache: C++
Zu 1.: Wenn ChangeDisplaySettings failed, liegt das vermutlich daran, dass Grafiktreiber/-karte oder Monitor die Einstellungen unterstützt. Welche Werte haben denn width, height und Application.Bits?
2.:
Dropye hat geschrieben:
ich habe einen wert "active" der auf true gesetzt wird wenn das Programm WM_ACTIVATE bekommt hier:
Code:
switch(uMsg)
{
case WM_ACTIVATE:
{
if(!HIWORD(wParam))
{
Application.active=true;
}
else
{
Application.active=true;
}
return0;
}
Da scheint erstmal ein Fehler drin zu sein. Im else-Zweig sollte der Wert auf false gesetzt werden (steht im NeHe-Code auch so). Außerdem sendet Windows WM_ACTIVATE nicht grundsätzlich wenn du ein neues Fenster erstellst, sondern wenn es aktiviert wird, indem du es z.B. mimierst und wieder hochlegst (afair). Du solltest active also den Startwert true geben.
Registriert: Di Okt 13, 2009 17:25 Beiträge: 365
Programmiersprache: C++
Also so kann man den Code auf jedenfall nicht lassen. Eine struct hat niemals irgendwelche Methoden, wie etwa dein Init. Das wird bestimmt nicht jeder Compiler durchgehen lassen. Wenn du eine Init-Funktion haben willst, musst du zu class greifen (da kannst du den Init-Code auch gleich in den Konstruktor schreiben, der automatisch aufgerufen wird).
Am besten ist, du deklarierst Application global, dann brauchst du auch kein static. (Mit static habe ich eigentlich fast noch nie gearbeitet, ist auch ein Überbleibsel aus C, genau wie struct). In den einzelnen Funktionen solltest du es dann natürlich nicht nochmal deklarieren. Übrigens ist es afaik (sehr) streng genommen auch nicht korrekt, die Klammern bei einer Funktionsdeklaration/-definition leer zu lassen, stattdessen muss ein void rein.
Registriert: So Sep 26, 2010 12:54 Beiträge: 238 Wohnort: wieder in Berlin
Programmiersprache: Englisch
mrtrain hat geschrieben:
Also so kann man den Code auf jedenfall nicht lassen. Eine struct hat niemals irgendwelche Methoden, wie etwa dein Init. Das wird bestimmt nicht jeder Compiler durchgehen lassen. Wenn du eine Init-Funktion haben willst, musst du zu class greifen (da kannst du den Init-Code auch gleich in den Konstruktor schreiben, der automatisch aufgerufen wird).
Am besten ist, du deklarierst Application global, dann brauchst du auch kein static. (Mit static habe ich eigentlich fast noch nie gearbeitet, ist auch ein Überbleibsel aus C, genau wie struct). In den einzelnen Funktionen solltest du es dann natürlich nicht nochmal deklarieren. Übrigens ist es afaik (sehr) streng genommen auch nicht korrekt, die Klammern bei einer Funktionsdeklaration/-definition leer zu lassen, stattdessen muss ein void rein.
Hmm. So richtig ne Ahnung von C/C++ hast Du (mrtrain) aber scheinbar auch nicht. "Globale Variablen" sind ansich immer böse und sollten nach Möglichkeit vermieden werden, da diese oft Ursachen von Fehlerchen sind... mit leerer Klammer oder mit void drin ist auch Mumpitz. Das stand möglicherweise mal in einem "C++ Grundlagenbuch" von irgendeinem Verlag naja vielleicht wenn Du irgendneinen exotischen Compiler für irgendein völlig unverbreitetes System verwendest wirds vielleicht wichtig
Dropeye, könntest Du alle zukünftigen screenshots per imgur.com bereitstellen? imageshack wird warum auch immer von Südafrika geblockt und ich sehe immer nur so einen ollen Frosch innem Eisblock undnem Hinweis drunter das imageshack.us (die Domain) erst registriert werden müsse... is nur ne Frage, kein muss.
Registriert: Di Okt 13, 2009 17:25 Beiträge: 365
Programmiersprache: C++
phlegmatiker hat geschrieben:
"Globale Variablen" sind ansich immer böse und sollten nach Möglichkeit vermieden werden, da diese oft Ursachen von Fehlerchen sind...
Naja irgendwas muss nunmal global sein, es gibt ja schließlich einige Dinge, auf die man von verschiedenen Funktionen (oder sogar Threads) zugreifen muss. Alternativ kann man natürlich die globalsten Sachen in der WinMain-Funktion deklarieren aber so viel schöner ist das nicht (dann muss man allen untergeordneten Funktionen wieder Zeiger übergeben usw.). Dropeye hat ja immerhin schon einige kleine Variablen zu einem Objekt zusammengefasst und ich finde, man sollte nicht allzu verkrampft irgendwelchen Richtlinien nachgehen, schließlich sind es nur Richtlinien. Ich kann mich auch an keinen speziellen Fall erinnern, bei dem "Globalisierung" in diesem Sinne schonmal zu Fehlern geführt hat - i.d.R. wird es einfach nur unübersichtlicher (und das kann dann natürlich schon zu Fehlern führen ). Solange die globalen Deklarationen im einstelligen Bereich (Dezimalzahlen) bleiben, kann man eigentlich immer alles gut überblicken.
phlegmatiker hat geschrieben:
mit leerer Klammer oder mit void drin ist auch Mumpitz. Das stand möglicherweise mal in einem "C++ Grundlagenbuch" von irgendeinem Verlag
Gut möglich, wie gesagt das war auch sehr pingelig. Ich hatte bei verschiedenen Compilern auch noch nie eine Fehlermeldung wegen soetwas, aber 100% korrekt ist es afair nicht.
Registriert: Sa Mär 14, 2009 17:48 Beiträge: 99
Programmiersprache: D, Java, C++
mrtrain hat geschrieben:
phlegmatiker hat geschrieben:
mit leerer Klammer oder mit void drin ist auch Mumpitz. Das stand möglicherweise mal in einem "C++ Grundlagenbuch" von irgendeinem Verlag
Gut möglich, wie gesagt das war auch sehr pingelig. Ich hatte bei verschiedenen Compilern auch noch nie eine Fehlermeldung wegen soetwas, aber 100% korrekt ist es afair nicht.
Um da mal etwas Klarheit reinzubringen: Das kommt noch aus dem ANSI-C Standard. Wenn du der Funktion als Parameter ein void angibst, dann weis der Compiler, dass er keine Argumente annehmen darf, wenn du das void aber weglässt, dann kannst du der Funktion sehr wohl Parameter übergeben, diese werden dann nur nicht auf ihren Typ hin geprüft und du kannst eine beliebige Anzahl an Parametern übergeben.
So Compiliert folgender C-Code beispielsweise Fehlerfrei:
Code:
void test();
int main(int argc, char** argv) {
test(1, 2, 3, "sdfsdfsdf");
return 0;
}
void test() {
}
Wohingegen folgender Code nicht Compiliert werden kann:
Code:
void test(void);
int main(int argc, char** argv) {
test(1, 2, 3, "sdfsdfsdf");
return 0;
}
void test(void) {
}
In wie weit das in den C++ Standard mit eingeflossen ist weis ich nicht, aber daher kommt dieses "void" als Parameter Ursprünglich.
Ihr könnt es gerne mal mit einem C++ Compiler probieren und berichten .
okay also ich hab das jetzt zu ner klasse gemacht global möchte ich es aber schon lassen dafür hab ich das static gesetzt, die Init() ist nun zum constructor geworden und alle werte haben den den sie haben sollen.
durch den einzelschritt habe ich bemerkt das das programm anschein ununterbrochen mit messages belastet ist und so kommt er nicht zum zeichnen, aber vieleicht schreibe ich das alles einfach nochmal anhand eines anderen tutorials... lg
Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.