如果窗口跨越多个显示器,我无法绘制它。

4
如果我在多显示器系统上有一个跨越两个显示器的窗口,我似乎无法擦除(涂黑)整个窗口。相反,只有主窗口会被涂成黑色,次要窗口仍然保持原来的白色。有人遇到过这种情况吗?
wxWidgets:
wxClientDC dc(this); 
Erase(dc); 

void SpriteWindowFrame::Erase(wxDC& dc) 
{ 
    dc.SetBackground(*wxBLACK_BRUSH); 
    dc.SetBrush(*wxBLACK_BRUSH); 
    dc.Clear(); 
   //wxLogDebug("Erase called. Rect is %i, %i w:%i, h:%i", GetPosition().x, GetPosition().y, GetSize().GetWidth(), GetSize().GetHeight()); 
 } 

在dc.Clear()函数内部,有以下代码:
void wxDC::Clear() 
{ 
WXMICROWIN_CHECK_HDC 

RECT rect; 
if ( m_canvas ) 
{ 
    GetClientRect((HWND) m_canvas->GetHWND(), &rect); 
} 
else 
{ 
    // No, I think we should simply ignore this if printing on e.g. 
    // a printer DC. 
    // wxCHECK_RET( m_selectedBitmap.Ok(), wxT("this DC can't be cleared") ); 
    if (!m_selectedBitmap.Ok()) 
        return; 

    rect.left = -m_deviceOriginX; rect.top = -m_deviceOriginY; 
    rect.right = m_selectedBitmap.GetWidth()-m_deviceOriginX; 
    rect.bottom = m_selectedBitmap.GetHeight()-m_deviceOriginY; 
} 

#ifndef __WXWINCE__ 
(void) ::SetMapMode(GetHdc(), MM_TEXT); 
#endif 

DWORD colour = ::GetBkColor(GetHdc()); 
HBRUSH brush = ::CreateSolidBrush(colour); 
::FillRect(GetHdc(), &rect, brush); 
::DeleteObject(brush); 

#ifndef __WXWINCE__ 
int width = DeviceToLogicalXRel(VIEWPORT_EXTENT)*m_signX, 
    height = DeviceToLogicalYRel(VIEWPORT_EXTENT)*m_signY; 

::SetMapMode(GetHdc(), MM_ANISOTROPIC); 

::SetViewportExtEx(GetHdc(), VIEWPORT_EXTENT, VIEWPORT_EXTENT, NULL); 
::SetWindowExtEx(GetHdc(), width, height, NULL); 
::SetViewportOrgEx(GetHdc(), (int)m_deviceOriginX, (int)m_deviceOriginY, NULL); 
::SetWindowOrgEx(GetHdc(), (int)m_logicalOriginX, (int)m_logicalOriginY, NULL); 
#endif 

使用调试器,我检查了GetClientRect返回的内容,它确实返回了一个位置为0、宽度/高度为两个显示器组合的矩形,所以是正确的。可能fillrect函数无法绘制到两个显示器上?

2个回答

2
你能追踪到wxClientDC的构造函数吗?
wxClientDC dc(this);

很多事情取决于wx给你的DC类型。检索窗口DC的Windows API是hdc = GetDC(hwnd),在多监视器系统上,它检索到一个“镜像驱动程序”DC的句柄,旨在反映监视器跨越的所有底层显示设备DC的调用。我能想到的唯一可能的原因是wx以某种方式检索到显示DC而不是窗口DC。

-1

我相信Chris是正确的,"重叠窗口"情况应该已经被处理了。但是在哪里呢?

使用windows GDI和你提到的"显示上下文"进行渲染非常原始且容易出现各种问题。GDI是迄今为止最差的接口之一,即使对于微软来说也很糟糕。由于大多数"窗口"程序可以在多个监视器上正常工作,想象一下如何在"窗口"中对事物进行动画处理以及这个"窗口"如何到达"显示器",最好让它保持神秘。

也许DC本质上不支持多监视器。寻找任何允许将多个DC统一处理的内容。将图形渲染到纸张网格上就像一个平铺式的"打印机DC"。视频墙将成为一个平铺式的"显示DC",如果一个窗口跨越两个窗口,则您可以使用2个监视器hack,即"multimon dc"回显到"拥有"的显示器和"另一个"。

如果您想在Windows上进行"真正的"动画制作,那么您需要转向DirectX。学习起来也很多,但更加强大:场景图,纹理,视频,alpha通道等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接