Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 05, 2025 19:54

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
BeitragVerfasst: Mi Nov 30, 2011 18:30 
Offline
DGL Member

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:
  1. #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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Nov 30, 2011 20:30 
Offline
DGL Member

Registriert: Di Sep 07, 2010 14:28
Beiträge: 34
Wohnort: Frankfurt
Programmiersprache: C++,C#,VB(,Delphi)
Code:
  1.  
  2. WNDCLASS wc;
  3.  
  4.     wc.style=CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
  5.     wc.cbClsExtra=0;
  6.     wc.cbWndExtra=0;
  7.     wc.hInstance=hInstance;
  8.     wc.hIcon=LoadIcon(NULL, IDI_WINLOGO);
  9.     wc.hCursor=LoadCursor(NULL, IDC_ARROW);
  10.     wc.hbrBackground=NULL;
  11.     wc.lpszMenuName=NULL;
  12.     wc.lpszClassName=TEXT("OpenGL");
  13.  


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:
  1. 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.

Jonathan

_________________
Das mit dem Dx tut mir leid.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Dez 06, 2011 22:50 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
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:

Code:
  1.  
  2. [...]
  3. if(Application.FullscreenMode)
  4.     {
  5.         DEVMODE dmScreenSettings;
  6.  
  7.         memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
  8.         dmScreenSettings.dmSize=sizeof(dmScreenSettings);
  9.         dmScreenSettings.dmPelsWidth=width;
  10.         dmScreenSettings.dmPelsHeight=height;
  11.         dmScreenSettings.dmBitsPerPel=Application.Bits;
  12.         dmScreenSettings.dmFields=DM_BITSPERPEL|
  13.         DM_PELSWIDTH|DM_PELSHEIGHT;
  14.     if(ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN)
  15.             !=DISP_CHANGE_SUCCESSFUL)
  16.         {
  17.             if(MessageBox(NULL, "Vollbild nicht unterstützt, im Fenster weiter?", "Fehler", MB_YESNO)==IDYES)
  18.             {
  19.                 Application.FullscreenMode=false;
  20.             }
  21.             else
  22.             {
  23.                 return false;
  24.             }
  25.         }
  26.          }[...]


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:
  1. [...]   switch (uMsg)
  2.     {
  3.     case WM_ACTIVATE:
  4.         {
  5.             if(!HIWORD(wParam))
  6.             {
  7.                 Application.active=true;
  8.             }
  9.             else
  10.             {
  11.                 Application.active=true;
  12.             }
  13.             return 0;
  14.         }[...]


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?

lg :)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Dez 07, 2011 14:24 
Offline
DGL Member

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:
  1. switch (uMsg)
  2. {
  3.   case WM_ACTIVATE:
  4.   {
  5.     if(!HIWORD(wParam))
  6.   {
  7.     Application.active=true;
  8.   }
  9.   else
  10.   {
  11.     Application.active=true;
  12.   }
  13.   return 0;
  14. }


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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 08, 2011 20:47 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
ja das mit dem active war testzweck :D das hab ich vergessen zu ändern

aber ich glaube ich habe eine ahnung warum das nicht geht, ich habe den struct Application so initialisiert

Code:
  1. struct Appinfo
  2. {
  3.     HWND hWnd;
  4.     HINSTANCE hInstance;
  5.     MSG msg;
  6.     bool active;
  7.     bool done;
  8.     bool FullscreenMode;
  9.     bool Keys[256];
  10.     HGLRC RC;
  11.     HDC DC;
  12.     int Bits;
  13.     int width;
  14.     int height;
  15.     void Init(){Bits=16;width=800;height=600;hInstance=GetModuleHandle(NULL);
  16.                 active=true;FullscreenMode=true;};
  17. } static Application = {NULL,NULL,NULL,false,false,false,false,NULL,NULL,0,0,0};


nun ist dieses ja aber statisch da kann man ja gar nix ändern oder?

aber wenn ich das statisch wegnehme dann meckert der compiler das dieser typ schonmal definiert wurde.

lg


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Dez 08, 2011 22:09 
Offline
DGL Member

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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 09, 2011 12:06 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Das struct ist doch global definiert wenn es in der .h steht?

Das mit der class werde ich aendern mal sehen wie es dann wird kann das aber erst morgen testen
Lg


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 09, 2011 13:46 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 09, 2011 20:55 
Offline
DGL Member

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 :wink: ). 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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Dez 09, 2011 22:17 
Offline
DGL Member

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:
  1. void test();
  2.  
  3. int main(int argc, char** argv) {
  4.    
  5.     test(1, 2, 3, "sdfsdfsdf");
  6.    
  7.     return 0;
  8. }
  9.  
  10. void test() {
  11. }


Wohingegen folgender Code nicht Compiliert werden kann:

Code:
  1. void test(void);
  2.  
  3. int main(int argc, char** argv) {
  4.    
  5.     test(1, 2, 3, "sdfsdfsdf");
  6.    
  7.     return 0;
  8. }
  9.  
  10. void test(void) {
  11. }


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 :-).


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Dez 10, 2011 15:24 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]