0

ウィンドウの作成に使用するクラスを定義しました。フィールドの1つはhWndであり、メンバー関数create()が呼び出されると、作成されたウィンドウへのHWNDがそこに格納されます。(HWND)キャストをオーバーロードして、その値を返しました。

operator HWND() { return(hWnd); }

作成した最初のメインウィンドウに子ウィンドウを作成しようとすると、プログラムがクラッシュし始め、型キャストによって返される奇妙な値まで追跡しました。私は典型的なゲッター関数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 に答える