1. more drag and drop and clipboard changes:
a) OLE clipboard works fine b) wxBitmapDataObject now accepts DIBs (but doesn't give them back :-( ) c) bugs in sample corrected 2. wxFatalExit() replaced with wxFAIL_MSG() in bitmap.cpp and dcmemory.cpp 3. wxFrame::ClientToScreen and ScreenToClient() replaced with DoXXX() - like this, they don't hide the base class versions git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4039 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -6,136 +6,137 @@
|
||||
// Created: 01/02/97
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) Julian Smart and Markus Holzem
|
||||
// Licence: wxWindows licence
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// ============================================================================
|
||||
// declarations
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// headers
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation "dcmemory.h"
|
||||
#pragma implementation "dcmemory.h"
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/utils.h"
|
||||
#include "wx/utils.h"
|
||||
#endif
|
||||
|
||||
#include "wx/msw/private.h"
|
||||
|
||||
#include "wx/dcmemory.h"
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxWin macros
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#if !USE_SHARED_LIBRARY
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC, wxDC)
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC, wxDC)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Memory DC
|
||||
*
|
||||
*/
|
||||
// ============================================================================
|
||||
// implementation
|
||||
// ============================================================================
|
||||
|
||||
wxMemoryDC::wxMemoryDC(void)
|
||||
// ----------------------------------------------------------------------------
|
||||
// wxMemoryDC
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxMemoryDC::wxMemoryDC()
|
||||
{
|
||||
m_hDC = (WXHDC) ::CreateCompatibleDC((HDC) NULL);
|
||||
m_ok = (m_hDC != 0);
|
||||
m_bOwnsDC = TRUE;
|
||||
m_hDC = (WXHDC) ::CreateCompatibleDC((HDC) NULL);
|
||||
m_ok = (m_hDC != 0);
|
||||
m_bOwnsDC = TRUE;
|
||||
|
||||
SetBrush(*wxWHITE_BRUSH);
|
||||
SetPen(*wxBLACK_PEN);
|
||||
|
||||
// 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 );
|
||||
SetBrush(*wxWHITE_BRUSH);
|
||||
SetPen(*wxBLACK_PEN);
|
||||
|
||||
// the background mode is only used for text background and is set in
|
||||
// DrawText() to OPAQUE as required, otherwise always TRANSPARENT
|
||||
::SetBkMode( GetHdc(), TRANSPARENT );
|
||||
}
|
||||
|
||||
wxMemoryDC::wxMemoryDC(wxDC *old_dc)
|
||||
{
|
||||
old_dc->BeginDrawing();
|
||||
old_dc->BeginDrawing();
|
||||
|
||||
m_hDC = (WXHDC) ::CreateCompatibleDC((HDC) old_dc->GetHDC());
|
||||
m_ok = (m_hDC != 0);
|
||||
m_hDC = (WXHDC) ::CreateCompatibleDC(GetHdcOf(*old_dc));
|
||||
m_ok = (m_hDC != 0);
|
||||
|
||||
old_dc->EndDrawing();
|
||||
old_dc->EndDrawing();
|
||||
|
||||
SetBrush(*wxWHITE_BRUSH);
|
||||
SetPen(*wxBLACK_PEN);
|
||||
|
||||
// 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 );
|
||||
SetBrush(*wxWHITE_BRUSH);
|
||||
SetPen(*wxBLACK_PEN);
|
||||
|
||||
// the background mode is only used for text background and is set in
|
||||
// DrawText() to OPAQUE as required, otherwise always TRANSPARENT
|
||||
::SetBkMode( GetHdc(), TRANSPARENT );
|
||||
}
|
||||
|
||||
wxMemoryDC::~wxMemoryDC(void)
|
||||
wxMemoryDC::~wxMemoryDC()
|
||||
{
|
||||
}
|
||||
|
||||
void wxMemoryDC::SelectObject(const wxBitmap& bitmap)
|
||||
{
|
||||
// Select old bitmap out of the device context
|
||||
if (m_oldBitmap)
|
||||
{
|
||||
::SelectObject((HDC) m_hDC, (HBITMAP) m_oldBitmap);
|
||||
if (m_selectedBitmap.Ok())
|
||||
// select old bitmap out of the device context
|
||||
if ( m_oldBitmap )
|
||||
{
|
||||
m_selectedBitmap.SetSelectedInto(NULL);
|
||||
m_selectedBitmap = wxNullBitmap;
|
||||
::SelectObject(GetHdc(), (HBITMAP) m_oldBitmap);
|
||||
if ( m_selectedBitmap.Ok() )
|
||||
{
|
||||
m_selectedBitmap.SetSelectedInto(NULL);
|
||||
m_selectedBitmap = wxNullBitmap;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Do own check for whether the bitmap is already selected into
|
||||
// a device context
|
||||
if (bitmap.GetSelectedInto() && (bitmap.GetSelectedInto() != this))
|
||||
{
|
||||
wxFatalError(wxT("Error in wxMemoryDC::SelectObject\nBitmap is selected in another wxMemoryDC.\nDelete the first wxMemoryDC or use SelectObject(NULL)"));
|
||||
return;
|
||||
}
|
||||
// check for whether the bitmap is already selected into a device context
|
||||
wxCHECK_RET( !bitmap.GetSelectedInto() ||
|
||||
(bitmap.GetSelectedInto() == this),
|
||||
wxT("Bitmap is selected in another wxMemoryDC, delete the "
|
||||
"first wxMemoryDC or use SelectObject(NULL)") );
|
||||
|
||||
// Check if the bitmap has the correct depth for this device context
|
||||
// if (bitmap.Ok() && (bitmap.GetDepth() != GetDepth()))
|
||||
// JACS 11/12/98: disabling this since the Forty Thieves sample
|
||||
// shows this not working properly. In fact, if loading from a resource,
|
||||
// the depth should become the screen depth, so why was it being called?
|
||||
// if (0)
|
||||
// {
|
||||
// // Make a new bitmap that has the correct depth.
|
||||
// wxBitmap newBitmap = bitmap.GetBitmapForDC(* this);
|
||||
//
|
||||
// m_selectedBitmap = newBitmap ;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
m_selectedBitmap = bitmap;
|
||||
// }
|
||||
m_selectedBitmap = bitmap;
|
||||
WXHBITMAP hBmp = m_selectedBitmap.GetHBITMAP();
|
||||
if ( !hBmp )
|
||||
return;
|
||||
|
||||
if (!m_selectedBitmap.Ok())
|
||||
return;
|
||||
m_selectedBitmap.SetSelectedInto(this);
|
||||
hBmp = (WXHBITMAP)::SelectObject(GetHdc(), (HBITMAP)hBmp);
|
||||
|
||||
m_selectedBitmap.SetSelectedInto(this);
|
||||
HBITMAP bm = (HBITMAP) ::SelectObject((HDC) m_hDC, (HBITMAP) m_selectedBitmap.GetHBITMAP());
|
||||
if ( !hBmp )
|
||||
{
|
||||
wxLogLastError("SelectObject(memDC, bitmap)");
|
||||
|
||||
if (bm == ERROR)
|
||||
{
|
||||
wxFatalError(wxT("Error in wxMemoryDC::SelectObject\nBitmap may not be loaded, or may be selected in another wxMemoryDC.\nDelete the first wxMemoryDC to deselect bitmap."));
|
||||
}
|
||||
else if (!m_oldBitmap)
|
||||
m_oldBitmap = (WXHBITMAP) bm;
|
||||
wxFAIL_MSG(wxT("Couldn't select a bitmap into wxMemoryDC"));
|
||||
}
|
||||
else if ( !m_oldBitmap )
|
||||
{
|
||||
m_oldBitmap = hBmp;
|
||||
}
|
||||
}
|
||||
|
||||
void wxMemoryDC::DoGetSize(int *width, int *height) const
|
||||
{
|
||||
if (!m_selectedBitmap.Ok())
|
||||
{
|
||||
*width = 0; *height = 0;
|
||||
return;
|
||||
}
|
||||
*width = m_selectedBitmap.GetWidth();
|
||||
*height = m_selectedBitmap.GetHeight();
|
||||
if ( m_selectedBitmap.Ok() )
|
||||
{
|
||||
*width = m_selectedBitmap.GetWidth();
|
||||
*height = m_selectedBitmap.GetHeight();
|
||||
}
|
||||
else
|
||||
{
|
||||
*width = 0;
|
||||
*height = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user