2

複数のウィンドウ用のプログラムを作成しようとしています。このプログラムでは、ユーザーが 1 つのウィンドウを左クリックすると、どのウィンドウがクリックされたかというメッセージが表示されます。これが私のコードです:

#include<Windows.h>
// Store handles to the main window and application instance globally.
HWND ghFirstWnd =0;
HWND ghSecondWnd=0;
HWND ghThirdWnd=0;
HINSTANCE ghAppInst=0;
//========================================================================================
// WINDOW 1
// Step 1: Define and implement the window procedure.
LRESULT CALLBACK
WndProc1(HWND hWnd,UINT msg,WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    // Handle left mouse button click message.
    case WM_LBUTTONDOWN:
        MessageBox(0,L"first window ",L"MSG",MB_OK);
        return 0;
    // Handle key down message.
    case WM_KEYDOWN:
        if(wParam==VK_ESCAPE)
            if(MessageBox(hWnd,L"sure ??",L"confirmation",MB_YESNO)==IDYES)
                DestroyWindow(ghFirstWnd);
        return 0;
    // Handle destroy window message.
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hWnd,msg,wParam,lParam);
}
//========================================================================================
// WINDOW 2
//========================================================================================
LRESULT CALLBACK
WndProc2(HWND hWnd,UINT msg, WPARAM wParam,LPARAM lParam)
{
    switch(msg)
    {
    case WM_LBUTTONDOWN:
        MessageBox(0,L"second window",L"msg",MB_OK);
        return 0;
    }
    return DefWindowProc(hWnd,msg,wParam,lParam);
}
//========================================================================================
// WINDOW 3
//========================================================================================
LRESULT CALLBACK
WndProc3(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    switch(msg)
    {
    case WM_LBUTTONDOWN:
        MessageBox(0,L"third window",L"msg",MB_OK);
        return 0;
    }
    return DefWindowProc(hWnd,msg,wParam,lParam);
}
// WinMain: Entry point for windows application.
int WINAPI
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR cmdLine,int showCmd)
{
    // Save handle to application instance.
    ghAppInst=hInstance;
    // Step 2: Fill out a WNDCLASS instance.
    WNDCLASS wc1;
    wc1.style   =CS_HREDRAW|CS_VREDRAW;
    wc1.lpfnWndProc =WndProc1;
    wc1.cbClsExtra=0;
    wc1.cbWndExtra=0;
    wc1.hInstance=ghAppInst;
    wc1.hIcon=::LoadIcon(0,IDI_APPLICATION);
    wc1.hCursor=::LoadCursor(0,IDC_ARROW);
    wc1.hbrBackground=(HBRUSH)::GetStockObject(WHITE_BRUSH);
    wc1.lpszMenuName=0;
    wc1.lpszClassName=L"first class";
    // Window 2
    WNDCLASS wc2;
    wc2.style=CS_HREDRAW|CS_VREDRAW;
    wc2.lpfnWndProc=WndProc2;
    wc2.cbClsExtra=0;
    wc2.cbWndExtra=0;
    wc2.hInstance=ghAppInst;
    wc2.hIcon=::LoadIcon(0,IDI_APPLICATION);
    wc2.hCursor=::LoadCursor(0,IDC_ARROW);
    wc2.hbrBackground=(HBRUSH)::GetStockObject(WHITE_BRUSH);
    wc2.lpszMenuName=0;
    wc2.lpszClassName=L"second class";
    // Window 3
    WNDCLASS wc3;
    wc3.style=CS_HREDRAW|CS_VREDRAW;
    wc3.lpfnWndProc=WndProc3;
    wc3.cbClsExtra=0;
    wc3.cbWndExtra=0;
    wc3.hInstance=ghAppInst;
    wc3.hIcon=::LoadIcon(0,IDI_APPLICATION);
    wc3.hCursor=::LoadCursor(0,IDC_ARROW);
    wc3.hbrBackground=(HBRUSH)::GetStockObject(WHITE_BRUSH);
    wc3.lpszMenuName=0;
    wc3.lpszClassName=L"third class";
    // Step 3: Register with WNDCLASS instance with windows.
    RegisterClass(&wc1);
    RegisterClass(&wc2);
    RegisterClass(&wc3);
    // Step 4: Create the window, and save the handle in global window handle variable ghMainWnd.
    ghFirstWnd=::CreateWindow(L"MyWndClassName",L"MyWindow1",WS_OVERLAPPEDWINDOW,0,0,50,50,0,0,ghAppInst,0);
    ghSecondWnd=::CreateWindow(L"MyWndClassName",L"MyWindow2",WS_OVERLAPPEDWINDOW,50,0,50,50,0,0,ghAppInst,0);
    ghThirdWnd=::CreateWindow(L"MyWndClassName",L"MyWindow3",WS_OVERLAPPEDWINDOW,100,0,50,50,0,0,ghAppInst,0);
    if(ghFirstWnd==0)
    {
        ::MessageBox(0,L"create window1-failed",0,0);
        return false;
    }
    if(ghSecondWnd==0)
    {
        ::MessageBox(0,L"create window2 failed",0,0);
        return false;
    }
    if(ghThirdWnd==0)
    {
        ::MessageBox(0,L"create window3 failed",0,0);
        return false;
    }
    // Step 5: Show and update the window.
    ShowWindow(ghFirstWnd,showCmd);
    UpdateWindow(ghFirstWnd);
    ShowWindow(ghSecondWnd,showCmd);
    UpdateWindow(ghSecondWnd);
    ShowWindow(ghThirdWnd,showCmd);
    UpdateWindow(ghThirdWnd);
    // Step 6: Enter the message loop and don't quit until a WM_QUIT message is received.
    MSG msg;
    ZeroMemory(&msg,sizeof(MSG));
    while(GetMessage(&msg,0,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    // Return exit code back to operating system.
    return(int)msg.wParam;
}

問題は、コードを実行しようとすると、create window1-failed とだけ表示されることです!!

4

2 に答える 2

2

プログラムを切り詰めると、次のような結果になる可能性があります (コード自体にいくつかの変更を加えましたが、C++03 でも動作するはずです)。

#include <Windows.h>

int WINAPI
WinMain(HINSTANCE hInstance, HINSTANCE, PSTR,int showCmd)
{
    WNDCLASS wc1 = {};
    wc1.style = CS_HREDRAW|CS_VREDRAW;
    wc1.lpfnWndProc = DefWindowProc;
    wc1.hInstance = hInstance;
    wc1.hIcon = ::LoadIcon(0,IDI_APPLICATION);
    wc1.hCursor = ::LoadCursor(0,IDC_ARROW);
    wc1.hbrBackground = (HBRUSH)::GetStockObject(WHITE_BRUSH);
    wc1.lpszClassName = L"first class";

    RegisterClass(&wc1);
    HWND ghFirstWnd = ::CreateWindow(L"MyWndClassName",L"MyWindow1",WS_OVERLAPPEDWINDOW,0,0,50,50,0,0,hInstance,0);

    if(!ghFirstWnd)
    {
        ::MessageBox(0,L"create window1-failed",0,0);
        return 1;
    }

    return 0;
}

この小さなコードを使用すると、間違いを簡単に見つけることができます。ウィンドウ クラスの名前は"first class"ですが、CreateWindow呼び出しでは"MyWndClassName"という名前のクラスを使用します。クラスが見つからないため、それを使用してウィンドウを作成できません。

ちなみに、エラーチェックはほとんどありません。それを本当に強化することの1つは、GetLastError適切に使用することです.

于 2013-08-18T09:39:35.437 に答える
0

CreateWindow 関数はハンドルをウィンドウに返すか、失敗した場合は NULL を返します。'if(ghFirstWnd==0)" を "if(ghFirstWnd==NULL)" に置き換えて、何が起こるかを確認してください。

「create window1-failed」メッセージのみが表示される場合は、「if(ghSecondWnd==0)」を「if(ghSecondWnd==1)」に置き換えてみると、2 つのメッセージ ボックスが表示されるはずです。

于 2013-08-18T09:24:13.093 に答える