X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/23e4b7d824cbde351b192ad6284089db9af6dd99..6ba636000f13b4bf7d3e7dcfad429713085f6700:/src/os2/dcclient.cpp?ds=sidebyside diff --git a/src/os2/dcclient.cpp b/src/os2/dcclient.cpp index 75ffabc6ff..cee1da7214 100644 --- a/src/os2/dcclient.cpp +++ b/src/os2/dcclient.cpp @@ -1,11 +1,11 @@ ///////////////////////////////////////////////////////////////////////////// // Name: dcclient.cpp // Purpose: wxClientDC class -// Author: Julian Smart +// Author: David Webster // Modified by: -// Created: 01/02/97 +// Created: 09/21/99 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem +// Copyright: (c) David Webster // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -17,22 +17,14 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "dcclient.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#ifdef __BORLANDC__ - #pragma hdrstop -#endif - #include "wx/string.h" #include "wx/log.h" #include "wx/window.h" -#include "wx/msw/private.h" +#include "wx/os2/private.h" #include "wx/dcclient.h" @@ -62,17 +54,15 @@ 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 // ---------------------------------------------------------------------------- -static PAINTSTRUCT g_paintStruct; +static RECT g_paintStruct; #ifdef __WXDEBUG__ // a global variable which we check to verify that wxPaintDC are only @@ -92,32 +82,48 @@ static PAINTSTRUCT 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++; - - SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID)); + 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 + // entire window. Otherwise, calling BeginPaint will just create + // chached-micro client presentation space + // + m_hPS = GpiCreatePS( m_hab + ,m_hDC + ,&m_PageSize + ,PU_PELS | GPIF_LONG | GPIA_ASSOC + ); + ::GpiAssociate(m_hPS, NULLHANDLE); + ::GpiAssociate(m_hPS, m_hDC); + SetBackground(wxBrush(m_pCanvas->GetBackgroundColour(), wxSOLID)); } wxWindowDC::~wxWindowDC() { - if (m_canvas && m_hDC) + if (m_pCanvas && m_hDC) { SelectOldObjects(m_hDC); // // In PM one does not explicitly close or release an open WindowDC // They automatically close with the window, unless explicitly detached + // but we need to destroy our PS // - m_hDC = 0; + ::GpiAssociate(m_hPS, NULLHANDLE); + ::GpiDestroyPS(m_hPS); + m_hPS = NULLHANDLE; + m_hDC = NULLHANDLE; } - m_hDCCount--; + m_nDCCount--; } // ---------------------------------------------------------------------------- @@ -126,29 +132,33 @@ wxWindowDC::~wxWindowDC() wxClientDC::wxClientDC() { - m_canvas = NULL; + m_pCanvas = NULL; } wxClientDC::wxClientDC(wxWindow *the_canvas) { - m_canvas = the_canvas; - m_hDC = (WXHDC) ::GetDC(GetWinHwnd(the_canvas)); + m_pCanvas = the_canvas; - // the background mode is only used for text background - // and is set in DrawText() to OPAQUE as required, other- - // wise always TRANSPARENT, RR - ::SetBkMode( GetHdc(), TRANSPARENT ); + // + // default under PM is that Window and Client DC's are the same + // + m_hDC = (WXHDC) ::WinOpenWindowDC(GetWinHwnd(the_canvas)); - SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID)); + // + // 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); - ::ReleaseDC(GetWinHwnd(m_canvas), GetHdc()); + // We don't explicitly release Device contexts in PM and + // the cached micro PS is already gone + m_hDC = 0; } } @@ -177,24 +187,24 @@ wxArrayDCInfo wxPaintDC::ms_cache; wxPaintDC::wxPaintDC() { - m_canvas = NULL; + m_pCanvas = NULL; m_hDC = 0; } wxPaintDC::wxPaintDC(wxWindow *canvas) { - wxCHECK_RET( canvas, _T("NULL canvas in wxPaintDC ctor") ); + wxCHECK_RET( canvas, wxT("NULL canvas in wxPaintDC ctor") ); #ifdef __WXDEBUG__ if ( g_isPainting <= 0 ) { - wxFAIL_MSG( _T("wxPaintDC may be created only in EVT_PAINT handler!") ); + wxFAIL_MSG( wxT("wxPaintDC may be created only in EVT_PAINT handler!") ); return; } #endif // __WXDEBUG__ - m_canvas = canvas; + m_pCanvas = canvas; // do we have a DC for this window in the cache? wxPaintDCInfo *info = FindInCache(); @@ -205,16 +215,10 @@ wxPaintDC::wxPaintDC(wxWindow *canvas) } else // not in cache, create a new one { - m_hDC = (WXHDC)::BeginPaint(GetWinHwnd(m_canvas), &g_paintStruct); - ms_cache.Add(new wxPaintDCInfo(m_canvas, this)); + m_hDC = (WXHDC)::WinBeginPaint(GetWinHwnd(m_pCanvas), NULLHANDLE, &g_paintStruct); + ms_cache.Add(new wxPaintDCInfo(m_pCanvas, this)); } - - // the background mode is only used for text background - // and is set in DrawText() to OPAQUE as required, other- - // wise always TRANSPARENT, RR - ::SetBkMode( GetHdc(), TRANSPARENT ); - - SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID)); + SetBackground(wxBrush(m_pCanvas->GetBackgroundColour(), wxSOLID)); } wxPaintDC::~wxPaintDC() @@ -226,11 +230,11 @@ wxPaintDC::~wxPaintDC() size_t index; wxPaintDCInfo *info = FindInCache(&index); - wxCHECK_RET( info, _T("existing DC should have a cache entry") ); + wxCHECK_RET( info, wxT("existing DC should have a cache entry") ); if ( !--info->count ) { - ::EndPaint(GetWinHwnd(m_canvas), &g_paintStruct); + ::WinEndPaint(m_hPS); ms_cache.Remove(index); } @@ -248,7 +252,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;