2

私は、VC++コンパイラとVisualStudioを使用して、Win32APIを介して単純なウィンドウを開こうとしています。クラスが失敗する理由を知りたいのですが。ポインターなしで割り当て、ポインターとして割り当て、関数に参照として送信してみました。それでも、私が何をしようとしても、RegisterClassEx関数はtrueを返すことを拒否します。

これはなぜですか、そしてそれについて何ができるのですか?

からWinMain

WNDCLASSEX* wc = new WNDCLASSEX;
    HWND hwnd;
    MSG     msg;
    bool    done;

    wc->style = CS_HREDRAW | CS_VREDRAW;
    wc->lpfnWndProc = WndProc;
    wc->cbClsExtra = 0;
    wc->cbWndExtra = 0;
    wc->hInstance = hInstance;
    wc->hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc->hCursor = LoadCursor(NULL, IDC_ARROW);
    wc->hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    wc->lpszClassName = L"someclass";

    if (!RegisterClassEx(wc)) {
        MessageBox(NULL, L"Class registration has failed!", L"Error!", MB_OK | MB_ICONINFORMATION);
        return 0;
    }
4

1 に答える 1

8

メンバーWNDCLASSEXを入力して、構造の大きさをWindowsに通知する必要があります。cbSizeを呼び出す前にこのメンバーを初期化できませんでしたRegisterClassEx。これが、おそらくその関数が失敗する理由です。必要なのsizeofはオペレーターだけです。

また、など、構造体の他のメンバーの一部を初期化できませんでしたlpszMenuName。明示的に初期化しないと、ガベージデータが含まれているため、RegisterClassEx関数が失敗する可能性があります。それらを使用していない場合は、明示的に0に設定する必要があります。

さらに、RegisterClassEx引数が構造体へのポインターを受け入れるからといって、構造体をポインターとして作成するWNDCLASSEX必要があるという意味ではありません。スタック上に通常のオブジェクトを作成し、address-of演算子()を使用して関数へのポインターを渡すことができます。&

ドキュメントに従って、関数を呼び出して、GetLastError関数を呼び出すときに何がうまくいかなかったかの詳細を取得することもできることに注意してくださいRegisterClassEx。これは、問題が発生したときに問題をデバッグするのに役立ちます。

実用的なサンプルコード:

WNDCLASSEX wc    = {0};  // make sure all the members are zero-ed out to start
wc.cbSize        = sizeof(wc);
wc.style         = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc   = WndProc;
wc.hInstance     = hInstance;
wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszClassName = L"someclass";

if (!RegisterClassEx(&wc)) {
    MessageBox(NULL, L"Class registration has failed!",
               L"Error!", MB_OK | MB_ICONERROR);
    return 0;
}
于 2012-01-08T04:52:55.797 に答える