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:
Vadim Zeitlin
1999-10-18 00:08:40 +00:00
parent 23d277e683
commit d59ceba572
9 changed files with 820 additions and 333 deletions

View File

@@ -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;
}
}