1

33ページで提供されるコードは次のとおりです。

#include<Windows.h>

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE prevInstance,
       LPWSTR cmdLine, int cmdShow)
{
    UNREFERENCED_PARAMETER( prevInstance );
    UNREFERENCED_PARAMETER( cmdLine );
    WNDCLASSEX wndClass = { 0 };
    wndClass.cbSize = sizeof( WNDCLASSEX ) ;
    wndClass.style = CS_HREDRAW | CS_VREDRAW;
    wndClass.lpfnWndProc = WndProc;
    wndClass.hInstance = hInstance;
    wndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
    wndClass.hbrBackground = ( HBRUSH )( COLOR_WINDOW + 1 );
    wndClass.lpszMenuName = NULL;
    wndClass.lpszClassName = "DX11BookWindowClass";
    if( !RegisterClassEx( &wndClass ) )
    return -1;
    RECT rc = { 0, 0, 640, 480 };
    AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, FALSE );
    HWND hwnd = CreateWindowA( "DX11BookWindowClass", "Blank Win32 Window",
    WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.
    left,
    rc.bottom - rc.top, NULL, NULL, hInstance, NULL );
    if( !hwnd )
    return -1;
    ShowWindow( hwnd, cmdShow );

    return 0;
}

このコードは私に2つのエラーを与えます-

1>------ ビルド開始: プロジェクト: BlankWindow、構成: Win32 のデバッグ ------ 1> main.cpp 1>c:\coding\c++\visual c++\directx\blankwindow\blankwindow\main. cpp(10): エラー C2065: 'WndProc': 宣言されていない識別子 1>c:\coding\c++\visual c++\directx\blankwindow\blankwindow\main.cpp(15): エラー C2440: '=': ' から変換できませんconst char [20]' to 'LPCWSTR' 1> 指す型は無関係です。変換には reinterpret_cast、C スタイルのキャスト、または関数スタイルのキャストが必要 ========== ビルド: 0 成功、1 失敗、0 最新、0 スキップ ==========

基本的

'WndProc' : 宣言されていない識別子および '=' : 'const char [20]' から 'LPCWSTR' に変換できません

このコードの何が問題になっていますか?

4

2 に答える 2

2

コードの基本的な作業プログラムは次のとおりです。

#include<Windows.h>

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
            {
                    case WM_CLOSE:
                            DestroyWindow(hwnd);
                            break;
                    case WM_DESTROY:
                            PostQuitMessage(0);
                            break;
                    default:
                            return DefWindowProc(hwnd,
                                                 message,
                                                 wParam,
                                                 lParam);
            }
    return 0;
}

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE prevInstance,
       LPSTR cmdLine, int cmdShow)
{
    UNREFERENCED_PARAMETER( prevInstance );
    UNREFERENCED_PARAMETER( cmdLine );
    WNDCLASSEX wndClass = { 0 };
    wndClass.cbSize = sizeof( WNDCLASSEX ) ;
    wndClass.style = CS_HREDRAW | CS_VREDRAW;
    wndClass.lpfnWndProc = WndProc;
    wndClass.hInstance = hInstance;
    wndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
    wndClass.hbrBackground = ( HBRUSH )( COLOR_WINDOW + 1 );
    wndClass.lpszMenuName = NULL;
    wndClass.lpszClassName = "DX11BookWindowClass";
    if( !RegisterClassEx( &wndClass ) )
    return -1;
    RECT rc = { 0, 0, 640, 480 };
    AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, FALSE );
    HWND hwnd = CreateWindowA( L"DX11BookWindowClass", L"Blank Win32 Window",
    WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.
    left,
    rc.bottom - rc.top, NULL, NULL, hInstance, NULL );
    if( !hwnd )
    return -1;
    ShowWindow( hwnd, cmdShow );
    MSG msg;
    while (GetMessage (&msg, 0, 0, 0))
            {
                TranslateMessage (&msg);
                DispatchMessage (&msg);
            }
    return msg.wParam;
}

ポイント:

  1. WndProcプログラムに送信されたすべてのメッセージを処理するを追加しました。

  2. プログラムにメッセージ ループを追加しました。そうしないと、ウィンドウがすぐに閉じてしまいます。

  3. L他の回答で the_mandrill が提案したように、プレフィックスを追加しました。

これは、ほとんど WinAPI プログラミングの "Hello World" です。ただし、DirectX プログラミングに飛び込む前に、まず WinAPI を学習することを強くお勧めします。

于 2012-07-30T23:34:27.107 に答える
1

問題は、プロジェクトがUnicodeとしてビルドされているが、コードが非Unicodeであるということです。言い換えると、Windows API呼び出しは幅の広い(つまり16ビット)文字列を期待していますが、コードは8ビット文字列('char')を使用しています。 一定の幅の広い文字列への長いポインタをLPCWSTR意味します。したがって、関数呼び出しは一定の幅の文字列を期待していますが、8ビットの文字列を渡しています。2つのオプションがあります。

  • 非Unicodeライブラリを使用するようにプロジェクトを変更します([プロパティ]->[一般]->[文字セット]='マルチバイトを使用')
  • コードを修正してUnicodeにします。この場合、文字列を変更することによって、それらを幅の広い文字列にすることについて不平を言っています。Lこれを行うには、たとえば、接頭辞を付けます。L"DX11BookWindowClass"
于 2012-07-30T22:18:14.453 に答える