0

我定义了一个要用于构建窗口的类。其中一个字段是 hWnd,当调用成员函数 create() 时,创建的窗口的 HWND 存储在那里。我重载了 (HWND) 强制转换以返回该值:

operator HWND() { return(hWnd); }

当我尝试为我创建的第一个主窗口创建子窗口时,我的程序开始崩溃,我将其跟踪到类型转换返回的奇数值。我定义了一个典型的 getter 函数 getHwnd(),它可以正常工作,但类型转换只会返回垃圾。有什么我想念的吗?

类定义:

class WindowBuilder
{
public:
    WindowBuilder(FullWindow &fullWindow);
    operator HWND()                               { return(hWnd); }
    void SetCaption(char const * caption)         { windowName = caption; }
    void SetMenu(int resourceId);
    void SetRender(RECT rect, HWND parent);
    void SetButton(HWND parent);
    void Create();
    void Show(int nCmdShow = SW_SHOWNORMAL);
    HWND getHwnd ()                               { return(hWnd); }

protected:
    FullWindow &        window;
    HWND            hWnd;
    char const *        windowName;
    DWORD           style;
    int         x;
    int         y;
    int         width;
    int         height;
    HWND            hWndParent;
    HMENU           hMenu;
    void *          data;
};

调用示例:

FullWindow renderWindowClass("STATIC", GlobalInstance, WndProc);
renderWindow = new WindowBuilder(renderWindowClass);
renderWindow->SetRender(rect,mainWindow->getHwnd());    // used to be (HWND)mainWindow 
renderWindow->Create();
renderWindow->Show(CmdShow);

/*RenderWindow = ::CreateWindow("STATIC", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER,
    DEFAULT_BUTTON_WIDTH, 0, rect.right-rect.left-DEFAULT_BUTTON_WIDTH,
    rect.bottom - rect.top, Window, NULL, hInstance, NULL);*/
4

1 回答 1

1

您没有显示 的​​定义mainWindow,但根据您对 -> 的使用,我假设它是指向 WindowBuilder 的指针。因此,当您这样做时(HWND)mainWindow,您将指针值转换为 HWND,而不是调用您的转换运算符。要调用您的演员表运算符,您需要执行类似(HWND)(*mainWindow).

话虽如此,我不得不说如果你不以这种方式使用强制重载,你会有一个更干净的设计。由于难以在代码中发现的自动转换,它们可能会导致细微的错误。使用显式getHwnd()成员更加清晰和可靠。

于 2011-03-19T17:00:12.090 回答