Перегрузка оператора приведения типа HWND возвращает корзину вместо ожидаемого значения элемента - PullRequest
0 голосов
/ 19 марта 2011

Я определил класс, который хочу использовать для построения окна.Одним из полей является 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 Ответ

1 голос
/ 19 марта 2011

Вы не показываете определение mainWindow, но, исходя из вашего использования ->, я бы предположил, что это указатель на WindowBuilder. Поэтому, когда вы делаете (HWND)mainWindow, вы приводите значение указателя к HWND, а не вызываете ваш оператор приведения. Чтобы вызвать вашего оператора приведения, вам нужно сделать что-то вроде (HWND)(*mainWindow).

Сказав это, я чувствую себя обязанным сказать, что у вас был бы более чистый дизайн, если бы вы не использовали перегрузки приведения таким образом. Они могут привести к незначительным ошибкам из-за автоматических приведений, которые трудно обнаружить в коде. Использование явного члена getHwnd() гораздо более понятно и надежно.

...