- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有以下功能,我正试图将其集成到我的 directx 11 应用程序中。当我使用 directx9 时,一切正常,但是当转换为 directx 11 时,我在 Bitblt 行出现蓝屏死机错误(我一定是 HDC 做错了什么?)。我想知道将此代码转换为 directx 11 兼容表面而不是 HDC 的最佳方法是什么。
函数如下:
void CFlashDXPlayer::DrawFrame(HDC dc)
{
if (m_dirtyFlag)
{
IViewObject* pViewObject = NULL;
m_flashInterface->QueryInterface(IID_IViewObject, (LPVOID*) &pViewObject);
if (pViewObject != NULL)
{
// Combine regions
HRGN unionRgn, first, second = NULL;
unionRgn = CreateRectRgnIndirect(&m_dirtyRects[0]);
if (m_dirtyRects.size() >= 2)
second = CreateRectRgn(0, 0, 1, 1);
for (std::vector<RECT>::iterator it = m_dirtyRects.begin() + 1; it != m_dirtyRects.end(); ++it)
{
// Fill combined region
first = unionRgn;
SetRectRgn(second, it->left, it->top, it->right, it->bottom);
unionRgn = CreateRectRgn(0, 0, 1, 1);
CombineRgn(unionRgn, first, second, RGN_OR);
DeleteObject(first);
}
if (second)
DeleteObject(second);
RECT clipRgnRect; GetRgnBox(unionRgn, &clipRgnRect);
RECTL clipRect = { 0, 0, m_width, m_height };
// Fill background
if (m_transpMode != TMODE_FULL_ALPHA)
{
// Set clip region
SelectClipRgn(dc, unionRgn);
COLORREF fillColor = GetBackgroundColor();
HBRUSH fillColorBrush = CreateSolidBrush(fillColor);
FillRgn(dc, unionRgn, fillColorBrush);
DeleteObject(fillColorBrush);
// Draw to main buffer
HRESULT hr = pViewObject->Draw(DVASPECT_TRANSPARENT, 1, NULL, NULL, NULL, dc, &clipRect, &clipRect, NULL, 0);
assert(SUCCEEDED(hr));
}
else
{
if (m_alphaBlackDC == NULL)
{
// Create memory buffers
BITMAPINFOHEADER bih = {0};
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biBitCount = 32;
bih.biCompression = BI_RGB;
bih.biPlanes = 1;
bih.biWidth = LONG(m_width);
bih.biHeight = -LONG(m_height);
m_alphaBlackDC = CreateCompatibleDC(dc);
m_alphaBlackBitmap = CreateDIBSection(m_alphaBlackDC, (BITMAPINFO*)&bih, DIB_RGB_COLORS, (void**)&m_alphaBlackBuffer, 0, 0);
SelectObject(m_alphaBlackDC, m_alphaBlackBitmap);
m_alphaWhiteDC = CreateCompatibleDC(dc);
m_alphaWhiteBitmap = CreateDIBSection(m_alphaWhiteDC, (BITMAPINFO*)&bih, DIB_RGB_COLORS, (void**)&m_alphaWhiteBuffer, 0, 0);
SelectObject(m_alphaWhiteDC, m_alphaWhiteBitmap);
}
HRESULT hr;
HBRUSH fillColorBrush;
// Render frame twice - against white and against black background to calculate alpha
SelectClipRgn(m_alphaBlackDC, unionRgn);
COLORREF blackColor = 0x00000000;
fillColorBrush = CreateSolidBrush(blackColor);
FillRgn(m_alphaBlackDC, unionRgn, fillColorBrush);
DeleteObject(fillColorBrush);
hr = pViewObject->Draw(DVASPECT_TRANSPARENT, 1, NULL, NULL, NULL, m_alphaBlackDC, &clipRect, &clipRect, NULL, 0);
assert(SUCCEEDED(hr));
// White background
SelectClipRgn(m_alphaWhiteDC, unionRgn);
COLORREF whiteColor = 0x00FFFFFF;
fillColorBrush = CreateSolidBrush(whiteColor);
FillRgn(m_alphaWhiteDC, unionRgn, fillColorBrush);
DeleteObject(fillColorBrush);
hr = pViewObject->Draw(DVASPECT_TRANSPARENT, 1, NULL, NULL, NULL, m_alphaWhiteDC, &clipRect, &clipRect, NULL, 0);
assert(SUCCEEDED(hr));
// Combine alpha
for (LONG y = clipRgnRect.top; y < clipRgnRect.bottom; ++y)
{
int offset = y * m_width * 4 + clipRgnRect.left * 4;
for (LONG x = clipRgnRect.left; x < clipRgnRect.right; ++x)
{
BYTE blackRed = m_alphaBlackBuffer[offset];
BYTE whiteRed = m_alphaWhiteBuffer[offset];
m_alphaBlackBuffer[offset + 3] = 255 - (whiteRed - blackRed);
offset += 4;
}
}
// Blit result to target DC
BitBlt(dc, clipRgnRect.left, clipRgnRect.top,
clipRgnRect.right - clipRgnRect.left,
clipRgnRect.bottom - clipRgnRect.top,
m_alphaBlackDC, clipRgnRect.left, clipRgnRect.top, SRCCOPY);
}
DeleteObject(unionRgn);
pViewObject->Release();
}
m_dirtyFlag = false;
m_dirtyRects.clear();
m_dirtyUnionRect.left = m_dirtyUnionRect.top = LONG_MAX;
m_dirtyUnionRect.right = m_dirtyUnionRect.bottom = -LONG_MAX;
}
}
我传递给此函数的 HDC 是按以下方式创建的:
D3D11_TEXTURE2D_DESC textureDesc;
ZeroMemory(&textureDesc, sizeof(textureDesc));
textureDesc.Width = width;
textureDesc.Height = height;
textureDesc.MipLevels = 1;
textureDesc.ArraySize = 1;
textureDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
textureDesc.SampleDesc.Count = 1;
textureDesc.Usage = D3D11_USAGE_DEFAULT;
textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
textureDesc.MiscFlags = D3D11_RESOURCE_MISC_GDI_COMPATIBLE;
HRESULT hr = device->CreateTexture2D(&textureDesc, NULL, &m_flashTexture);
HRESULT hResult;
HDC hDC;
IDXGISurface1 *pSurface = NULL;
hResult = m_flashTexture->QueryInterface(__uuidof(IDXGISurface1), (void**)&pSurface);
hResult = pSurface->GetDC(TRUE, &hDC);
assert(SUCCEEDED(hResult));
m_flashPlayer->DrawFrame(hDC);
对我做错了什么有什么想法吗?我似乎无法弄清楚发生了什么,以及为什么当我使用 Directx 9 obejcts 时它不会导致蓝屏。有更好的方法吗?
(我也尝试更新我的驱动程序,它们都是最新的)。
谢谢你的帮助。
最佳答案
事实证明这确实是一个驱动程序问题。当我在我的 latop 中将我的显卡设置为 radeon 时,它可以正常工作,但是当我出于某种原因将它设置为可切换时,即使它应该选择我的 radeon,它仍然会崩溃。我需要修复图形模式。很奇怪,但至少我猜这不是我的程序。
关于c++ - Directx 11 Bitblt 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9406728/
我正在使用下面的代码使用 bltblt 捕获窗口的屏幕截图。但是,标题栏在捕获的屏幕截图中显示为完全黑色。我在 Windows 8.1 上运行代码。有没有一种方法可以正确捕获标题栏。 // Retri
我有一个将多页 tiff 拆分为单页的函数,它使用 Windows BitBlt 函数。在性能方面,显卡对拆分有影响吗?是否值得直接使用 C/C++ 库? 最佳答案 显卡不会参与任何事件,除非它是 B
我正在尝试编写一个程序,当勾选一个复选框时,它会在屏幕的大面积区域显示一个网格。我正在尝试使用 BitBlt 在 WM_PAINT 中执行此操作,并且我的显示函数肯定是使用正确的 bool 值调用的。
我正在使用 MFC,我正在尝试将图像绘制到屏幕上。我有以下 OnDraw 函数: void CgraphicstestView::OnDraw(CDC* pDC) { CgraphicstestDo
我正在将剪贴板中的图像粘贴到我的程序中。位图被放置在背景 memDC 位图上,然后在绘制到屏幕之前与另一个 memDC 合成。背景位图是每像素 8 位。问题是 bitblt 将 Black(0x000
我正在使用 BitBlt 在我的按钮上显示位图。对于大多数情况,它很好,但是存在内存泄漏,导致程序在一段时间后崩溃。我做错了什么? int Springboard::DrawBasicButtons(
我正在为一个简单的 Direct3D 游戏制作闪屏,尽管屏幕本身已正确创建和销毁,但未显示要投影到闪屏上的 BITMAP。到目前为止我有这个: //variable declarations HWND
我有一个 MFC 控件,我将一个句柄传递给一个位图 (HBITMAP)。在控件 OnPaint 方法中,我使用 BitBlt 来呈现位图。但是位图被颠倒了。 作为测试,我从这个句柄创建了一个 CBit
我正在尝试在 Windows 10 下使用 GDI 捕获屏幕的正方形部分。这就是我尝试的方式: //Get screen DC desktop = GetDC(NULL); //Create a co
我想在现有引擎中创建裁剪功能。这是我已经拥有的: bool Bitmap::Crop(RECT cropArea) { BITMAP bm; GetObject(m_Handle, sizeof(bm
我正在尝试使用此代码将 Bitmap 直接绘制到 PictureBox 上: Bitmap bmp = (Bitmap)Bitmap.FromFile(@"C:\Users\Ken\Desktop\L
我正在尝试绘制到屏幕外设备上下文/位图,并使用 bitblt 将图像移动到主 hdc。这是我目前看到的结果: 左边的蓝色、黄色和绿色条被直接绘制到窗口的 hdc。右边看起来很奇怪的那些被绘制到后台缓冲
我想创建一个幻灯片效果:在窗体的 Canvas 上从右到左绘制一个位图。为此,我使用 BitBlt。 我在定时器(20 毫秒)中调用此函数: var ViewPort: TRect; ViewPort
您好我试图捕获屏幕截图,但图像出来损坏,任何人都可以看到代码有什么问题,基本上我试图使用createdibsection以便我可以直接访问这些位。 这就是结果图片 http://oi47.tinypi
将一个 QImage 复制到 Qt4 中特定位置的另一个 QImage 的推荐方法是什么? QImage::bitblt 在 Qt4 中被删除。 QImage 现在需要转换为 PixMap 并返回吗?
我在这个程序中使用 BitBlt 时遇到问题。您调整窗口大小,椭圆也会随之调整大小。当然,用普通的hdc方法,是断断续续的。我尝试了 BitBlt 方法,但这也不起作用(可能是因为我做错了)。有人可以
这是我目前正在做的: 通过GetWindowDC获取窗口DC 使用 CreateCompatibleDC 创建一个兼容的 DC 在我的兼容 DC 上调用 GetPixel 不幸的是,我所有的 GetP
现在我正在使用 GetPixel() 从桌面检索大约 64 个像素以获得它们的颜色。我读到有关 GetPixel() 的信息很慢,但我认为这对几个像素并不重要,但每次我运行例程都需要 1.5 秒。在做
我编写了以下代码 (C++ Win32) 来捕获游戏窗口屏幕并从图像中获取像素颜色数组。函数 autoB() 完成这项工作。 然后我将结果数组绘制到我的窗口中以直观地检查我得到了什么。 问题是这个程序
我目前正在使用 Petzold 的书(第 5 版)回到一些 Windows 编程。我编译了following example使用 BitBlt 但它无法正常工作。 它应该复制 (CxSource, C
我是一名优秀的程序员,十分优秀!