【问题标题】:If window spans multiple monitors, I can't draw to it如果窗口跨越多个监视器,我无法绘制它
【发布时间】:2011-01-02 21:14:07
【问题描述】:

如果我有一个跨多显示器系统上的两个显示器的窗口,我似乎无法擦除(涂黑)整个窗口。相反,只有主窗口被绘制为黑色。次要保持原来的白色。有没有人见过这种行为?

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函数无法绘制到两个显示器?

【问题讨论】:

    标签: windows graphics winapi wxwidgets gdi


    【解决方案1】:

    你能追踪到 wxClientDC 的构造函数吗?

    wxClientDC dc(this);
    

    很大程度上取决于 wx 为您提供的 DC 类型。检索窗口 DC 的 Windows API 是 hdc = GetDC(hwnd),并且在多显示器系统上,它检索“镜像驱动程序”DC 的句柄,这意味着反映对显示器跨越的所有底层显示设备 DC 的调用.

    我能想到这种行为的唯一可能原因是 wx 以某种方式检索显示 DC 而不是窗口 DC。

    【讨论】:

      【解决方案2】:

      我确定 Chris 是正确的,“重叠窗口”案例已在某处为您处理。但是在哪里?

      使用 Windows GDI 和您提到的“显示上下文”进行渲染是非常原始的并且容易出现各种问题。 GDI 是有史以来最糟糕的接口之一,即使对微软来说也很糟糕。由于大多数“窗口”程序在多台显示器上都可以正常工作,因此请考虑在“窗口”中设置动画 - 以及“窗口”如何进入“显示器”最好留下一个谜。

      也许 DC 从根本上说不具备多显示器功能。寻找允许统一处理多个 DC 的任何东西。将图形渲染到纸张网格上就像平铺的“打印机 DC”。视频墙将是一个平铺的“显示 DC”,您会对 2 显示器 hack 感到满意,即“multimon dc”与“拥有”显示器和“另一个”相呼应,如果窗口跨越两者。

      如果您想在 Windows 上制作“真正的”动画,则需要迁移到 DirectX。它也有很多东西要学,但功能更强大:场景图、纹理、视频、Alpha 通道……

      【讨论】:

        猜你喜欢
        • 2013-06-11
        • 1970-01-01
        • 1970-01-01
        • 2011-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多