1

コードに問題があります。WinAPI をラップして GUI を作成するクラスを作成していますが、クラスを登録しようとすると問題が発生します。

私のコード:

inline Window::Window(const TCHAR *windowName, const int x, const int y, const int width, const int height, const TCHAR *className) : abstractWindow() {
    Window(0, className, windowName, WS_OVERLAPPEDWINDOW, x, y, width, height, NULL, NULL, NULL, NULL);
}    

Window::Window(const DWORD dwExStyle, const TCHAR *lpClassName, const TCHAR *lpWindowName, const DWORD dwStyle, const int x, const int y, const int nWidth, const int nHeight, const HWND hWndParent, const HMENU hMenu, const HINSTANCE hInstance, const LPVOID lpParam) : abstractWindow() {
    _proc           = (WNDPROC*) &abstractWindow::msgRouter;

    _styleEx        = dwExStyle;
    _className      = (!lpClassName) ? TEXT("MyGuiClass") : lpClassName;
    _windowName     = lpWindowName;
    _style          = dwStyle;
    _x              = x;
    _y              = y;
    _width          = nWidth;
    _height         = nHeight;
    _hwndParent     = hWndParent;
    _hInstance      = (!hInstance) ? ::GetModuleHandle(NULL) : hInstance;
    _hMenu          = hMenu;
    _lpParam        = lpParam;

    _wndClassEx.cbSize          = sizeof(_wndClassEx);
    _wndClassEx.style           = CS_HREDRAW | CS_VREDRAW;
    _wndClassEx.lpfnWndProc     = abstractWindow::msgRouter;
    _wndClassEx.cbClsExtra      = 0;
    _wndClassEx.cbWndExtra      = 0;
    _wndClassEx.hInstance       = _hInstance;
    _wndClassEx.hIcon           = ::LoadIcon(NULL, IDI_APPLICATION);
    _wndClassEx.hCursor         = ::LoadCursor(NULL, IDC_ARROW);
    _wndClassEx.hbrBackground   = (HBRUSH) COLOR_WINDOW;
    _wndClassEx.lpszMenuName    = NULL;
    _wndClassEx.lpszClassName   = _className;
    _wndClassEx.hIconSm         = ::LoadIcon(NULL, IDI_APPLICATION);
}

_wndClassExは、 WNDCLASSEXの時点で既にクラス ヘッダーに定義されており、登録関数は単純に RegisterClassEx(&_wndClassEx) を実行します。

以下は、これらのクラスを呼び出す方法です: (ただし、一度に呼び出されるのは 1 つだけです)

Window gui (TEXT("Title"), 10, 10, 500, 250);
Window gui (0, NULL, TEXT("Title"), WS_OVERLAPPEDWINDOW, 10, 10, 500, 200, NULL, NULL, hInstance, NULL);

2 番目のものは完全に正常に動作しますが、最初の (短いパラメーターで、2 番目に渡される) クラス登録を呼び出すと失敗します。私は _wndClassEx を完全に作成し、すべてを調べて修正しましたが、成功しませんでした。デバッガーを使用しましたが、すべて問題ないようです。だから私は何をすべきか全くわかりません。

ちなみに、abstractWindow::msgRouter は static です。

ありがとう。

4

2 に答える 2

2

問題はこのコンストラクターにあります:

inline Window::Window(const TCHAR *windowName, const int x, const int y, const int width, const int height, const TCHAR *className) : abstractWindow() {
    Window(0, className, windowName, WS_OVERLAPPEDWINDOW, x, y, width, height, NULL, NULL, NULL, NULL);
}

そのような別のコンストラクターからコンストラクターを呼び出すことはできません。最終的に発生するのは、一時オブジェクトが作成され、すぐに破棄されることです。これを実現する方法(これは、新しいC ++ 11標準からこの機能を実装するコンパイラーがある場合にのみ機能します)は、次のように言う場合です。

inline Window::Window(const TCHAR *windowName, const int x, const int y, const int width, const int height, const TCHAR *className) : Window(0, className, windowName, WS_OVERLAPPEDWINDOW, x, y, width, height, NULL, NULL, NULL, NULL) {};

もう1つの方法は、@ aztarothが言ったことを実行することです。別のメソッドを作成し、両方のコンストラクターから呼び出します(古いコンパイラーでも機能します)。

于 2012-05-21T11:51:31.347 に答える
1

ウィンドウを初期化するメソッドを作成し (基本的には 2 番目のコンストラクターをカット アンド ペーストします)、両方のコンストラクターから適切な値を指定して呼び出します。

于 2012-05-21T11:47:44.430 に答える