// 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"
struct WXDLLEXPORT wxPaintDCInfo
{
- wxPaintDCInfo(wxWindow *win, wxDC *dc)
+ wxPaintDCInfo( wxWindow* pWin
+ ,wxDC* pDC
+ )
{
- hwnd = win->GetHWND();
- hdc = dc->GetHDC();
- count = 1;
+ m_hWnd = pWin->GetHWND();
+ m_hDC = pDC->GetHDC();
+ m_nCount = 1;
}
- WXHWND hwnd; // window for this DC
- WXHDC hdc; // the DC handle
- size_t count; // usage count
-};
+ WXHWND m_hWnd; // window for this DC
+ WXHDC m_hDC; // the DC handle
+ size_t m_nCount; // usage count
+}; // end of wxPaintDCInfot
#include "wx/arrimpl.cpp"
// macros
// ----------------------------------------------------------------------------
-#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC)
IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC)
IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxWindowDC)
-#endif
// ----------------------------------------------------------------------------
// global variables
wxWindowDC::wxWindowDC()
{
- m_canvas = NULL;
-}
-
-wxWindowDC::wxWindowDC(wxWindow *the_canvas)
-{
- m_canvas = the_canvas;
- m_hDC = (WXHDC) ::WinOpenWindowDC(GetWinHwnd(the_canvas) );
- m_hDCCount++;
- //
- // 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_canvas->GetBackgroundColour(), wxSOLID));
+ m_pCanvas = NULL;
}
-wxWindowDC::~wxWindowDC()
+wxWindowDC::wxWindowDC(
+ wxWindow* pTheCanvas
+)
{
- if (m_canvas && m_hDC)
- {
- SelectOldObjects(m_hDC);
+ ERRORID vError;
+ wxString sError;
+ m_pCanvas = pTheCanvas;
+ m_hDC = (WXHDC) ::WinOpenWindowDC(GetWinHwnd(pTheCanvas) );
+ m_nDCCount++;
//
- // 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
+ // 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);
- ::GpiDestroyPS(m_hPS);
- m_hPS = NULLHANDLE;
- m_hDC = NULLHANDLE;
- }
+ ::GpiAssociate(m_hPS, m_hDC);
+ // Set the wxWindows color table
+ if (!::GpiCreateLogColorTable( m_hPS
+ ,0L
+ ,LCOLF_CONSECRGB
+ ,0L
+ ,(LONG)wxTheColourDatabase->m_nSize
+ ,(PLONG)wxTheColourDatabase->m_palTable
+ ))
+ {
+ vError = ::WinGetLastError(vHabmain);
+ sError = wxPMErrorToStr(vError);
+ wxLogError("Unable to set current color table. Error: %s\n", sError);
+ }
+ SetBackground(wxBrush(m_pCanvas->GetBackgroundColour(), wxSOLID));
+}
- m_hDCCount--;
+wxWindowDC::~wxWindowDC()
+{
+ 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
+ //
+ if(m_hPS)
+ {
+ ::GpiAssociate(m_hPS, NULLHANDLE);
+ ::GpiDestroyPS(m_hPS);
+ }
+ m_hPS = NULLHANDLE;
+ m_hDC = NULLHANDLE;
+ }
+ m_nDCCount--;
}
// ----------------------------------------------------------------------------
wxClientDC::wxClientDC()
{
- m_canvas = NULL;
+ m_pCanvas = NULL;
}
-wxClientDC::wxClientDC(wxWindow *the_canvas)
+wxClientDC::wxClientDC(
+ wxWindow* pTheCanvas
+)
{
- m_canvas = the_canvas;
+ SIZEL vSizl = { 0,0};
+ ERRORID vError;
+ wxString sError;
- //
- // default under PM is that Window and Client DC's are the same
- //
- m_hDC = (WXHDC) ::WinOpenWindowDC(GetWinHwnd(the_canvas));
+ m_pCanvas = pTheCanvas;
- //
- // 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(pTheCanvas));
+ m_hPS = ::GpiCreatePS( wxGetInstance()
+ ,m_hDC
+ ,&vSizl
+ ,PU_PELS | GPIF_LONG | GPIA_ASSOC
+ );
+
+ // Set the wxWindows color table
+ if (!::GpiCreateLogColorTable( m_hPS
+ ,0L
+ ,LCOLF_CONSECRGB
+ ,0L
+ ,(LONG)wxTheColourDatabase->m_nSize
+ ,(PLONG)wxTheColourDatabase->m_palTable
+ ))
+ {
+ vError = ::WinGetLastError(vHabmain);
+ sError = wxPMErrorToStr(vError);
+ wxLogError("Unable to set current color table. Error: %s\n", sError);
+ }
+ //
+ // Default mode is BM_LEAVEALONE so we make no call Set the mix
+ //
+ SetBackground(wxBrush( m_pCanvas->GetBackgroundColour()
+ ,wxSOLID
+ )
+ );
+} // end of wxClientDC::wxClientDC
wxClientDC::~wxClientDC()
{
- if ( m_canvas && GetHdc() )
- {
- SelectOldObjects(m_hDC);
-
- // We don't explicitly release Device contexts in PM and
- // the cached micro PS is already gone
+ if ( m_pCanvas && GetHdc() )
+ {
+ SelectOldObjects(m_hDC);
- m_hDC = 0;
- }
-}
+ //
+ // We don't explicitly release Device contexts in PM and
+ // the cached micro PS is already gone
+ //
+ m_hDC = 0;
+ }
+} // end of wxClientDC::~wxClientDC
// ----------------------------------------------------------------------------
// wxPaintDC
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"));
+ RECTL vRect;
#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 *info = FindInCache();
- if ( info )
+ //
+ // Do we have a DC for this window in the cache?
+ //
+ wxPaintDCInfo* pInfo = FindInCache();
+
+ if (pInfo)
{
- m_hDC = info->hdc;
- info->count++;
+ m_hDC = pInfo->m_hDC;
+ pInfo->m_nCount++;
}
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)
+ {
+ POINTL vPoint[2];
+ LONG lControl;
+ LONG lColor;
+
+ m_hOldPS = m_hPS;
+ m_hPS = hPS;
+ ::GpiCreateLogColorTable( m_hPS
+ ,0L
+ ,LCOLF_CONSECRGB
+ ,0L
+ ,(LONG)wxTheColourDatabase->m_nSize
+ ,(PLONG)wxTheColourDatabase->m_palTable
+ );
+ ::GpiCreateLogColorTable( m_hPS
+ ,0L
+ ,LCOLF_RGB
+ ,0L
+ ,0L
+ ,NULL
+ );
+
+ ::WinFillRect(hPS, &g_paintStruct, m_pCanvas->GetBackgroundColour().GetPixel());
+ ::WinQueryWindowRect( GetWinHwnd(m_pCanvas)
+ ,&m_vRclPaint
+ );
+ }
+
+ m_bIsPaintTime = TRUE;
+ m_hDC = (WXHDC) -1; // to satisfy those anonizmous efforts
+ ms_cache.Add(new wxPaintDCInfo(m_pCanvas, this));
}
- SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID));
+ SetBackground(wxBrush(m_pCanvas->GetBackgroundColour(), wxSOLID));
}
wxPaintDC::~wxPaintDC()
{
SelectOldObjects(m_hDC);
- size_t index;
- wxPaintDCInfo *info = FindInCache(&index);
+ size_t nIndex;
+ wxPaintDCInfo* pInfo = FindInCache(&nIndex);
- wxCHECK_RET( info, wxT("existing DC should have a cache entry") );
+ wxCHECK_RET( pInfo, wxT("existing DC should have a cache entry") );
- if ( !--info->count )
+ if ( !--pInfo->m_nCount )
{
::WinEndPaint(m_hPS);
-
- ms_cache.Remove(index);
+ m_hPS = m_hOldPS;
+ m_bIsPaintTime = FALSE;
+ ms_cache.Remove(nIndex);
}
//else: cached DC entry is still in use
}
}
-wxPaintDCInfo *wxPaintDC::FindInCache(size_t *index) const
+wxPaintDCInfo* wxPaintDC::FindInCache(
+ size_t* pIndex
+) const
{
- wxPaintDCInfo *info = NULL;
- size_t nCache = ms_cache.GetCount();
- for ( size_t n = 0; n < nCache; n++ )
+ wxPaintDCInfo* pInfo = NULL;
+ size_t nCache = ms_cache.GetCount();
+
+ for (size_t n = 0; n < nCache; n++)
{
- info = &ms_cache[n];
- if ( info->hwnd == m_canvas->GetHWND() )
+ pInfo = &ms_cache[n];
+ if (pInfo->m_hWnd == m_pCanvas->GetHWND())
{
- if ( index )
- *index = n;
+ if (pIndex)
+ *pIndex = n;
break;
}
}
+ return pInfo;
+} // end of wxPaintDC::FindInCache
- return info;
-}