- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在窗口的客户区上绘制(绘制)文本以响应某些事件(不在 WM_PAINT
消息中),那么如何在调用 WM_PAINT
之间保持客户区的状态?我知道每次有 WM_PAINT
消息(或窗口刷新)时,窗口都会重新绘制,WM_PAINT
之外的所有内容都不再重要。我想我将能够更好地使用代码进行交流,所以这就是我现在所拥有的。
HDC mdc;
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance,
LPSTR lpszArgument, int nFunsterStil)
{
LoadBitmap(...); // for skinning the app.
stuff..
}
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
case WM_PAINT:
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
BITMAP bm;
HDC dcSkin = CreateCompatibleDC(hdc);
GetObject(hSkinBmp, sizeof(bm), &bm);
SelectObject(dcSkin, hSkinBmp);
BitBlt(dcSkin, 0, 0, wWidth, wHeight, mdc, 0, 0, SRCCOPY);
BitBlt(hdc, 0, 0, wWidth, wHeight, dcSkin, 0, 0, SRCCOPY);
DeleteDC(dcSkin);
EndPaint(hwnd, &ps);
break;
case WM_LBUTTONDOWN;
HDC hdc = GetDC( hwnd );
mdc = CreateCompatibleDC( hdc );
LPRECT rect;
GetClientRect( hwnd, rect);
SelectObject( mdc, CreateCompatibleBitmap( hdc, rect->right, rect->bottom ) );
BitBlt( mdc,0,0,rect->right,rect->bottom,hdc,0,0,SRCCOPY );
HFONT hfont = CreateFont( 0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
PROOF_QUALITY, DEFAULT_PITCH | FF_SWISS , 0 );
HFONT hOldFont = (HFONT)SelectObject( mdc, hfont );
SetTextColor( mdc, RGB(255,0,0) );
SetBkColor( mdc, RGB(255,255,0) );
TextOut( mdc, 50, 150, logintext.c_str(), strlen( logintext.c_str() ) );
SelectObject( mdc, hOldFont );
ReleaseDC( hwnd, hdc);
InvalidateRect( hwnd, 0, TRUE );
break;
}
如您所见,我必须用 bmp 绘制窗口的客户区,然后当出现鼠标按钮按下消息时,我必须在蒙皮客户区的顶部输出一些文本。我正在做的是保存在 WM_LBUTTONDOWN
消息中创建的内存 dc,并尝试首先使用皮肤 dc 绘制窗口 dc,然后使用文本 dc(在 WM_LBUTTONDOWN
中创建的内存 dc)绘制窗口 dc。
皮肤位图按预期显示,但文本没有显示。
我如何实现这一点?
最佳答案
如果我对你的理解是正确的,你想在 WM_PAINT 之外绘制东西并让它们持久存在。不幸的是,这不是 Windows 的工作方式。
您需要能够重绘 WM_PAINT 处理程序中的一切,因为窗口的内容可以随时被销毁并重绘,因此您必须构建程序才能做到这一点.与其在 WM_PAINT 处理程序之外绘制任何内容,不如设置一些标志或其他状态来告诉程序应该在屏幕上显示什么,然后使屏幕区域无效,以便发出 WM_PAINT 来绘制该区域。
一种对您来说可能更容易的替代方法是在需要更新时将所有内容绘制到屏幕外位图,并让 WM_PAINT 函数只在屏幕上绘制该位图,以便它始终是最新的。
关于c++ - 在 win32 中保留对 WM_PAINT 调用之间绘制的客户区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13567628/
我的自定义绘图区的 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 调用完成后调整大小?这样我就可以自动调整我的窗口大小以适应我绘制的任何内容,因为最初我的窗口大小被定义为特定大小,可能会有未绘制的剩余空间,我如何删除这些剩余空间?
我是一名优秀的程序员,十分优秀!