X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fb46a9a6c6f291806a5fecbb848930c344e17e11..10992a81d39da31b79063387b7b71c0ff68737ce:/src/os2/dcclient.cpp?ds=sidebyside diff --git a/src/os2/dcclient.cpp b/src/os2/dcclient.cpp index ee5ad82aef..af77090fd1 100644 --- a/src/os2/dcclient.cpp +++ b/src/os2/dcclient.cpp @@ -54,11 +54,9 @@ WX_DEFINE_OBJARRAY(wxArrayDCInfo); // macros // ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC) IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC) IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxWindowDC) -#endif // ---------------------------------------------------------------------------- // global variables @@ -84,14 +82,14 @@ static RECT g_paintStruct; wxWindowDC::wxWindowDC() { - m_canvas = NULL; + m_pCanvas = NULL; } wxWindowDC::wxWindowDC(wxWindow *the_canvas) { - m_canvas = the_canvas; + m_pCanvas = the_canvas; m_hDC = (WXHDC) ::WinOpenWindowDC(GetWinHwnd(the_canvas) ); - m_hDCCount++; + m_nDCCount++; // // default under PM is that Window and Client DC's are the same // so we offer a separate Presentation Space to use for the @@ -105,12 +103,12 @@ wxWindowDC::wxWindowDC(wxWindow *the_canvas) ); ::GpiAssociate(m_hPS, NULLHANDLE); ::GpiAssociate(m_hPS, m_hDC); - SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID)); + SetBackground(wxBrush(m_pCanvas->GetBackgroundColour(), wxSOLID)); } wxWindowDC::~wxWindowDC() { - if (m_canvas && m_hDC) + if (m_pCanvas && m_hDC) { SelectOldObjects(m_hDC); @@ -119,13 +117,16 @@ wxWindowDC::~wxWindowDC() // They automatically close with the window, unless explicitly detached // but we need to destroy our PS // - ::GpiAssociate(m_hPS, NULLHANDLE); - ::GpiDestroyPS(m_hPS); + if(m_hPS) + { + ::GpiAssociate(m_hPS, NULLHANDLE); + ::GpiDestroyPS(m_hPS); + } m_hPS = NULLHANDLE; m_hDC = NULLHANDLE; } - m_hDCCount--; + m_nDCCount--; } // ---------------------------------------------------------------------------- @@ -134,27 +135,37 @@ wxWindowDC::~wxWindowDC() wxClientDC::wxClientDC() { - m_canvas = NULL; + m_pCanvas = NULL; } wxClientDC::wxClientDC(wxWindow *the_canvas) { - m_canvas = the_canvas; + SIZEL vSizl = { 0,0}; - // - // default under PM is that Window and Client DC's are the same - // - m_hDC = (WXHDC) ::WinOpenWindowDC(GetWinHwnd(the_canvas)); + m_pCanvas = the_canvas; - // - // Default mode is BM_LEAVEALONE so we make no call Set the mix - // - SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID)); + // + // default under PM is that Window and Client DC's are the same + // + m_hDC = (WXHDC) ::WinOpenWindowDC(GetWinHwnd(the_canvas)); + m_hPS = ::GpiCreatePS( wxGetInstance() + ,m_hDC + ,&vSizl + ,PU_PELS | GPIF_LONG | GPIA_ASSOC + ); + + // + // Default mode is BM_LEAVEALONE so we make no call Set the mix + // + SetBackground(wxBrush( m_pCanvas->GetBackgroundColour() + ,wxSOLID + ) + ); } wxClientDC::~wxClientDC() { - if ( m_canvas && GetHdc() ) + if ( m_pCanvas && GetHdc() ) { SelectOldObjects(m_hDC); @@ -189,38 +200,55 @@ wxArrayDCInfo wxPaintDC::ms_cache; wxPaintDC::wxPaintDC() { - m_canvas = NULL; + m_pCanvas = NULL; m_hDC = 0; } -wxPaintDC::wxPaintDC(wxWindow *canvas) +wxPaintDC::wxPaintDC( + wxWindow* pCanvas +) { - wxCHECK_RET( canvas, wxT("NULL canvas in wxPaintDC ctor") ); + wxCHECK_RET(pCanvas, wxT("NULL canvas in wxPaintDC ctor")); #ifdef __WXDEBUG__ - if ( g_isPainting <= 0 ) + if (g_isPainting <= 0) { wxFAIL_MSG( wxT("wxPaintDC may be created only in EVT_PAINT handler!") ); - return; } #endif // __WXDEBUG__ - m_canvas = canvas; + m_pCanvas = pCanvas; + + // + // Do we have a DC for this window in the cache? + // + wxPaintDCInfo* pInfo = FindInCache(); - // do we have a DC for this window in the cache? - wxPaintDCInfo *info = FindInCache(); - if ( info ) + if (pInfo) { - m_hDC = info->hdc; - info->count++; + m_hDC = pInfo->hdc; + pInfo->count++; } else // not in cache, create a new one { - m_hDC = (WXHDC)::WinBeginPaint(GetWinHwnd(m_canvas), NULLHANDLE, &g_paintStruct); - ms_cache.Add(new wxPaintDCInfo(m_canvas, this)); + HPS hPS; + + hPS = ::WinBeginPaint( GetWinHwnd(m_pCanvas) + ,NULLHANDLE + ,&g_paintStruct + ); + if(hPS) + { + m_hOldPS = m_hPS; + m_hPS = hPS; + } + m_bIsPaintTime = TRUE; + m_hDC = (WXHDC) -1; // to satisfy those anonizmous efforts + m_vRclPaint = g_paintStruct; + ms_cache.Add(new wxPaintDCInfo(m_pCanvas, this)); } - SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID)); + SetBackground(wxBrush(m_pCanvas->GetBackgroundColour(), wxSOLID)); } wxPaintDC::~wxPaintDC() @@ -237,7 +265,8 @@ wxPaintDC::~wxPaintDC() if ( !--info->count ) { ::WinEndPaint(m_hPS); - + m_hPS = m_hOldPS; + m_bIsPaintTime = FALSE; ms_cache.Remove(index); } //else: cached DC entry is still in use @@ -254,7 +283,7 @@ wxPaintDCInfo *wxPaintDC::FindInCache(size_t *index) const for ( size_t n = 0; n < nCache; n++ ) { info = &ms_cache[n]; - if ( info->hwnd == m_canvas->GetHWND() ) + if ( info->hwnd == m_pCanvas->GetHWND() ) { if ( index ) *index = n;