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)。

以下是我如何调用这些类:(但是一次只调用一个)

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

第二个工作得很好,但是当我调用第一个(较短的参数,将其传递给第二个)类注册失败。我已经完整地编写了 _wndClassEx 并且经历了每一个并且修改它没有成功。我已经使用了调试器,一切似乎都很好。所以我完全不知道该怎么做。

顺便说一句, abstractWindow::msgRouter 是静态的。

谢谢。

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) {};

另一种方法是按照@aztaroth 所说的去做:创建一个单独的方法并从两个构造函数中调用它(即使使用较旧的编译器也可以)。

于 2012-05-21T11:51:31.347 回答
1

编写一个初始化窗口的方法(基本上是剪切和粘贴第二个构造函数),然后使用两个构造函数的正确值调用它。

于 2012-05-21T11:47:44.430 回答