2017-02-16 14 views
0

おそらく何か明白ですが、私はまだ非常に初心者ですので、私と一緒に裸です。 私には本当に2つの質問があります。 1つは他のものよりはるかに広いです。 まず、私のコードの一番上に、#defineを使ってウィンドウクラスの名前を付けました。 MSDNでは、main関数で "const wchar_t CLASS_NAME []"を使用することをお勧めしますが、動作させることができませんでした。これはUnicodeと関係がありますか(おそらくそれに関連すると思われるlpszの問題もありました)。とにかく、ポイントは、私はそれが動作しなかった理由を把握することはできません。 「const wchar_tをLPCSTRに代入できません」というエラーが表示されました。窓が開いていない

私の第2の、より広い質問は、コードが下にある状態であっても、エラーなしでデバッグして実行しますが、ウィンドウは開きません。私は何が欠けているのか分からない。どんな助けでも大歓迎です。ありがとう。

#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

最初に説明する問題は、MSDNの推奨事項は、コンパイラがUnicodeモードでプログラムをビルドするように構成されているが、マルチバイトモードでプログラムをビルドするように構成されているためです。あなたがどのコンパイラを使用しているか教えてくれないので、それを修正する方法をあなたにアドバイスすることはできません。 –

+0

ああ、そうだ。私はVisual Studio 2013 Expressを使用しています。 – rgolden

+1

'S_OK'は0と定義されていますので、'!S_OK'は 'true'と評価され、ウィンドウを決して作成しません。これは、エラー処理を実装する方法ではありません、私はあなたのコンパイラがこれについて警告したと確信しています。 – IInspectable

答えて

3

問題のコードは、右側のウィンドウクラスを登録した後に終了します。ウィンドウを作成することさえありません。

if (!S_OK) 
    { 
     return 0; 
    } 

S_OKが一定値0に評価COM HRESULT value、次のとおりです。問題は、エラー処理で次の試みです。その結果、!S_OKtrueと評価されます。そのため、ブランチは常に取られ、ユーザー提供のエントリポイントを終了します。コンパイラは、warning level 4(可能であれば使用してください)で警告C4127(条件付き式は定数)を発行します。

最初の質問は、文字の種類(およびエンコード)が一致しないことです。規則はworking with stringsの下に文書化されています。

関連する問題