如果我有一个跨越多显示器系统上的两个显示器的窗口,我似乎无法抹掉(漆黑)整个窗口。 相反,只有主窗口被绘制成黑色。 二级保持原来的白色。 有没有人看过这种行为?
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, %iw:%i, h:%i", GetPosition().x, GetPosition().y, GetSize().GetWidth(), GetSize().GetHeight()); }
在dc.Clear()函数里面,有这个代码
wxWidgets的:
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 eg // 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
}
使用debugging器,我检查了什么GetClientRect返回,并确保它返回位置0和宽度/高度组合的两个监视器的正切,所以是正确的。 也许fillrightfunction不能绘制到两个显示器?
你可以追溯到wxClientDC的构造函数吗?
wxClientDC dc(this);
很多取决于什么类型的DC WX给你。 检索窗口DC的Windows API是hdc = GetDC(hwnd),并且在多监视器系统上,它检索“镜像驱动程序”DC的句柄,这意味着将调用反映到监视器跨越的所有底层显示设备DC 。
我能想到的唯一可能的原因是wx以某种方式检索显示DC而不是窗口DC。
我相信克里斯是正确的,“重叠的窗口”的情况下处理你的地方。 但是哪里?
使用Windows GDI进行渲染以及诸如你所提到的“显示上下文”是非常原始的,并且容易出现各种各样的问题。 GDI是有史以来最贫穷的界面之一,即使对于微软也是如此。 由于大多数“窗口”程序在多台显示器上都可以正常工作,所以想想在“窗口”中设置动画效果 – 以及“窗口”如何通向“显示器”最好还是留下一个谜。
也许DC从根本上不是多显示器的能力。 寻找允许多个DC统一处理的任何东西。 将图形折叠到纸张网格上将会像平铺的“打印机DC”一样。 一个电视墙将是一个平铺的“显示DC”,如果一个窗口跨越两个显示器,你将会对2个显示器的黑客感到满意,也就是说,“多用途直流电”将回应“拥有”显示,而“另一个”则回应。
如果你想在Windows上做“真实”的动画,你需要移动到DirectX。 这也是很多学习,但更有能力:场景图形,纹理,视频,alpha通道,…