在尝试围绕 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;
}
在名为“active”的HelixirrWidgets::Window方法中,声明如下
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;
}
请注意我使用 pimpl-idiom 来隐藏特定于平台的结构(“_m_opHelper”是指向实现的指针)。
它可能看起来有效,但它没有,我不明白为什么。这一切都归结为一个简单的问题:如何关闭使用 WINAPI 特定功能和结构实现的窗口,以便由我的应用程序用户适当关闭?