0

我正在向我的 2D 图形引擎添加 Direct Draw 渲染选项。

在非全屏应用程序上设置 Direct Draw Clipper 时,如果 Window 的客户区左上角位置不在屏幕的 0,0 上,则剪裁器会使用偏移量剪辑客户区。

这是我的剪辑器设置代码:

LPDIRECTDRAWCLIPPER directDrawClipper = nullptr;
if (!FAILED(mDirectDraw->CreateClipper(0, &directDrawClipper, NULL))) {
    if (!FAILED(directDrawClipper->SetHWnd(0, App->getWindow()->getHandle()))) {
        if (!FAILED(mDirectDrawFrontBuffer->SetClipper(directDrawClipper))) {
            if (!FAILED(mDirectDrawBackBuffer->SetClipper(directDrawClipper))) {    
                return true; //all good
            } else {
                throw Error::Exception(L"DirectDraw arka görüntü bellek tamponu kesicisi kurulamadı", 
                                       L"Renderer Kurulum Hatası");
            }
        } else {
            throw Error::Exception(L"DirectDraw ana görüntü bellek tamponu kesicisi kurulamadı", 
                                   L"Renderer Kurulum Hatası");
        }
    } else {
        throw Error::Exception(L"DirectDraw kesicisi pencereye kurulamadı", 
                               L"Renderer Kurulum Hatası");
    }
} else {
    throw Error::Exception(L"DirectDraw kesicisi kurulamadı", 
                           L"Renderer Kurulum Hatası");
}
    

这是屏幕截图:

在此处输入图像描述

白色区域的大小是客户区到屏幕左上角的距离。

在设置剪辑器并将其移回原始位置之前将窗口移动到屏幕的左上角并没有帮助。

提前致谢。

4

1 回答 1

0

出于好奇,我用 hack 解决了这个问题。

在设置裁剪器之前,将窗口移动到窗口的客户区将位于屏幕的 0,0 的位置。您可以使用ClientToScreen函数来确定客户区将在屏幕 0,0 上的窗口位置。

设置 DirectDraw 后将窗口移回其原始位置但存在问题,如果在设置 DirectDraw 后立即移动窗口问题仍然存在。(我相信限幅器设置功能异步工作)。为了解决这个问题,您可以设置一个 windows计时器,在设置 DirectDraw 后立即设置一个计时器(在我的情况下完成工作 1 秒)并在计时器更新时将窗口移回其原始位置。

总结过程:

  • 将窗口移动到一个新位置,该位置窗口的客户区将位于屏幕的 0,0 上。
  • 设置剪辑器
  • 设置一个计时器(在我的情况下工作 1 秒)
  • 当计时器更新时,将窗口移回原来的位置。

但是,如果有人知道正确的解决方案,那就太好了。

于 2020-11-19T19:25:23.857 回答