- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在透明窗口上使用 GDIplus 进行绘图,但遇到了很多闪烁。我读过很多帖子,建议实现双缓冲或渲染到屏幕外表面会有所帮助,我已经这样做了,但无济于事。
知道我做错了什么以及如何解决吗?谢谢。
#include <Windows.h>
#include <stdio.h>
#include <time.h>
#include <GdiPlus.h>
#pragma comment(lib, "GdiPlus.lib")
HWND hWnd = NULL;
WNDCLASSEX wcex;
HDC hdc = NULL;
PAINTSTRUCT ps;
HGDIOBJ hfDefault;
MSG msg;
COLORREF transKey = RGB(37,14,103);
ULONG_PTR m_gdiplusToken;
char window_title[9] = "testings";
char window_class[9] = "testings";
int window_width = GetSystemMetrics(SM_CXSCREEN);
int window_height = GetSystemMetrics(SM_CYSCREEN);
DWORD MainThread(LPVOID lpArgs)
{
while(1)
{
RECT rc = {0,0,window_width,window_height};
InvalidateRect(hWnd, &rc, false);
UpdateWindow(hWnd);
Sleep(50);
}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
if(msg == WM_CREATE)
{
hfDefault = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
SetLayeredWindowAttributes(hWnd, transKey, 128, LWA_COLORKEY);
}
else if(msg == WM_PAINT)
{
hdc = BeginPaint(hWnd, &ps);
Gdiplus::Graphics g(hdc);
g.Clear(Gdiplus::Color(37,14,103));
Gdiplus::Bitmap* curBitmap = new Gdiplus::Bitmap(window_width, window_height);
Gdiplus::Graphics* g1 = g.FromImage(curBitmap);
static int x=1,y=1;
// x += 3;
y += 2;
Gdiplus::Pen pen(Gdiplus::Color(255, 255, 0, 255));
g1->DrawLine(&pen, x, y, window_width/2, window_height/2);
g.DrawImage(curBitmap, 0, 0);
EndPaint(hWnd, &ps);
}
else if(msg == WM_CLOSE)
{
DestroyWindow(hWnd);
}
else if(msg == WM_DESTROY)
{
PostQuitMessage(0);
}
else
{
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HBRUSH hbrBackground = CreateSolidBrush(transKey);
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = hbrBackground;
wcex.lpszMenuName = NULL;
wcex.lpszClassName = window_class;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
if(!RegisterClassEx(&wcex))
return 1;
hWnd = CreateWindowEx(
WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST,
window_class,
window_title,
WS_POPUP,
0,
0,
window_width,
window_height,
NULL,
NULL,
hInstance,
NULL
);
if(!hWnd)
return 1;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)MainThread, NULL, NULL, NULL);
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Gdiplus::GdiplusShutdown(m_gdiplusToken);
return msg.wParam;
}
最佳答案
您的窗口具有 WS_EX_TRANSPARENT
属性,这会导致其下方的窗口在每次您的窗口无效时重新绘制。尝试将其删除。
WS_EX_TRANSPARENT
的含义是告诉 Windows 您不会在整个窗口表面上绘制(即保留部分透明),因此它需要确保首先渲染下面的所有内容所以它可以显示出来。
关于c++ - GDIplus闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14162900/
基本上,我试图找出 Gdiplus::Bitmap* 是否不为 NULL(或 0)。如果是这样删除它,然后在适当的位置创建一个“new Gdiplus::Bitmap()”。我正在尝试这样做以防止将来
我收到这个错误,我不知道为什么或不明白原因: vector fourier_descriptor(Gdiplus::Bitmap myBitmap) { vector res;
我仔细阅读了 MSDN 文档,但找不到任何一种说法。我感兴趣的是: 我可以在一个线程上调用 GdiplusStartup() 然后在另一个线程上使用 Gdiplus 吗?还是我需要为每个线程调用 Gd
我最近在 GDI+ 中通过第 3 方工具遇到了 OverflowException,这给我带来了一些问题。我正在尝试找出造成这种情况的原因,然后决定是否有解决问题的方法。 错误发生在 SafeNati
我有一个单色位图。我将其用于碰撞检测。 // creates the monochrome bitmap bmpTest = new Bitmap(200, 200, PixelFormat1bppI
我想编写一个程序来加载命令行给定的图像,然后用它做一些事情。我现在的问题是:每当我执行该程序时,它都会打印出图像的调色板大小(对于我输入的每张 jpg 格式的图片,它都会给我一个错误的输出 (12))
你好,我正在尝试更改比例 GDIplus::Bitmap 并在内存中保存缩放的 BItmap,但我遇到了问题。我尝试了很多不同的样本,结果是 NULL。例如,我尝试使用 SetResolution 更
我正在执行 dcraw 并使用匿名管道将其通过管道传输到 char 数组。 我的问题是如何从包含 jpeg 图像的字符数组创建 Gdiplus::Image 对象?无需从磁盘写入和读取。 最佳答案 您
我正在使用 MySQL++ API 从 MySQL 数据库中提取图像。我得到的图像是 mysqlpp::sql_mediumblob,它是字符串的表示。现在我想使用 GDI+ 旋转一些图片,但我不知道
我可以找到所有 GDIPlus 演示代码,并且不会失效。那么,当在 TScrollbox 上使用 MouseMove 和 TImage 进行绘制时,如何使 GDIPlus API 中的矩形无效呢? f
我正在查看 graphviz (gvc),以便将一些图形的创建嵌入到我正在使用的 MFC 应用程序中。 据我所知,呈现为 png 文件非常简单,但我想将其呈现为 gdiplus 上下文,而不必将临时文
我在使用 GDI+ 库时遇到了问题。我想使用一个字符串变量来加载一个Bitmap 变量。我不知道如何调用它,因为我是这个库的新手。 我的程序只是在字符串变量中获取 image.bmp 路径: stri
我有一个新的位图代码,但是当我使用删除时,任务管理器中的内存使用量并没有减少。 我的代码如下 Bitmap* pBuffer = new Bitmap(pMainImage->GetWidth(),
我想在桌面上画一些文字和线条。 我正在使用 gdiplus.h 打印带有函数 DrawString 的文本。 但它只能在主屏幕监视器上打印文本。 如果在演示模式下有 2 个显示器,我需要在第二个显示器
以下函数的目的是从从文件加载的位图中获取每个像素的 R、G、B 值并将它们增加 10。 void PerformTransformation(Gdiplus::Bitmap* bitmap, LPCT
我正在使用以下代码在 C 中使用 GDI+ 调整位图的大小。我正在获取顶部边缘的灰度值,即使对于该区域应该为白色的图像也是如此。当插值是最近邻时,问题就消失了。但是,我尝试使用 ImageMagick
我目前在向我的表单显示单色位图时遇到问题。我相信我以某种方式错误地设置了我的位图,但我现在看不到它在哪里。要“修复”这个问题,我所要做的就是将 biBitCount 设置为 24,但是当我在后面调用
我正在将文本绘制到 DIB 部分屏幕外位图中,它是 32 位深并使用 alpha channel (ARGB)。我直接将像素绘制到内存中。然后,我创建一个 Gdiplus Graphics 对象,将我
我需要使用我的应用程序重新分发 gdiplus.dll v.1.1,并确保使用这个特定版本。例如。 Windows XP 有系统版本的gdiplus.dll 但不能升级(v.1.0)。但是如果我把我的
看这段代码 Gdiplus::Graphics g(hDC); Gdiplus::Font *f = new Font(L"Times new roman", 16); Gdiplus::SolidB
我是一名优秀的程序员,十分优秀!