面向对象的关闭窗口方法
C++ - WINAPI - Object-oriented approach to closing a 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"方法中修改。定义如下:
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()
中的无限循环。
相关文章:
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 如何在窗口过程方法中检测击键?
- 设置窗口几何图形特性的正确方法
- 删除父/子窗口层次结构的最佳方法
- Gtkmm - 关闭窗口然后显示另一个窗口的正确方法
- 主窗口的新方法不可见
- 全局挂钩 DLL 仅在 C# 主窗口处于活动状态/前台时调用 C# 回调方法
- 有没有更好的方法来移动窗口
- 在 c++ 生成器中检测绘制线的窗口坐标的最佳方法
- 尝试使用窗口注册表中的路径和 DeleteFile() 方法删除.exe文件
- 在QT中的两个窗口之间进行通信的最佳方法是什么?
- 如何在WebBrowser控件窗口中生成异常.MFC中实现的外部方法
- 当用户更改密码时,哪个窗口 API 调用?钩住这个 API 的好方法是什么
- 有没有什么方法可以让窗口出现,但不让SFML中的cmd出现
- Qt C++从另一个类访问窗口方法
- 在C++窗口代码中有没有任何方法可以阻止鼠标移动到窗口边界之外
- C++:通过进程id、进程句柄和标题名称从进程中获取唯一窗口的窗口句柄的最佳方法
- 单击“关闭控制台窗口”结束 C++ 控制台程序是正确的方法
- 有什么方法可以判断分叉/执行Qt应用程序的主窗口何时显示?
- 在窗口中的屏幕上获取坐标像素数据的简单方法