- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在这篇文章中About Messages and Message Queues ,据说 WM_PAINT 是一种排队消息。
排队的消息
Whenever the user moves the mouse, clicks the mouse buttons, or typeson the keyboard, the device driver for the mouse or keyboard convertsthe input into messages and places them in the system message queue.The system removes the messages, one at a time, from the systemmessage queue, examines them to determine the destination window, andthen posts them to the message queue of the thread that created thedestination window. A thread's message queue receives all mouse andkeyboard messages for the windows created by the thread. The threadremoves messages from its queue and directs the system to send them tothe appropriate window procedure for processing.
With the exception of the WM_PAINT message, the WM_TIMER message, and the WM_QUIT message,the system always posts messages at the end of a message queue. Thisensures that a window receives its input messages in the proper firstin, first out (FIFO) sequence. The WM_PAINT message, the WM_TIMERmessage, and the WM_QUIT message, however, are kept in the queue andare forwarded to the window procedure only when the queue contains noother messages. In addition, multiple WM_PAINT messages for the samewindow are combined into a single WM_PAINT message, consolidating allinvalid parts of the client area into a single area. CombiningWM_PAINT messages reduces the number of times a window must redraw thecontents of its client area.
但是根据《programming windows》这本书
However, the window procedure could call a function that sends thewindow procedure another message, in which case the window proceduremust finish processing the second message before the function callreturns, at which time the window procedure proceeds with the originalmessage. For example, when a window procedure calls UpdateWindow,Windows calls the window procedure with a WM_PAINT message. When thewindow procedure finishes processing the WM_PAINT message, theUpdateWindowcall will return controls back to the window procedure.
如果WM_PAINT 是排队的消息,它应该被添加到消息队列中。因此在处理完当前消息和消息队列中的所有其他消息之前,它不会处理。这与上述说法存在争议。
我想知道哪个是正确的,谢谢。
最佳答案
任何消息都可以使用 SendMessage
直接发送到窗口过程,或者使用 PostMessage
发送到窗口的消息队列。 UpdateWindow
函数使用 SendMessage
将 WM_PAINT
消息直接发送到窗口过程,以便立即重绘窗口。当系统出于任何原因需要重新绘制窗口时,它通常会将消息发布到窗口的消息队列中。
因此 WM_PAINT
不是排队(发布)的消息,也不是已发送的消息。这只是一条消息。它可以发送或邮寄。有些消息仅用于发送或发布,但 WM_PAINT
不是其中之一。
关于windows - WM_PAINT 消息是排队消息还是非排队消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25713183/
我的自定义绘图区的 WM_PAINT 看起来像这样: // TRUE to clear the background if (GetUpdateRect(hwnd, &r, TRUE) == 0)
我一直在玩 uni 的 Windows api,但在初始创建后我无法让窗口消息调用 WM_PAINT。它在创建窗口时调用它,但不是在创建之后。 所有其他消息都会被调用!只是无法调用 WM_PAINT。
我经常画画。目前我正在使用 WM_TIMER 来安排使用 InvalidateRect 的绘画。由于某种原因,WM_PAINT 经常被称为区域 (0,0,0,0),因此基本上是一个空矩形。我试图将其解
当我隐藏窗口时,图形的一部分被删除。我使用 cout 来显示我的代码正在运行的位置,似乎每个函数都已执行,但图像没有重绘 case WM_PAINT:{ hDC = BeginPain
有人能告诉我如何获得 WM_PAINT 消息的帧速率(以每秒帧数为单位)吗?我正在尝试制作一个软件渲染器,帧率对于调试非常重要。 最佳答案 这个问题之前被问过here 。作为附加提示,您可以使用动态分
我在互联网上阅读了很多示例,但我仍然陷入困境。我正在尝试处理发送到我的应用程序的 WM_PAINT 消息。 在我的应用程序中,我总是在同一个 DC 中绘制,名为 g_hDC。它工作完美。当收到 WM_
我正在尝试编写一个窗口过程,仅在单击开始按钮时调用窗口中矩形的动画,并在单击停止按钮时停止。 我试过这样做: LRESULT CALLBACK WindowProcedure(HWND hWnd, U
我想“拦截”其他进程聊天框的 WM_PAINT 消息。功能:GetMessage(msg, hwnd, 0, 0) 似乎很完美,但我没有收到任何消息(我作为 super 用户尝试过)从现在开始,我的
在这篇文章中About Messages and Message Queues ,据说 WM_PAINT 是一种排队消息。 排队的消息 Whenever the user moves the mous
WM_PAINT 究竟是什么时候被调用的?我试图创建一个基于对话框的老虎机应用程序,但我遇到了几个逻辑问题。我的申请将包括: “旋转”按钮 退出按钮 三个 BMP 图像显示旋转结果(硬币/心/士兵)
我读到我永远不应该手动发送 WM_PAINT 并且应该调用 InvalidateRect 但没有找到任何关于为什么不这样做的信息。那为什么不呢? update 适用于 InvalidateRect 但
我有 MSVC 2019、vc142 x64、SDK 10.0.18362.0、WINAPI 游戏项目、已启用 JIT 调试、_DEBUG被定义为。我用assert()来自标准库#include 。
我创建了一个父窗口,它有许多子窗口,例如按钮、静态文本等。它们都是可见的并且工作没有任何问题,但是当我向窗口回调添加一段代码时它们全部消失+我看不到我刚刚尝试从函数中绘制的线。 如何解决这个问题? c
我有一个神秘的 WM_PAINT 消息被无缘无故地发送到一个窗口,我无法理解。我正在使用我的一些代码发送一条 WM_PAINT 消息- InvalidateRgn(graphwin_hwnd,NULL
我正在创建 Win32 控件: m_progress = CreateWindowExW(0, PROGRESS_CLASSW, L"ProgressBar", WS_VISIBLE | WS_CHI
这是针对 C++ - win32 的。基本上,我已将图像 (bmp) 从文件加载到 HBITMAP 中,并将其位 block 传输到主窗口的设备上下文。 如果我想更改图像,我该如何再次调用它? 我调用
我正在尝试使用带有 wm_paint 和 wm_printclient 的 SendMessage 捕获游戏窗口。 我已经使用 PrintWindow 成功地做到了,但是游戏可以在图形引擎之间切换,对
简介: 我决定在 MS Visual Studio 2008 中用 C++ 做一个测试项目来测试纯 WIN32 中的一个小程序,关于绘制位图作为窗口背景。 问题: 窗口应该有灰色画笔和在其客户区拉伸(
在 TextOut 行的这段代码中遇到一些问题,它说: error: cannot convert 'std::string* {aka std::basic_string*}' to 'LPCSTR
有没有办法在所有 WM_PAINT 调用完成后调整大小?这样我就可以自动调整我的窗口大小以适应我绘制的任何内容,因为最初我的窗口大小被定义为特定大小,可能会有未绘制的剩余空间,我如何删除这些剩余空间?
我是一名优秀的程序员,十分优秀!