gpt4 book ai didi

创建一个简单的单缓冲区应用程序 (IDirectDraw)

转载 作者:太空宇宙 更新时间:2023-11-04 04:49:44 24 4
gpt4 key购买 nike

我正在尝试使用原始的 DirectDraw 界面编写一个带缓冲的窗口应用程序。

这纯粹是出于教育目的和 just because 的态度。我正在使用 IDirectDraw 界面(我强调这是原始版本,如 DirectX 1.0 中一样)。

现在,该文档包含一组关于创建后台缓冲区以及在主表面和后台缓冲区表面之间翻转的教程。

但是,它没有提供有关编写窗口、单缓冲区应用程序的描述。事实上,我根本找不到关于这个想法的引用资料。没有任何迹象表明这是不可能的。

通过将合作级别设置为 DDSCL_NORMAL,应用程序将在一个窗口内运行。

hr = IDirectDraw_SetCooperativeLevel(lpDirectDraw, hWnd_, DDSCL_NORMAL);
if (hr != DD_OK)
return -1;

成功后创建主面。

ZeroMemory(&ddSurfaceDesc, sizeof ddSurfaceDesc);
ddSurfaceDesc.dwSize = sizeof ddSurfaceDesc;
ddSurfaceDesc.dwFlags = DDSD_CAPS;
ddSurfaceDesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

hr = IDirectDraw_CreateSurface(lpDirectDraw, &ddSurfaceDesc, &lpDirectDrawPrimarySurface, (IUnknown *) NULL);
if (hr != DD_OK)
return -1;

这个函数也成功了。请注意,我创建后台缓冲区。

但是,在我的主循环中:

while (fIterateLoop)
{
for (ZeroMemory(&msg, sizeof msg); PeekMessage(&msg, (HWND) NULL, 0, 0, PM_REMOVE); DispatchMessage(&msg))
fIterateLoop = msg.message == WM_QUIT ? FALSE : TRUE;

if (fDraw && lpDirectDrawPrimarySurface != (LPDIRECTDRAWSURFACE) NULL)
{
HDC hdc;

hr = IDirectDrawSurface_GetDC(lpDirectDrawPrimarySurface, &hdc);
if (hr == DD_OK)
{
SetBkColor(hdc, RGB(0, 0, 0));
SetTextColor(hdc, RGB(255, 255, 255));
TextOut(hdc, 15, 15, "hello, world!", sizeof "hello, world!" - 1);

hr = IDirectDrawSurface_ReleaseDC(lpDirectDrawPrimarySurface, hdc);
}
}
}

没有任何东西被绘制到窗口中。我的原始代码(全屏缓冲应用程序)正确显示“hello, world!”在屏幕的左上角,唯一的修改是停止后台缓冲区创建并直接写入主表面的微小编辑。

如果我在使用 DDSCL_NORMAL 调用 SetCooperativeLevel 后调用带有后台缓冲区选项的 CreateSurface,则它会返回错误。我理解这一点,因为文档指出:

If you were using IDirectDraw::SetCooperativeLevel to set the mode to DDSCL_NORMAL, you could create only surfaces that blit between the surfaces.

我错过了什么吗?我是否从根本上误解了 DirectDraw?我的印象是使用缓冲区是为了:

  • 性能优势,以及
  • 防止屏幕撕裂。

我不关心这些,对不对。我能做什么?

最佳答案

技术上没有问题。这些命令实际上是在屏幕上绘制文本。然而,问题是命令是相对于整个显示器绘制的,不是相对于客户区域

我在尝试集成对实时更改客户区大小的支持并意外地将应用程序设置为 SIZE_MAXIMIZED 时发现了这一点。并通过IDirectDrawSurface_Restore恢复表面.事后看来,我应该多花点功夫,画到屏幕中央而不是左上角。

我还没有找到如何修改程序以相对于客户区进行绘制,但这个问题的核心是关于使用单个缓冲区和一个窗口进行绘制,我已经解决了这个问题。

关于创建一个简单的单缓冲区应用程序 (IDirectDraw),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16865913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com