X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bc5a847c1b4d89a9e26a3ac7b9e75f41b7530316..76e7cfab8fdb0c7862fd07e427af54181717fc62:/src/os2/dcclient.cpp?ds=sidebyside diff --git a/src/os2/dcclient.cpp b/src/os2/dcclient.cpp index b8d62a043b..c5f2201c66 100644 --- a/src/os2/dcclient.cpp +++ b/src/os2/dcclient.cpp @@ -1,10 +1,9 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: dcclient.cpp +// Name: src/os2/dcclient.cpp // Purpose: wxClientDC class // Author: David Webster // Modified by: // Created: 09/21/99 -// RCS-ID: $Id$ // Copyright: (c) David Webster // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -20,14 +19,17 @@ // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" -#include "wx/string.h" -#include "wx/log.h" -#include "wx/window.h" -#include "wx/app.h" +#include "wx/dcclient.h" +#include "wx/os2/dcclient.h" -#include "wx/os2/private.h" +#ifndef WX_PRECOMP + #include "wx/string.h" + #include "wx/log.h" + #include "wx/app.h" + #include "wx/window.h" +#endif -#include "wx/dcclient.h" +#include "wx/os2/private.h" // ---------------------------------------------------------------------------- // array/list types @@ -36,7 +38,7 @@ struct WXDLLEXPORT wxPaintDCInfo { wxPaintDCInfo( wxWindow* pWin - ,wxDC* pDC + ,wxPaintDCImpl* pDC ) { m_hWnd = pWin->GetHWND(); @@ -53,49 +55,47 @@ struct WXDLLEXPORT wxPaintDCInfo WX_DEFINE_OBJARRAY(wxArrayDCInfo); -// ---------------------------------------------------------------------------- -// macros -// ---------------------------------------------------------------------------- - - IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC) - IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC) - IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxWindowDC) - // ---------------------------------------------------------------------------- // global variables // ---------------------------------------------------------------------------- static RECT g_paintStruct; -#ifdef __WXDEBUG__ +#ifdef wxHAS_PAINT_DEBUG // a global variable which we check to verify that wxPaintDC are only // created in resopnse to WM_PAINT message - doing this from elsewhere is a - // common programming error among wxWindows programmers and might lead to + // common programming error among wxWidgets programmers and might lead to // very subtle and difficult to debug refresh/repaint bugs. int g_isPainting = 0; -#endif // __WXDEBUG__ +#endif // wxHAS_PAINT_DEBUG // =========================================================================== // implementation // =========================================================================== // ---------------------------------------------------------------------------- -// wxWindowDC +// wxWindowDCImpl // ---------------------------------------------------------------------------- -wxWindowDC::wxWindowDC() +IMPLEMENT_ABSTRACT_CLASS(wxWindowDCImpl, wxPMDCImpl) + +wxWindowDCImpl::wxWindowDCImpl( wxDC *owner ) : + wxPMDCImpl( owner ) { - m_pCanvas = NULL; + m_PageSize.cx = m_PageSize.cy = 0; } -wxWindowDC::wxWindowDC( - wxWindow* pTheCanvas -) +wxWindowDCImpl::wxWindowDCImpl( wxDC *owner, wxWindow* pTheCanvas) : + wxPMDCImpl( owner ) { ERRORID vError; wxString sError; + int nWidth, nHeight; m_pCanvas = pTheCanvas; + DoGetSize(&nWidth, &nHeight); + m_PageSize.cx = nWidth; + m_PageSize.cy = nHeight; m_hDC = (WXHDC) ::WinOpenWindowDC(GetWinHwnd(pTheCanvas) ); // @@ -109,11 +109,17 @@ wxWindowDC::wxWindowDC( ,&m_PageSize ,PU_PELS | GPIF_LONG | GPIA_ASSOC ); + if (!m_hPS) + { + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + wxLogError(wxT("Unable to create presentation space. Error: %s\n"), sError.c_str()); + } ::GpiAssociate(m_hPS, NULLHANDLE); ::GpiAssociate(m_hPS, m_hDC); // - // Set the wxWindows color table + // Set the wxWidgets color table // if (!::GpiCreateLogColorTable( m_hPS ,0L @@ -125,7 +131,7 @@ wxWindowDC::wxWindowDC( { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); - wxLogError("Unable to set current color table. Error: %s\n", sError); + wxLogError(wxT("Unable to set current color table (3). Error: %s\n"), sError.c_str()); } ::GpiCreateLogColorTable( m_hPS ,0L @@ -138,16 +144,11 @@ wxWindowDC::wxWindowDC( ,&m_vRclPaint ); InitDC(); -} // end of wxWindowDC::wxWindowDC +} // end of wxWindowDCImpl::wxWindowDCImpl -void wxWindowDC::InitDC() +void wxWindowDCImpl::InitDC() { - wxColour vColor; - vColor.InitFromName("BLACK"); - m_pen.SetColour(vColor); - vColor.Set("WHITE"); - m_brush.SetColour(vColor); // // The background mode is only used for text background and is set in // DrawText() to OPAQUE as required, otherwise always TRANSPARENT, @@ -158,31 +159,48 @@ void wxWindowDC::InitDC() // Default bg colour is pne of the window // SetBackground(wxBrush(m_pCanvas->GetBackgroundColour(), wxSOLID)); -} // end of wxWindowDC::InitDC -void wxWindowDC::DoGetSize( + m_pen.SetColour(*wxBLACK); + m_brush.SetColour(*wxWHITE); + // since we are a window dc we need to grab the palette from the window +#if wxUSE_PALETTE + InitializePalette(); +#endif + wxFont* pFont = new wxFont( 10, wxMODERN, wxNORMAL, wxBOLD ); + SetFont(*pFont); + delete pFont; + // + // OS/2 default vertical character alignment needs to match the other OS's + // + ::GpiSetTextAlignment((HPS)GetHPS(), TA_NORMAL_HORIZ, TA_BOTTOM); + +} // end of wxWindowDCImpl::InitDC + +void wxWindowDCImpl::DoGetSize( int* pnWidth , int* pnHeight ) const { - wxCHECK_RET( m_pCanvas, _T("wxWindowDC without a window?") ); + wxCHECK_RET( m_pCanvas, wxT("wxWindowDC without a window?") ); m_pCanvas->GetSize( pnWidth ,pnHeight ); -} // end of wxWindowDC::DoGetSize +} // end of wxWindowDCImpl::DoGetSize // ---------------------------------------------------------------------------- // wxClientDC // ---------------------------------------------------------------------------- -wxClientDC::wxClientDC() +IMPLEMENT_ABSTRACT_CLASS(wxClientDCImpl, wxWindowDCImpl) + +wxClientDCImpl::wxClientDCImpl( wxDC *owner ) : + wxWindowDCImpl( owner ) { m_pCanvas = NULL; } -wxClientDC::wxClientDC( - wxWindow* pTheCanvas -) +wxClientDCImpl::wxClientDCImpl( wxDC *owner, wxWindow *pTheCanvas) : + wxWindowDCImpl( owner ) { SIZEL vSizl = { 0,0}; ERRORID vError; @@ -193,14 +211,20 @@ wxClientDC::wxClientDC( // // default under PM is that Window and Client DC's are the same // + m_hDC = (WXHDC) ::WinOpenWindowDC(GetWinHwnd(pTheCanvas)); + printf("Got WindowDC %X for window handle %X\n", m_hDC, pTheCanvas); + m_hPS = ::GpiCreatePS( wxGetInstance() ,m_hDC ,&vSizl ,PU_PELS | GPIF_LONG | GPIA_ASSOC ); + ::GpiAssociate(m_hPS, NULLHANDLE); + ::GpiAssociate(m_hPS, m_hDC); - // Set the wxWindows color table + printf("Got m_hPS %X\n", m_hPS); + // Set the wxWidgets color table if (!::GpiCreateLogColorTable( m_hPS ,0L ,LCOLF_CONSECRGB @@ -211,7 +235,7 @@ wxClientDC::wxClientDC( { vError = ::WinGetLastError(vHabmain); sError = wxPMErrorToStr(vError); - wxLogError("Unable to set current color table. Error: %s\n", sError); + wxLogError(wxT("Unable to set current color table (4). Error: %s\n"), sError.c_str()); } ::GpiCreateLogColorTable( m_hPS ,0L @@ -227,11 +251,11 @@ wxClientDC::wxClientDC( ,&m_vRclPaint ); InitDC(); -} // end of wxClientDC::wxClientDC +} // end of wxClientDCImpl::wxClientDCImpl -void wxClientDC::InitDC() +void wxClientDCImpl::InitDC() { - wxWindowDC::InitDC(); + wxWindowDCImpl::InitDC(); // in wxUniv build we must manually do some DC adjustments usually // performed by Windows for us @@ -246,48 +270,50 @@ void wxClientDC::InitDC() // clip the DC to avoid overwriting the non client area SetClippingRegion(wxPoint(0, 0), m_pCanvas->GetClientSize()); #endif // __WXUNIVERSAL__ -} // end of wxClientDC::InitDC +} // end of wxClientDCImpl::InitDC -wxClientDC::~wxClientDC() +wxClientDCImpl::~wxClientDCImpl() { -} // end of wxClientDC::~wxClientDC +} // end of wxClientDCImpl::~wxClientDCImpl -void wxClientDC::DoGetSize( +void wxClientDCImpl::DoGetSize( int* pnWidth , int* pnHeight ) const { - wxCHECK_RET( m_pCanvas, _T("wxWindowDC without a window?") ); + wxCHECK_RET( m_pCanvas, wxT("wxWindowDC without a window?") ); m_pCanvas->GetClientSize( pnWidth ,pnHeight ); -} // end of wxClientDC::DoGetSize +} // end of wxClientDCImpl::DoGetSize // ---------------------------------------------------------------------------- // wxPaintDC // ---------------------------------------------------------------------------- -wxArrayDCInfo wxPaintDC::ms_cache; +IMPLEMENT_ABSTRACT_CLASS(wxPaintDCImpl, wxWindowDCImpl) -wxPaintDC::wxPaintDC() +wxArrayDCInfo wxPaintDCImpl::ms_cache; + +wxPaintDCImpl::wxPaintDCImpl( wxDC *owner ) : + wxClientDCImpl( owner ) { m_pCanvas = NULL; m_hDC = 0; } -wxPaintDC::wxPaintDC( - wxWindow* pCanvas -) +wxPaintDCImpl::wxPaintDCImpl( wxDC *owner, wxWindow *pCanvas) : + wxClientDCImpl( owner ) { wxCHECK_RET(pCanvas, wxT("NULL canvas in wxPaintDC ctor")); -#ifdef __WXDEBUG__ +#ifdef wxHAS_PAINT_DEBUG if (g_isPainting <= 0) { wxFAIL_MSG( wxT("wxPaintDC may be created only in EVT_PAINT handler!") ); return; } -#endif // __WXDEBUG__ +#endif // wxHAS_PAINT_DEBUG m_pCanvas = pCanvas; @@ -305,12 +331,14 @@ wxPaintDC::wxPaintDC( { HPS hPS; + m_hDC = ::WinOpenWindowDC(GetWinHwnd(m_pCanvas)); hPS = ::WinBeginPaint( GetWinHwnd(m_pCanvas) ,NULLHANDLE ,&g_paintStruct ); if(hPS) { + ::GpiAssociate(hPS, m_hDC); m_hOldPS = m_hPS; m_hPS = hPS; ::GpiCreateLogColorTable( m_hPS @@ -334,14 +362,13 @@ wxPaintDC::wxPaintDC( ); } - m_bIsPaintTime = TRUE; - m_hDC = (WXHDC) -1; // to satisfy those anonizmous efforts + m_bIsPaintTime = true; ms_cache.Add(new wxPaintDCInfo(m_pCanvas, this)); } InitDC(); -} // end of wxPaintDC::wxPaintDC +} // end of wxPaintDCImpl::wxPaintDCImpl -wxPaintDC::~wxPaintDC() +wxPaintDCImpl::~wxPaintDCImpl() { if ( m_hDC ) { @@ -356,7 +383,7 @@ wxPaintDC::~wxPaintDC() { ::WinEndPaint(m_hPS); m_hPS = m_hOldPS; - m_bIsPaintTime = FALSE; + m_bIsPaintTime = false; ms_cache.RemoveAt(nIndex); } //else: cached DC entry is still in use @@ -366,7 +393,7 @@ wxPaintDC::~wxPaintDC() } } -wxPaintDCInfo* wxPaintDC::FindInCache( +wxPaintDCInfo* wxPaintDCImpl::FindInCache( size_t* pIndex ) const { @@ -384,10 +411,10 @@ wxPaintDCInfo* wxPaintDC::FindInCache( } } return pInfo; -} // end of wxPaintDC::FindInCache +} // end of wxPaintDCImpl::FindInCache // find the entry for this DC in the cache (keyed by the window) -WXHDC wxPaintDC::FindDCInCache( +WXHDC wxPaintDCImpl::FindDCInCache( wxWindow* pWin ) { @@ -403,5 +430,4 @@ WXHDC wxPaintDC::FindDCInCache( } } return 0; -} // end of wxPaintDC::FindInCache - +} // end of wxPaintDCImpl::FindInCache