HWND的类型转换操作符重载返回垃圾而不是预期的成员值

时间:2011-03-19 04:57:29

标签: windows visual-c++-2010 typecast-operator

我定义了一个我想用来构建窗口的类。其中一个字段是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);*/

1 个答案:

答案 0 :(得分:1)

您没有显示mainWindow的定义,但根据您对 - >的使用,我会假设它是指向WindowBuilder的指针。因此,当您执行(HWND)mainWindow时,您将指针值转换为HWND,而不是调用您的强制转换运算符。要调用您的强制转换操作符,您需要执行(HWND)(*mainWindow)

之类的操作

话虽如此,如果你不以这种方式使用演员超载,我觉得有必要说你会有更清洁的设计。它们可能会导致细微的错误,因为自动转换可能很难在代码中发现。使用明确的getHwnd()成员会更加清晰可靠。