- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个对话框类由内存中的对话框模板组成,它运行它自己的嵌套消息循环(除了主应用程序消息循环之外)。
要创建对话框,我使用 CreateDialogIndirectParamW
它返回对话窗口的句柄,
由于对话框是完全定制的,所有的消息处理和创建都是手动完成的。
我省略了 Dialog 过程,但基本上它会在对话框关闭后调用下面相关的消息处理程序。
请注意,我们不能使用 EndDialog
函数销毁对话框并结束消息循环,因为 CreateDialogIndirectParamW
我们必须使用 DestroyWindow
明确地。
我正在寻找结束对话循环的有效方法。
我尝试执行 this loop但问题是自 for
以来,这种方法要么消耗过多的 CPU 资源。示例代码中的循环将只是愚蠢地运行,直到有一条消息,或者如果 for
然后省略PeekMessage
将立即停止循环,这不是我想要的。
相关类声明:
class Dialog :
public ContainerWindow,
public MessageWindow,
public SuperClassWindow
{
// ...
public:
/** Process messages for dialog window */
[[nodiscard]] int RunMessageLoop() override;
protected:
/** Handler for WM_NCDESTROY */
std::uint32_t OnNcDestroy(const UINT& uMsg, const WPARAM& wParam, const LPARAM& lParam) override;
/** Handler for WM_DESTROY */
inline void OnDestroy() const noexcept override;
/** Handler for WM_CLOSE */
inline virtual bool OnClose() noexcept;
// ...
protected:
HWND mhWnd; /** Window handle of derived component */
}
简化类定义:
std::uint32_t Dialog::OnNcDestroy(
[[maybe_unused]] const UINT& uMsg,
[[maybe_unused]] const WPARAM& wParam,
[[maybe_unused]] const LPARAM& lParam)
{
// ...
delete this; // note we can't set this pointer to nullptr!
// ...
return count;
}
void Dialog::OnDestroy() const noexcept
{
PostQuitMessage(0);
}
bool Dialog::OnClose() noexcept
{
return DestroyWindow(mhWnd);
}
下面是对话的消息循环:我需要在循环中添加一些检查代码来检查对话框是否是有效对象,如果对话框对象已被删除,则以某种方式停止循环
一旦OnNcDestroy
调用处理程序,IsDialogMessageW
波纹管将失败,请参阅评论。
看起来像GetMessageW
将在 WM_NCDESTROY
之后继续运行已调度,循环仍在等待WM_QUIT
由 OnDestroy
发送处理程序,因此一旦 Dialog 对象被删除,msg 循环将继续运行,这将使 IsDialogMessageW(mhWnd, &msg)
失败了。自 mhWnd
不存在了。
int Dialog::RunMessageLoop()
{
EnableWindow(mhWndParent, FALSE);
MSG msg{ };
BOOL result = FALSE;
while ((result = GetMessageW(&msg, nullptr, 0, 0)) != FALSE)
{
if (result == -1)
{
ShowError(ERR_BOILER); // error checking function.
break;
}
// once OnNcDestroy is called "mhWnd" is invalid memory
// and this will off course cause access violation!
if (!IsDialogMessageW(mhWnd, &msg))
{
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
}
EnableWindow(mhWndParent, TRUE);
return static_cast<int>(msg.wParam);
}
注意我们不能if (this)
因为this
不是 nullptr
并且不能设置为 nullptr
在OnNcDestroy
处理程序。
最佳答案
好的,经过一段时间的试验后,我对代码进行了以下更改,使一切正常运行! (更多信息见评论)
顺便说一句。我将保留这个问题,希望有更有效的方法,目前 IsWindow
为每条消息调用,这可能是一个性能问题。
int Dialog::RunMessageLoop()
{
EnableWindow(mhWndParent, FALSE);
MSG msg{ };
BOOL result = FALSE;
// first we save the handle to the window
HWND hwnd = mhWnd;
if (!IsWindow(hwnd)) // make sure the handle is valid dialog window
std::abort();
while ((result = GetMessageW(&msg, nullptr, 0, 0)) != FALSE)
{
if (result == -1)
{
ShowError(ERR_BOILER);
break;
}
// if object is deleted the handle is no longer valid!
// because prior to OnNcDestroy handler DestroyWindow has been called
if (!IsWindow(hwnd))
goto invalid;
if (!IsDialogMessageW(mhWnd, &msg))
{
invalid: // non dialog message processing
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
}
// NOTE that we removed EnableWindow(mHwndParent) here!
return static_cast<int>(msg.wParam);
}
这本身就可以工作,但一个额外的步骤是在销毁对话框之前启用所有者窗口(主窗口),因此更新处理程序:
bool Dialog::OnClose() noexcept
{
// otherwise first window in Z order (such as Desktop) will get focus!
EnableWindow(mhWndParent, TRUE);
return DestroyWindow(mhWnd);
}
关于c++ - 结束自定义对话框的嵌套消息循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58692019/
我有一个删除按钮,单击该按钮时我希望弹出一个对话框,然后单击“确定”它应该执行 Ajax 调用,否则不应该执行任何操作。这是代码 $('.comment-delete').click(function
public void exitGame() { //pop up dialogue Platform.exit(); } 我已经尝试了很多我在互联网上看到的不同的东西,但我什么都做不了。我所
我有一个典型的素面对话框,效果很好,但是当有人在对话框外单击时,我找不到任何关闭它的选项。我看到了一些jquery示例,我想我可以将其改编为primefaces对话框,但首先要确保还没有解决方案? 谢
我试图让 jquery 对话框在单击按钮时启动,但似乎不起作用。任何帮助将不胜感激: $('#wrapper').dialog({ autoOpen: false,
我试图单独更改标题栏颜色。所以我使用了 .ui-dialog-titlebar ,但它不起作用,所以我尝试使用 ui-widght-header ,它也反射(reflect)到数据表..请告知。 //
我的页面上有 div(box),我正在使用此脚本将 div 显示为对话框。在该 div 内,我有一个超链接,单击该超链接时,我想淡出对话框并关闭。对话框的内容淡出,但对话框的边框保持不变。如果我将 $
我当前有一个对话框,其内容有两个输入(这两个输入使用 .datepicker())。当我打开对话框时,第一个输入成为焦点,并且第一个日期选择器自动出现。我尝试隐藏 div 并模糊输入,但这会导致日期选
我想即时创建一个 jQuery 对话框。我正在使用这个: var newDiv = $(document.createElement('div')); $(newDiv).html('hello th
child: RaisedButton( color: const Color(0xFF5867DD), onPressed: (){ updateProfilePic();
我有下面的 jquery 代码,我已根据我的要求对其进行了自定义,但存在一些问题。首先,用户单击“单击此处”,不会显示对话框。当用户单击“关闭”时,对话框不会消失。非常感谢您提供的所有帮助。
如何创建一个对话框,该对话框的顶部有一个文本,其下方有一个空白区域,用户可以在其中键入内容,在右侧下方有一个 OKAY 按钮,当您单击该按钮时,对话框消失? 像这样: 最佳答案 String inpu
这是一个简单得多的问题。 private static AplotBaseDialog dlg; public Object execute(final ExecutionEvent event) t
我正在为我的应用程序开发小部件。应该有一些小部件可以实现相同的功能,唯一的区别在于它们的布局(主题/外观) 我会创建一个对话框或屏幕,用户可以在其中选择他喜欢的小部件。当我选择它们时,我在很多小部件中
我有 jQuery 对话框窗口,在某些操作中我有一个加载的 blockUI 插件。 我面临的问题是,即使 AJAX 图像仍在显示,我仍然能够在执行 ajax 操作时执行操作。 另一方面,JSP 页面在
我非常熟悉将 jQuery 对话框 div 设置为可见后将其附加到表单元素的技巧。我已经在 .NET 中这样做了一百次左右,而且效果很好!然而,我正在尝试在 Coldfusion 网站上执行此操作,这
我想使用jquery对话框来收集用户信息(例如用户名)。我如何使用 Jquery 做到这一点并将数据收集到 Javascript 变量中? 这是我迄今为止的尝试: // Dialog here, ho
如何设置 jquery 对话框按钮的工具提示?请参阅下面的内容...这里没有 id 或样式类。 jQuery("#dialog-form").dialog ({ autoOpen: false,
我有调用对话框的 JS 函数 function SomeFunction { $('#editformdialog').dialog('open'); } 这显然已经简化了。但是,我得到 a is u
我正在使用 jquery 模式对话框来显示部分 View 中的数据表。在部分 View 中,我有一些脚本,用于将 HTML 表更改为 jquery DataTables。因此,我需要确保表格在对话框中
我正在尝试添加透明的 JQuery 对话框。但我遇到了两个问题: 文本“Hello”的背景不会变得透明 删除标题栏后,我无法再拖动对话框 这些评论是我迄今为止尝试过的。 //Create ne
我是一名优秀的程序员,十分优秀!