*** empty log message ***

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3788 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Webster
1999-10-02 01:44:39 +00:00
parent def6fb9bd8
commit ce44c50e9b
10 changed files with 200 additions and 32 deletions

View File

@@ -81,7 +81,9 @@ public:
wxPalette m_bitmapPalette; wxPalette m_bitmapPalette;
int m_quality; int m_quality;
/* WXHBITMAP m_hBitmap; TODO: platform-specific handle */ WXHBITMAP m_hBitmap;
wxDC * m_selectedInto; // So bitmap knows whether it's been selected into
wxMask * m_bitmapMask; // Optional mask wxMask * m_bitmapMask; // Optional mask
}; };
@@ -184,14 +186,13 @@ public:
protected: protected:
static wxList sm_handlers; static wxList sm_handlers;
/*
// TODO: Implementation // TODO: Implementation
public: public:
void SetHBITMAP(WXHBITMAP bmp); void SetHBITMAP(WXHBITMAP bmp);
inline WXHBITMAP GetHBITMAP() const { return (M_BITMAPDATA ? M_BITMAPDATA->m_hBitmap : 0); } inline WXHBITMAP GetHBITMAP() const { return (M_BITMAPDATA ? M_BITMAPDATA->m_hBitmap : 0); }
bool FreeResource(bool force = FALSE); inline void SetSelectedInto(wxDC *dc) { if (M_BITMAPDATA) M_BITMAPDATA->m_selectedInto = dc; }
*/ inline wxDC *GetSelectedInto(void) const { return (M_BITMAPDATA ? M_BITMAPDATA->m_selectedInto : (wxDC*) NULL); }
// bool FreeResource(bool force = FALSE);
}; };
#endif #endif
// _WX_BITMAP_H_ // _WX_BITMAP_H_

View File

@@ -155,6 +155,20 @@ class WXDLLEXPORT wxDC: public wxDCBase
virtual void SetInternalDeviceOrigin( long x, long y ); virtual void SetInternalDeviceOrigin( long x, long y );
virtual void GetInternalDeviceOrigin( long *x, long *y ); virtual void GetInternalDeviceOrigin( long *x, long *y );
virtual void SetRop(WXHDC cdc);
virtual void DoClipping(WXHDC cdc);
virtual void SelectOldObjects(WXHDC dc);
wxWindow *GetWindow() const { return m_canvas; }
void SetWindow(wxWindow *win) { m_canvas = win; }
WXHDC GetHDC() const { return m_hDC; }
void SetHDC(WXHDC dc, bool bOwnsDC = FALSE)
{
m_hDC = dc;
m_bOwnsDC = bOwnsDC;
}
private: private:
#if WXWIN_COMPATIBILITY #if WXWIN_COMPATIBILITY
@@ -177,13 +191,14 @@ protected:
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// Owner canvas and selected in bitmap (if bitmap is GDI object selected) // Owner canvas and selected in bitmap (if bitmap is GDI object selected)
wxWindow* m_owner; wxWindow* m_canvas;
wxBitmap* m_bitmap; wxBitmap m_selectedBitmap;
// our HDC and its usage count: we only free it when the usage count drops // our HDC and its usage count: we only free it when the usage count drops
// to 0 // to 0
WXHDC m_hDC; WXHDC m_hDC;
int m_hDCCount; int m_hDCCount;
bool m_bOwnsDC:1;
// Store all old GDI objects when do a SelectObject, so we can select them // Store all old GDI objects when do a SelectObject, so we can select them
// back in (this unselecting user's objects) so we can safely delete the // back in (this unselecting user's objects) so we can safely delete the

View File

@@ -47,6 +47,12 @@ public:
wxWindowDC(wxWindow *win); wxWindowDC(wxWindow *win);
virtual ~wxWindowDC(); virtual ~wxWindowDC();
// PM specific stuff
HPS m_hPS;
private:
HAB m_hab;
SIZEL m_PageSize;
}; };
class WXDLLEXPORT wxClientDC : public wxWindowDC class WXDLLEXPORT wxClientDC : public wxWindowDC

View File

@@ -25,6 +25,7 @@ class WXDLLEXPORT wxMemoryDC: public wxPaintDC
public: public:
wxMemoryDC(void); wxMemoryDC(void);
wxMemoryDC( wxDC *dc ); // Create compatible DC wxMemoryDC( wxDC *dc ); // Create compatible DC
~wxMemoryDC(void); ~wxMemoryDC(void);
virtual void SelectObject( const wxBitmap& bitmap ); virtual void SelectObject( const wxBitmap& bitmap );
void GetSize( int *width, int *height ) const; void GetSize( int *width, int *height ) const;

View File

@@ -16,19 +16,40 @@
#pragma interface "dcprint.h" #pragma interface "dcprint.h"
#endif #endif
#if wxUSE_PRINTING_ARCHITECTURE
#include "wx/dc.h" #include "wx/dc.h"
#include "wx/cmndata.h"
class WXDLLEXPORT wxPrinterDC: public wxDC class WXDLLEXPORT wxPrinterDC: public wxDC
{ {
public: public:
DECLARE_CLASS(wxPrinterDC) DECLARE_CLASS(wxPrinterDC)
// Create a printer DC // Create a printer DC [obsolete]
wxPrinterDC(const wxString& driver, const wxString& device, const wxString& output, bool interactive = TRUE, int orientation = wxPORTRAIT); wxPrinterDC(const wxString& driver, const wxString& device, const wxString& output, bool interactive = TRUE, int orientation = wxPORTRAIT);
// Create from print data
wxPrinterDC(const wxPrintData& data);
wxPrinterDC(WXHDC theDC);
~wxPrinterDC(); ~wxPrinterDC();
bool StartDoc(const wxString& message);
void EndDoc(void);
void StartPage(void);
void EndPage(void);
protected:
wxPrintData m_printData;
}; };
// Gets an HDC for the specified printer configuration
WXHDC WXDLLEXPORT wxGetPrinterDC(const wxPrintData& data);
#endif // wxUSE_PRINTING_ARCHITECTURE
#endif #endif
// _WX_DCPRINT_H_ // _WX_DCPRINT_H_

View File

@@ -428,3 +428,12 @@ void wxBitmap::InitStandardHandlers()
AddHandler(new wxICOFileHandler); AddHandler(new wxICOFileHandler);
*/ */
} }
void wxBitmap::SetHBITMAP(WXHBITMAP bmp)
{
if (!M_BITMAPDATA)
m_refData = new wxBitmapRefData;
M_BITMAPDATA->m_hBitmap = bmp;
}

View File

@@ -108,14 +108,15 @@ long wxDCBase::LogicalToDeviceYRel(long y) const
wxDC::wxDC(void) wxDC::wxDC(void)
{ {
m_owner = NULL; m_canvas = NULL;
m_bitmap = NULL;
m_oldBitmap = 0; m_oldBitmap = 0;
m_oldPen = 0; m_oldPen = 0;
m_oldBrush = 0; m_oldBrush = 0;
m_oldFont = 0; m_oldFont = 0;
m_oldPalette = 0; m_oldPalette = 0;
m_bOwnsDC = FALSE;
m_hDC = 0; m_hDC = 0;
m_hDCCount = 0; m_hDCCount = 0;
}; };
@@ -393,6 +394,94 @@ void wxDC::DoDrawSpline(wxList *points)
} }
#endif #endif
void wxDC::SetRop(WXHDC dc)
{
if (!dc || m_logicalFunction < 0)
return;
int c_rop;
// These may be wrong
switch (m_logicalFunction)
{
// TODO: Figure this stuff out
// case wxXOR: c_rop = R2_XORPEN; break;
// case wxXOR: c_rop = R2_NOTXORPEN; break;
// case wxINVERT: c_rop = R2_NOT; break;
// case wxOR_REVERSE: c_rop = R2_MERGEPENNOT; break;
// case wxAND_REVERSE: c_rop = R2_MASKPENNOT; break;
// case wxCLEAR: c_rop = R2_WHITE; break;
// case wxSET: c_rop = R2_BLACK; break;
// case wxSRC_INVERT: c_rop = R2_NOTCOPYPEN; break;
// case wxOR_INVERT: c_rop = R2_MERGENOTPEN; break;
// case wxAND: c_rop = R2_MASKPEN; break;
// case wxOR: c_rop = R2_MERGEPEN; break;
// case wxAND_INVERT: c_rop = R2_MASKNOTPEN; break;
// case wxEQUIV:
// case wxNAND:
// case wxCOPY:
default:
// c_rop = R2_COPYPEN;
break;
}
// SetROP2((HDC) dc, c_rop);
}
void wxDC::DoClipping(WXHDC dc)
{
if (m_clipping && dc)
{
// TODO:
// IntersectClipRect((HDC) dc, XLOG2DEV(m_clipX1), YLOG2DEV(m_clipY1),
// XLOG2DEV(m_clipX2), YLOG2DEV(m_clipY2));
}
}
// This will select current objects out of the DC,
// which is what you have to do before deleting the
// DC.
void wxDC::SelectOldObjects(WXHDC dc)
{
if (dc)
{
if (m_oldBitmap)
{
// ::SelectObject((HDC) dc, (HBITMAP) m_oldBitmap);
if (m_selectedBitmap.Ok())
{
m_selectedBitmap.SetSelectedInto(NULL);
}
}
m_oldBitmap = 0;
if (m_oldPen)
{
// ::SelectObject((HDC) dc, (HPEN) m_oldPen);
}
m_oldPen = 0;
if (m_oldBrush)
{
// ::SelectObject((HDC) dc, (HBRUSH) m_oldBrush);
}
m_oldBrush = 0;
if (m_oldFont)
{
// ::SelectObject((HDC) dc, (HFONT) m_oldFont);
}
m_oldFont = 0;
if (m_oldPalette)
{
// ::SelectPalette((HDC) dc, (HPALETTE) m_oldPalette, TRUE);
}
m_oldPalette = 0;
}
m_brush = wxNullBrush;
m_pen = wxNullPen;
m_palette = wxNullPalette;
m_font = wxNullFont;
m_backgroundBrush = wxNullBrush;
m_selectedBitmap = wxNullBitmap;
}
// //
// Private functions // Private functions
// //

View File

@@ -32,7 +32,7 @@
#include "wx/log.h" #include "wx/log.h"
#include "wx/window.h" #include "wx/window.h"
#include "wx/msw/private.h" #include "wx/os2/private.h"
#include "wx/dcclient.h" #include "wx/dcclient.h"
@@ -72,7 +72,7 @@ WX_DEFINE_OBJARRAY(wxArrayDCInfo);
// global variables // global variables
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
static PAINTSTRUCT g_paintStruct; static RECT g_paintStruct;
#ifdef __WXDEBUG__ #ifdef __WXDEBUG__
// a global variable which we check to verify that wxPaintDC are only // a global variable which we check to verify that wxPaintDC are only
@@ -100,7 +100,19 @@ wxWindowDC::wxWindowDC(wxWindow *the_canvas)
m_canvas = the_canvas; m_canvas = the_canvas;
m_hDC = (WXHDC) ::WinOpenWindowDC(GetWinHwnd(the_canvas) ); m_hDC = (WXHDC) ::WinOpenWindowDC(GetWinHwnd(the_canvas) );
m_hDCCount++; 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)); SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID));
} }
@@ -113,8 +125,12 @@ wxWindowDC::~wxWindowDC()
// //
// In PM one does not explicitly close or release an open WindowDC // In PM one does not explicitly close or release an open WindowDC
// They automatically close with the window, unless explicitly detached // 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_hDCCount--;
@@ -132,13 +148,15 @@ wxClientDC::wxClientDC()
wxClientDC::wxClientDC(wxWindow *the_canvas) wxClientDC::wxClientDC(wxWindow *the_canvas)
{ {
m_canvas = the_canvas; m_canvas = the_canvas;
m_hDC = (WXHDC) ::GetDC(GetWinHwnd(the_canvas));
// the background mode is only used for text background //
// and is set in DrawText() to OPAQUE as required, other- // default under PM is that Window and Client DC's are the same
// wise always TRANSPARENT, RR //
::SetBkMode( GetHdc(), TRANSPARENT ); m_hDC = (WXHDC) ::WinOpenWindowDC(GetWinHwnd(the_canvas));
//
// Default mode is BM_LEAVEALONE so we make no call Set the mix
//
SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID)); SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID));
} }
@@ -148,7 +166,9 @@ wxClientDC::~wxClientDC()
{ {
SelectOldObjects(m_hDC); 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; m_hDC = 0;
} }
} }
@@ -205,15 +225,9 @@ wxPaintDC::wxPaintDC(wxWindow *canvas)
} }
else // not in cache, create a new one else // not in cache, create a new one
{ {
m_hDC = (WXHDC)::BeginPaint(GetWinHwnd(m_canvas), &g_paintStruct); m_hDC = (WXHDC)::WinBeginPaint(GetWinHwnd(m_canvas), NULLHANDLE, &g_paintStruct);
ms_cache.Add(new wxPaintDCInfo(m_canvas, this)); ms_cache.Add(new wxPaintDCInfo(m_canvas, 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_canvas->GetBackgroundColour(), wxSOLID));
} }
@@ -230,7 +244,7 @@ wxPaintDC::~wxPaintDC()
if ( !--info->count ) if ( !--info->count )
{ {
::EndPaint(GetWinHwnd(m_canvas), &g_paintStruct); ::WinEndPaint(m_hPS);
ms_cache.Remove(index); ms_cache.Remove(index);
} }

View File

@@ -201,7 +201,7 @@ wxStatusBar *wxFrame::OnCreateStatusBar(int number, long style, wxWindowID id,
dc.SetFont(statusBar->GetFont()); dc.SetFont(statusBar->GetFont());
long x, y; long x, y;
dc.GetTextExtent("X", &x, &y, NULL, NULL, NULL, FALSE); dc.GetTextExtent("X", &x, &y, NULL, NULL, NULL);
int height = (int)( (y * 1.1) + 2* statusBar->GetBorderY()); int height = (int)( (y * 1.1) + 2* statusBar->GetBorderY());

View File

@@ -300,6 +300,10 @@ OS2OBJS = \
..\os2\$D\cursor.obj \ ..\os2\$D\cursor.obj \
..\os2\$D\data.obj \ ..\os2\$D\data.obj \
..\os2\$D\dc.obj \ ..\os2\$D\dc.obj \
..\os2\$D\dcclient.obj \
..\os2\$D\dcmemory.obj \
..\os2\$D\dcprint.obj \
..\os2\$D\dcscreen.obj \
..\os2\$D\dialog.obj \ ..\os2\$D\dialog.obj \
..\os2\$D\frame.obj \ ..\os2\$D\frame.obj \
..\os2\$D\window.obj ..\os2\$D\window.obj
@@ -322,6 +326,10 @@ OS2LIBOBJS = \
cursor.obj \ cursor.obj \
data.obj \ data.obj \
dc.obj \ dc.obj \
dcclient.obj \
dcmemory.obj \
dcprint.obj \
dcscreen.obj \
dialog.obj \ dialog.obj \
frame.obj \ frame.obj \
window.obj window.obj
@@ -488,6 +496,10 @@ $(OS2LIBOBJS):
copy ..\os2\$D\cursor.obj copy ..\os2\$D\cursor.obj
copy ..\os2\$D\data.obj copy ..\os2\$D\data.obj
copy ..\os2\$D\dc.obj copy ..\os2\$D\dc.obj
copy ..\os2\$D\dcclient.obj
copy ..\os2\$D\dcmemory.obj
copy ..\os2\$D\dcprint.obj
copy ..\os2\$D\dcscreen.obj
copy ..\os2\$D\dialog.obj copy ..\os2\$D\dialog.obj
copy ..\os2\$D\frame.obj copy ..\os2\$D\frame.obj
copy ..\os2\$D\window.obj copy ..\os2\$D\window.obj