2010-01-08 3 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 인 rectange가 반환됩니다. 두 대의 모니터를 합친 것입니다. fillrect 함수가 두 개의 디스플레이에 그리기가 불가능할 수 있습니까?

답변

2

wxClientDC의 생성자를 추적 할 수 있습니까?

wxClientDC dc(this); 

많은 것들은 DC wx의 유형에 달려 있습니다. 창 DC를 검색하는 Windows API는 hdc = GetDC (hwnd)이며, 다중 모니터 시스템에서는 모니터가 포함하는 모든 기본 디스플레이 장치 DC에 대한 호출을 반영하는 '미러 드라이버'DC에 대한 핸들을 검색합니다 .

내가이 동작에 대해 생각할 수있는 유일한 이유는 wx가 어떻게 든 창 DC가 아닌 디스플레이 DC를 검색한다는 것입니다.

-1

저는 Chris가 정확하고, "겹치는 창"케이스가 당신을 위해 어딘가에서 처리된다고 확신합니다. 그러나 어디에서?

Windows에서 렌더링하기 GDI와 "디스플레이 컨텍스트"와 같은 렌더링은 매우 원시적이며 모든 종류의 문제가 발생하기 쉽습니다. GDI는 지금까지 보아온 가장 가난한 인터페이스 중 하나입니다. 대부분의 "창"프로그램은 여러 모니터에서 정상적으로 작동하므로 "창"에서 사물을 움직이는 방법을 생각해보십시오. "창"이 "디스플레이"로가는 길을 만드는 것이 가장 좋은 방법입니다.

아마도 DC는 기본적으로 다중 모니터를 지원하지 않습니다. 여러 DC를 균일하게 처리 할 수있는 것이 있는지 확인하십시오. 그래픽을 종이 시트 위에 놓으면 "프린터 DC"와 같은 모양이됩니다. 비디오 월은 바둑판 식으로 배열 된 "디스플레이 DC"이며 2 개의 모니터 해킹 즉, "멀티 몬콘 dc"가 "소유"디스플레이에 표시되고 창이 둘 다있을 경우 "다른 하나"로 표시됩니다.

Windows에서 "실제"애니메이션을 사용하려면 DirectX로 이동해야합니다. 그것은 배우기에는 너무 많지만 더 많은 기능이 있습니다 : 씬 그래프, 텍스처, 비디오, 알파 채널, ...

관련 문제