问题标签 [wm-paint]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
160 浏览

c++ - 在子窗口中绘制形状

我正在开发一个 Win32 GUI 项目,其中有一个主窗口,在里面显示 3 个按钮和 1 个带有 BITMAP 的标签。像这样: 主窗口

我声明了一个标签数组,并为每个标签附加了一个位图,我是这样做的:

背景必须根据单击的按钮以及名为 value 的变量的值而变化,该变量的值可以是 1、2 或 4。

然后我像这样处理按钮的事件:

setVisibleBacground 的声明是这样的:

到目前为止,一切正常,但现在我需要按下第三个按钮以显示第三个背景,然后绘制一个形状,例如背景上方的矩形或椭圆。

我试试这个:

单击第三个按钮时它的值将等于 4,我尝试像这样更改 setVisibleBackground 函数:

但是这段代码只有在我按下第一个和第二个按钮时才有效,背景发生了变化,但是当我按下第三个按钮时它失败了,首先它绘制了圆圈,然后它显示了圆圈上方的背景,就像在这个 图像中一样

任何帮助将不胜感激

0 投票
1 回答
322 浏览

c++ - 在 windows.h 的 WM_PAINT 中启用输出缓冲

编辑:我知道这是绘制正方形的最慢方法,但我确实需要单独设置像素以用于单独的目的。


我很确定我要做的是创建一个帧缓冲区。我有以下代码:


想要的结果

一个红色方块,它不显示正在绘制的每个像素,而是一个即时绘制的红色方块。为了分解它,我希望在将内存释放到视频内存之前先填满内存,而不是一个接一个地释放到视频内存(我希望我在这里使用了正确的词......)


问题

与预期结果相反,在设置每个像素时,我从左到右快速绘制正方形。


我在寻找什么

启用输出缓冲到我的窗口的命令或存储像素然后一次绘制它们的函数,或任何其他可以让我获得所需结果的方法。

先感谢您。我认为说我只用 C++ 语言编程 5 天会很有帮助,并且非常感谢任何故障或直接答案。

0 投票
0 回答
343 浏览

c++ - C++ | Win32 API | 卡在白屏| 无效矩形()

亲爱的开发者和社区,

我目前正在使用带有 GUI 的 Win32 API 开发蛇游戏。

我在 WM_PAINT 消息中的 WndProc() 函数中绘制 Snake,然后创建绘制上下文并绘制矩形。

但问题是 Snake 正在移动,并且绘制的 Rectangles 不再消失。所以我在 WndProc() 中调用了函数 InvalidateRect() 来更新我的窗口。这是可行的,但是在蛇走了 42 步之后,窗口变成了白色,有时按钮(最小化,最大化,...)也

这是图片

然后我将 InvalidRect() 调用与 CreateTimerQueueTimer() 一起放入 TimerRoutine。问题似乎解决了,但几分钟后又出现了。这是代码:

...在主要:

... 在 WndProc() 中:

0 投票
1 回答
511 浏览

c++ - WM_PAINT 与 PROGRESS_CLASS

我正在创建 Win32 控件:

它正在工作,但我也想在上面绘制带有百分比的文本所以我将进度控制子类化如下:

但如果至少取消注释“HDC hdc = BeginPaint(hwnd, &ps);” 然后出现文本,但默认控件绝对消失(就像它没有被绘制) 我怎样才能修复它以显示带有文本的默认 Windows 控件,因为我不需要绘制自定义控件,只添加覆盖文本?谢谢

0 投票
1 回答
331 浏览

windows - 如何读取 WM_PAINT 消息的内容?

我的目标是截取不断更新新文本的程序的一部分。我已经尝试使用 Tesseract 进行 OCR,但我相信如果可能的话,以某种方式截取文本会更有效。我曾尝试使用 GetWindowText() 函数,但它只返回窗口标题。使用Window Detective我已经确定,每当窗口以我希望捕获的方式更新时,都会可靠地将 WM_PAINT 消息发送到窗口。

我对 Windows API Hooks 进行了一些研究,但似乎这些涉及 DLL 注入的大多数技术旨在发送新消息,而不是访问已发送消息的内容。

我应该如何解决这个问题?

0 投票
1 回答
1730 浏览

winapi - WM_PAINT 消息,BeginPaint 循环

我不明白为什么我在 BeginPaint 函数上有一个循环。我已经阅读过关于这种循环的帖子,但几乎所有帖子都推荐:“不要忘记在 WM_PAINT 消息上使用 BeginPaint 函数,否则它需要后续的 WM_PAINT 消息”。这不是我的情况。你能给我一些建议吗?

这是我的窗口类(“CWindow”):

WndProc 函数。

注册类

创建窗口

节目

WinMain

0 投票
2 回答
125 浏览

winapi - 当窗口最小化时更改系统颜色时菜单栏消失

我的应用程序有一个工具栏类型的菜单。我对窗口过程进行了子类化以允许视觉增强,这意味着我的应用程序正在绘制菜单栏。当应用程序窗口最小化并恢复时,菜单重新绘制就好了。

但是,如果在最小化应用程序窗口时更改了系统颜色,则在恢复应用程序窗口时菜单栏会消失。我发现当应用程序窗口最小化时系统颜色发生变化时,WM_PAINT窗口恢复后不会发送到菜单栏。

我尝试了以下方法:

  1. 通过调用响应来强制发送WM_PAINT到菜单栏,但它不会导致发送 a。InvalidateRect()WM_SIZEWM_PAINT

  2. 通过调用标志强制发送WM_PAINT到菜单栏。发送成功,调用绘制菜单的程序。但仍然没有显示菜单。RedrawWindow()RDW_INTERNALPAINTWM_PAINT

  3. 当系统颜色发生变化时,通过调用ShowWindow()来恢复窗口WM_SYSCOLORCHANGE。有效。WM_PAINT发送到菜单栏并显示菜单。然而,我认为让我的窗口突然弹出来打断用户对其他程序所做的任何事情是不礼貌的。

谁能告诉我如何在不恢复窗口的情况下正确保持菜单栏绘画?

以下是我尝试做到的方式。

在主窗口过程中:

这是 fn 的摘录。InitDialog() 显示菜单栏的初始化

菜单栏在对话框资源中定义如下

0 投票
1 回答
217 浏览

c - 如何在 WM_PAINT 中绘制一个 Windows 按钮?

我想构建一个自定义 Windows 按钮而不对其进行子类化。

我只是想绘制它,就像我会通过调用来绘制一个矩形FillRect()

如何调用执行绘画的 BUTTON 窗口类注册的窗口过程?

更新

如评论中所述,我想绘制一个看起来像按钮的图像,而没有作为按钮的子窗口。

0 投票
1 回答
215 浏览

winapi - SysTabControl32 的 WM_DRAWITEM 被重绘?

我必须重新设计我们的 SysTabControl32,所以我尝试使用 TCS_OWNERDRAWFIXED 和 WM_DRAWITEM。一切正常,但似乎选项卡仍然被系统覆盖。

不幸的是,代码在可视对象中,这使事情变得更加复杂。在过去的几个小时里,我已经尝试了很多东西,暂时我一无所知。也许你们中的一些人可以提供帮助或给我一个提示。

这里有一些图片:

带有 TCS_OWNERDRAWFIXED 的“裸”选项卡控件。WM_DRAWITEM 处没有代码。

您会注意到选项卡未填充,但 3D 样式已绘制。这是我的主要问题,因为只要我知道这不应该发生。

图片

带有文本和背景颜色的 Ownerdrawn 选项卡(丑陋但对查看问题很有用)

图片

相同的 TabControl,但设置了 TCS_FLATBUTTONS 和 TCS_EX_FLATSEPARATORS。仍然是灰色背景的问题。

图片

如您所知,WM_DRAWITEM 将在父窗口中捕获。我还尝试在 TabControl 本身中覆盖或忽略 WM_PAINT。但这无济于事。

我也玩过 WM_ERASEBKGND,但我被困在这一点上。

在从 codeplex 到 codeguru 甚至 vbAccelerator 的所有页面上,它都应该可以工作。应该:)不知道它是否是视觉对象,但API是API,这仍然是一个标准控件。

WM_DRAWITEM 包含此代码,看起来还可以。项目是 DRAWITEMSTRUCT。

0 投票
2 回答
155 浏览

winapi - Rich Edit Control 在取消最小化后将整个应用程序涂成黑色

已解决:我已经发布了我的解决方案作为答案。

这是我的问题:(gif)(如果我在任何 WM_PAINT 消息之前取消最小化时重新加载位图以绘制背景图像,则可以解决。)

背景消失

每当我取消最小化应用程序,应用程序首次显示 OK 的时间(除非您正在使用调试器单步执行,否则会短暂显示一秒钟),然后突然变黑(或在应用程序窗口类中设置为 hbrBackground 的任何颜色)时,都会发生这种情况。我可以通过重新加载 WM_PAINT 中使用的 HBITMAP 来防止这种行为,这些 HBITMAP 是全局变量,并在应用程序启动时使用相应的值进行初始化。

gif 开始显示应用程序在最小化后重新打开,调试器逐步通过 Rich Edit Control 消息循环的父窗口,所有窗口的背景变为黑色之前和之后的时刻,然后进入 Rich Edit Control 子类消息循环,进入 WM_PAINT。

  • 如果我在应用程序之间切换而相关应用程序以前从未被最小化过,这永远不会发生。
  • 如果富编辑控件 (RICHEDIT50W) 之前没有显示任何文本,即不会发生这种情况。如果没有显示任何文本,该应用程序可以正常工作。
  • 这是窗口树:
    • 主窗口
      • 一些子窗口
      • 子窗口 1
        • 丰富的编辑控制

踏出子窗口 1 WndProc;进入 WndSubclassProcWhatever 回调中 Rich Edit Control 的 WM_PAINT。

在意识到在 unminimize 之后调用 LoadImage() 可以解决后台问题之前,我做了一些事情:

  • 用子类拦截富编辑控件的消息循环,并处理(以及在每个其他窗口中)消息:WM_COMMAND、WM_IME_NOTIFY、WM_NCPAINT、WM_WINDOWPOSCHANGED、WM_WINDOWPOSCHANGING、WM_ERASEBKGND... 主要返回与 DefSubclassProc/DefWindowProcW 不同的内容.

  • 重新打开应用程序后立即调用 ValidateRect() ...

    在此之前发生过这种情况,而不是整个应用程序变黑,只有文本“突出显示”或富编辑控件父级变黑,整个应用程序在另一个最小化取消最小化周期后变黑。

我在更新的 Windows 10 中使用具有默认设置的 Visual Studio Community 2019,并且在发布和调试版本中都看到了这个问题。

我现在期待防止位图“卸载”,从而节省许多看似不必要的 LoadImage() 调用。解决了

我尝试上传代码的最小版本,但行为结果并不完全相同,所以感谢之前给出的答案!