2017-02-16 4 views
0

Wahrscheinlich etwas offensichtlich, aber ich bin immer noch sehr viel ein Anfänger, bei mir so kahl. Ich habe wirklich zwei Fragen; einer ist viel breiter als der andere. Zuerst habe ich am Anfang meines Codes #define zum Benennen meiner Fensterklasse verwendet. Auf MSDN empfehlen sie "const wchar_t CLASS_NAME []" unten in der Hauptfunktion, aber ich konnte das nicht zum Funktionieren bringen. Hat das etwas mit Unicode zu tun? (Ich hatte auch Probleme mit dem lpsz-Kram, was vielleicht damit zusammenhängt). Wie dem auch sei, ich kann nicht herausfinden, warum das nicht funktioniert hat. Es gab einen Fehler, der besagt "Konnte wchar_t nicht zu LPCSTR zuweisen".Fenster nicht öffnen

Meine zweiten und breite Frage ist, selbst in dem Zustand der Code in unten ist, ich debuggen ohne Fehler und läuft, aber kein Fenster geöffnet. Ich kann nicht herausfinden, was fehlt. Jede Hilfe würde sehr geschätzt werden. Vielen Dank.

#include <Windows.h> 

#define CLASS_NAME TEXT("Window Class") 

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (uMsg) 
    { 
    case WM_DESTROY: 
     PostQuitMessage(0); 
     return 0; 
    } 
    return DefWindowProc(hwnd, uMsg, wParam, lParam); 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, PSTR lpCmdLine, int nCmdShow) 
{ 
    MSG msg; 

    //Registering the window class.// 

    WNDCLASS wc = {}; 
    wc.lpfnWndProc = DefWindowProc; 
    wc.hInstance = hInstance; 
    wc.lpszClassName = CLASS_NAME; 
    wc.lpszMenuName = NULL; 
    RegisterClass(&wc); 

    if (!S_OK) 
    { 
     return 0; 
    } 

    //Create Window// 

    HWND hwnd = CreateWindowEx(0, "CLASS_NAME", NULL, NULL, 100, 100, 800, 600, NULL, NULL, hInstance, NULL); 

    if (hwnd == NULL) 
    { 
     return 0; 
    } 

    //Show Window// 

    ShowWindow(hwnd, nCmdShow); 


    //Message loop// 

    while (GetMessage(&msg, NULL, 0, 0) > 0) 
    { 
     DispatchMessage(&msg); 
    } 

    return msg.wParam; 
} 
+0

Das Problem, das Sie zuerst beschreiben, weil MSDN Empfehlungen von Ihrem Compiler abhängig konfiguriert ist, das Programm im Unicode-Modus zu bauen, aber man muss es so konfiguriert Ihr Programm in Multibyte-Modus zu bauen. Wir können Ihnen nicht raten, wie Sie das korrigieren können, weil Sie uns nicht gesagt haben, welchen Compiler Sie verwenden. –

+0

Oh, ich verstehe. Ich verwende Visual Studio 2013 Express. – rgolden

+1

'S_OK' ist als 0 definiert, also wird'! S_OK' zu 'true' ausgewertet, und Sie erstellen niemals ein Fenster. So implementieren Sie die Fehlerbehandlung nicht, und ich war mir sicher, dass Ihr Compiler Sie davor gewarnt hat. – IInspectable

Antwort

3

Der betreffende Code wird direkt nach dem Registrieren einer Fensterklasse beendet. Es erstellt niemals ein Fenster. Das Problem ist der folgende Versuch einer Fehlerbehandlung:

if (!S_OK) 
    { 
     return 0; 
    } 

S_OK ist ein COM-HRESULT value, die 0 auf den konstanten Wert auswertet. Folglich wird !S_OK zu true ausgewertet, so dass die Verzweigung immer genommen wird und den vom Benutzer bereitgestellten Einstiegspunkt verlässt. Die Probleme Compiler Warnung C4127 („Bedingungsausdruck ist konstant“) bei warning level 4 (die Sie überhaupt verwenden sollten, wenn möglich).

Ihre erste Frage bezieht sich auf unpassende Charaktertypen (und Codierungen). Die Regeln sind dokumentiert unter working with strings.