2010-01-08 25 views
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()函數,有這個代碼

的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,寬度/高度爲th的矩形e組合了兩臺顯示器,所以它是正確的。也許fillrect功能不能繪製到兩個顯示器上?

回答

2

你能跟蹤到wxClientDC的構造函數嗎?

wxClientDC dc(this); 

很多取決於什麼類型的DC WX給你。檢索窗口DC的Windows API是hdc = GetDC(hwnd),並且在多監視器系統上,它檢索到「鏡像驅動程序」DC的句柄,這意味着將調用反映到監視器跨越的所有底層顯示設備DC 。

我可以想到這種行爲的唯一可能的原因是wx以某種方式檢索顯示DC而不是窗口DC。

-1

我敢肯定克里斯是正確的,「重疊窗口」的情況下爲你處理。但是哪裏?

使用windows進行渲染GDI和諸如你提到的「顯示上下文」是非常原始的,並且容易出現各種各樣的問題。 GDI是有史以來最差的界面之一,即使對微軟來說也很差。由於大多數「窗口」程序在多臺顯示器上都可以正常工作,因此可以考慮在「窗口」中設置動畫效果 - 以及「窗口」如何通向「顯示器」最好留下一個謎。

也許DC基本上不具備多顯示器功能。尋找允許多個DC統一處理的任何東西。將圖形摺疊到紙張網格上就像平鋪的「打印機DC」。一個電視牆將是一個平鋪的「顯示DC」,如果一個窗口跨越兩個屏幕,你會對2個監視器的黑客感到滿意,即「多用戶直播」回聲爲「擁有」顯示和「另一個」。

如果您想在Windows上執行「真實」動畫,則需要移至DirectX。這也是一個很多學習,但更有能力:場景圖形,紋理,視頻,alpha通道,...

相關問題