面向对象的关闭窗口方法

C++ - WINAPI - Object-oriented approach to closing a window

本文关键字:方法 窗口 面向对象的      更新时间:2023-10-16

在尝试创建一个围绕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"方法中修改。定义如下:

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;
}

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

它可能看起来像它工作,但它没有,我不明白为什么。这一切都归结为一个简单的问题:我如何关闭使用WINAPI特定函数和结构实现的窗口,以便由我的应用程序的用户适当地关闭?

我猜这个问题的原因与WM_CLOSE不是HWND得到的最后一条消息有关。像WM_DESTROY, WM_NCDESTROY这样的消息(取决于特定的窗口及其状态)将在WM_CLOSE之后出现,导致分配_m_bActive = TRUE

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