0

win32 api を使用してアプリケーションを開発していますが、問題があります。シンプルなウィンドウを作成し、このウィンドウにアタッチされたシンプルなボタンを作成し、最後にシンプルなメニュー リソースを作成してウィンドウに設定するコードを書きました。

#include<Windows.h>
#include"resource.h"


#define DEFAULT_BUTTON_WIDTH 100
#define DEFAULT_BUTTON_HEIGHT 20

HMENU Menu;
HWND Window;
HWND bCreateWall;

void WMCommand(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    if (lParam == (LPARAM)bCreateWall) MessageBox (Window, (LPCWSTR)"You Pressed bCreateWall", (LPCWSTR)"Congrats!", MB_OK);
    else if (wParam == ID_FILE_EXIT) PostQuitMessage(0);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
    switch(msg){
    case WM_DESTROY:PostQuitMessage(0);break;
    case WM_COMMAND: WMCommand (hWnd, msg, wParam, lParam); break;
    }
    return (DefWindowProc(hWnd,msg,wParam,lParam));
}


int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevious, LPSTR lpCmdString,int CmdShow)
{
    WNDCLASS wc;
    MSG msg;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.hCursor = LoadCursor (NULL, IDC_ARROW);
    wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wc.hInstance = hInstance;
    wc.lpfnWndProc = WndProc;
    wc.lpszClassName = (LPCWSTR)"ME";
    wc.lpszMenuName = NULL;
    wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;

    if (!RegisterClass(&wc))
    {
        MessageBox (NULL,(LPCWSTR)"Error: Cannot Register Class", (LPCWSTR)"ERROR!", MB_OK);
        return (0);
    }

    //create window
    Window = CreateWindow((LPCWSTR)"ME",(LPCWSTR) "Map Editor", WS_OVERLAPPEDWINDOW | WS_VISIBLE,0, 0, 640, 480, NULL, NULL, hInstance, NULL);
    if (Window == NULL)
    {
        MessageBox (NULL,(LPCWSTR)"Error: Failed to Create Window", (LPCWSTR)"ERROR!", MB_OK);
        return (0);
    }

    //create button to create wall
    bCreateWall = CreateWindow((LPCWSTR)"BUTTON", (LPCWSTR)"Create Wall", WS_CHILD | WS_VISIBLE, 0, 100, DEFAULT_BUTTON_WIDTH, DEFAULT_BUTTON_HEIGHT, Window,NULL, hInstance, NULL);
    if (bCreateWall== NULL)
    {
        MessageBox (NULL, (LPCWSTR)"Error: Failed to Create Window",(LPCWSTR) "ERROR!", MB_OK);
        return (0);
    }


    Menu = LoadMenu (hInstance, MAKEINTRESOURCE(IDR_MENU));
    SetMenu (Window, Menu);

    while (1)
    {
        if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_QUIT) break;
            TranslateMessage(&msg);
            DispatchMessage (&msg);
        }
    }

    return 1;
}

これを実行すると、ウィンドウは空白になり、メニューとボタンは追加されません。

メソッド createWindow は null を返します

私は何を間違えましたか?

4

1 に答える 1

0

まず第一に、コードのフォーマットを決定することをお勧めします。さまざまなソースからのコードを使用しているように見えます。もし私があなたなら、デフォルトの VS フォーマットを使い続けるでしょう。このようなワンライナー:

if (lParam == (LPARAM)bCreateWall) MessageBox (Window, L"You Pressed bCreateWall", L"Congrats!", MB_OK); 
else if (wParam == ID_FILE_EXIT) PostQuitMessage(0); 

コードを非常に読みにくくします。コード片ごとに 1 行のコード ブロックを使用しない理由:

if(lParam == (LPARAM)bCreateWall) 
{
    MessageBox (Window, L"You Pressed bCreateWall", L"Congrats!", MB_OK); 
}
else if(wParam == ID_FILE_EXIT) 
{
    PostQuitMessage(0); 
}

また、中括弧が混在しているため、コードの分析には役立ちません。区切り文字間のスペースも矛盾しています。ずさんな書式設定に一貫性を持たせてください。これは優れたプログラミング プラクティスの一部です。

アプリを実行すると、何かを伝えるメッセージ ボックスが表示されますが、文字化けした文字しか表示されません。

あなたの問題は、UNICODE 文字を使用するように設定されたプロジェクトをコンパイルしているが、すべての文字列が ANSI であることです。ANSI 文字列を LPWSTR にキャストするだけでは、文字列を変換するには不十分です。「啂呔乏」という名前のクラスが (LPWSTR)「BUTTON」を使用してしまうため、コードはボタンの作成に失敗します。

_T("string")、TEXT("string") を使用してすべての文字列を一般的な書式に変換するか、UNICODE 文字列のみを使用してください。すべて (LPCWSTR) を引用符で囲まれた L 先行文字列: L"string" に置き換えて、再試行してください。

于 2012-10-23T21:07:59.993 に答える