C ++ - WINAPI - 关闭窗口的面向对象方法

时间:2013-03-18 13:14:30

标签: c++ winapi window

在尝试围绕Win32特定的GUI组件创建一个不错的包装器时,我最终遇到了一个问题。问题是我创建的窗口不再存在后,我无法关闭应用程序。

我的API的工作方式如下:

/// ----------------------------
/// @author     God
/// @project    Helixirr Widgets
/// ----------------------------
#include <helixirrwidgets/HelixirrWidgets.hpp>

int main(void){
    HelixirrWidgets::Window __windows[2] = {HelixirrWidgets::Window("Big Window"), HelixirrWidgets::Window()};

    __windows[0].position(200, 200);
    __windows[0].size(800, 600);
    __windows[0].visible(true);
    __windows[0].save_changes();

    __windows[1].name("Tiny Window");
    __windows[1].position(10, 100);
    __windows[1].size(400, 200);
    __windows[1].visible(true);
    __windows[1].save_changes();

    while(__windows[0].active() || __windows[1].active()){
        if(__windows[0].visible()){
            __windows[0].show();
        }
        if(__windows[1].visible()){
            __windows[1].show();
        }
    }
    return 0;
}

HelixirrWidgets :: Window 的方法中称为“active”,它被声明为

inline bool active(void) const noexcept;

我可以查看我的窗口是否有效。

此方法基本上将const引用返回给实例的布尔成员变量。此成员变量在同一类的“show”-method中进行修改。这是定义:

void Window::show(void){
    if(GetMessage(&_m_opHelper->message, _m_opHelper->handle_window, 0, 0)){
        if(_m_opHelper->message.message == WM_CLOSE){
            _m_bActive = false;
            return;
        }

        TranslateMessage(&_m_opHelper->message);
        DispatchMessage(&_m_opHelper->message);

        ShowWindow(_m_opHelper->handle_window, SW_SHOWDEFAULT);
        UpdateWindow(_m_opHelper->handle_window);

        _m_bActive = true;
        return;
    }
    _m_bActive = false;
}

请注意我使用pimpl-idiom来隐藏特定于平台的结构(“_m_opHelper”是指向实现的指针)。

它可能看起来有效,但它没有,我无法理解为什么。这一切都归结为一个简单的问题:如何关闭我使用WINAPI特定功能和结构实现的窗口,以便我的应用程序的用户正确关闭

1 个答案:

答案 0 :(得分:0)

我想这个问题的原因与WM_CLOSE只是不是最后一条消息HWND的事实有关。 WM_DESTROYWM_NCDESTROY以及可能更多的消息(取决于特定窗口及其状态)将在WM_CLOSE之后发送,从而导致作业_m_bActive = TRUE

即。窗口在非常短的时间内变为非活动状态,并且(可能)它们将永远不会同时处于非活动状态,从而在main()中导致无限循环。