如果我在多监视器系统上有一个跨越两个监视器的窗口,我似乎无法擦除(涂黑)整个窗口。相反,只有主窗口被绘制为黑色。次要保持原始的白色。有没有人见过这种行为?
的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()函数中,有这段代码
的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 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函数无法绘制到两个显示器?
答案 0 :(得分:2)
你可以追溯到wxClientDC的构造函数吗?
wxClientDC dc(this);
很大程度上取决于你所提供的DC wx的类型。用于检索窗口DC的Windows API是hdc = GetDC(hwnd),并且在多监视器系统上,它检索“镜像驱动程序”DC的句柄,这意味着反映对监视器跨越的所有底层显示设备DC的调用
我能想到这种行为的唯一可能原因是wx以某种方式检索显示DC而不是窗口DC。
答案 1 :(得分:-1)
我确信克里斯是正确的,“重叠窗口”案例会在某处处理。但在哪里?
使用Windows渲染GDI和“显示上下文”,例如你提到的非常原始,容易出现各种各样的问题。 GDI是有史以来最差的界面之一,即便对微软也是如此。由于大多数“窗口”程序在多个监视器上都能正常工作,所以想一想在“窗口”中制作动画 - 以及“窗口”如何进入“显示”最好留下一个谜。
也许DC从根本上说不具备多显示器功能。寻找允许统一处理多个DC的任何事物。将图形渲染到纸张网格上就像平铺的“打印机DC”。一个视频墙将是一个平铺的“显示DC”,你会很高兴有一个2显示器黑客,即“multimon dc”回声“拥有”显示和“另一个”如果一个窗口跨越两者。
如果您想在Windows上进行“真实”动画,则需要转到DirectX。这也是很多东西,但功能更强大:场景图,纹理,视频,alpha通道......