gpt4 book ai didi

winapi - 如何在 DoDragDrop 中重新绘制 UI

转载 作者:行者123 更新时间:2023-12-02 08:08:05 27 4
gpt4 key购买 nike

我正在将我的应用程序实现为拖动源。当我调用 DoDragDrop(Win32 调用,而不是 MFC)时,它进入模式循环,并且在 DoDragDrop 返回之前我不会在主窗口中收到重绘消息。不幸的是,如果我在 shell(一个文件)中执行操作并且文件名已经存在,则 shell 会询问我是否要替换该文件。但由于我的应用程序因 DoDragDrop 尚未返回而被阻止,因此它不会重新绘制并且看起来“卡住”。

有什么线索吗?

最佳答案

你尝试过计时器吗?我在使用 DoDragDrop() 和其他阻塞调用(例如 SHFileOperation())时遇到了同样的问题,并通过调用 SetTimer() 解决了这个问题。

编辑:如果您想要对 DoDragDrop() 进行更多控制,那么工作线程效果很好。正如有人建议的那样,您可以尝试在工作线程中调用 DoDragDrop() ,但我无法使鼠标捕获正常工作。一个更简单的解决方案是在主线程中调用 DoDragDrop() 并让工作线程定期将 WM_USER 消息发布到主线程的队列。然后,DoDragDrop() 将检索消息并将其分派(dispatch)到窗口的 WndProc(),此时只要队列保持为空,您就可以执行空闲处理。如果您给工作线程的优先级低于主线程,那么一旦主线程空闲(即,只要 DoDragDrop()),它将执行并发布 WM_USER 消息 完成处理所有用户输入并在内部调用 MsgWaitForMultipleObjects())。此方法比 SetTimer() 方法更好,因为它使您的应用程序可以完全控制 CPU。从 WM_TIMER 处理程序返回后,在下一个 WM_TIMER 返回之前,您不必等待最多 10 毫秒(SetTimer() 允许的最小频率) code> 消息到达。

关于winapi - 如何在 DoDragDrop 中重新绘制 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/270438/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com