2011-03-19 4 views
0

Я определил класс, который я хочу использовать для построения окна. Одним из полей является hWnd, и когда функция-член create() называется HWND для созданного окна, там сохраняется. Я перегружен (HWND) отливать вернуть это значение:Тип перегрузки оператора перегрузки HWND возвращает корзину вместо ожидаемого значения элемента

operator HWND() { return(hWnd); } 

Моей программа началась сбой, когда я попытался создать дочерние окна на первое, главное окно я создал, и я отслеживал его вниз к нечетному значению, возвращаемому тип. Я определил типичную функцию getter, getHwnd(), которая работает нормально, но typecast просто возвращает корзину. Есть что-то, что мне не хватает?

Определение класса:

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

добавил объявление класса и один пример того, как я его использовал. Если вам нужно больше просто спросить. – Matt

ответ

1

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

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

+0

Спасибо! Это была проблема. Благодарим вас за другие советы. Эта программа на самом деле просто учебный проект для меня, чем серьезный проект, поэтому я изучал то, чего раньше не делал. – Matt

 Смежные вопросы

  • Нет связанных вопросов^_^