added some wxMSW stuff

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Karsten Ballüder
1998-05-20 14:12:05 +00:00
parent c801d85f15
commit 2bda0e1738
196 changed files with 57505 additions and 0 deletions

465
src/msw/clipbrd.cpp Normal file
View File

@@ -0,0 +1,465 @@
/////////////////////////////////////////////////////////////////////////////
// Name: clipbrd.cpp
// Purpose: Clipboard functionality
// Author: Julian Smart
// Modified by:
// Created: 04/01/98
// RCS-ID: $Id$
// Copyright: (c) Julian Smart and Markus Holzem
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation
#pragma implementation "clipbrd.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/setup.h"
#endif
#if USE_CLIPBOARD
#ifndef WX_PRECOMP
#include "wx/app.h"
#include "wx/frame.h"
#include "wx/bitmap.h"
#include "wx/utils.h"
#endif
#include "wx/metafile.h"
#include "wx/clipbrd.h"
#include "wx/msw/private.h"
#include "wx/msw/dib.h"
#include <string.h>
#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxClipboard, wxObject)
IMPLEMENT_ABSTRACT_CLASS(wxClipboardClient, wxObject)
#endif
bool wxClipboardIsOpen = FALSE;
bool wxOpenClipboard(void)
{
if (wxTheApp->GetTopWindow() && !wxClipboardIsOpen)
{
wxClipboardIsOpen = (::OpenClipboard((HWND) wxTheApp->GetTopWindow()->GetHWND()) != 0);
return wxClipboardIsOpen;
}
else return FALSE;
}
bool wxCloseClipboard(void)
{
if (wxClipboardIsOpen)
{
wxClipboardIsOpen = FALSE;
}
return (::CloseClipboard() != 0);
}
bool wxEmptyClipboard(void)
{
return (::EmptyClipboard() != 0);
}
bool wxClipboardOpen(void)
{
return wxClipboardIsOpen;
}
bool wxIsClipboardFormatAvailable(int dataFormat)
{
return (::IsClipboardFormatAvailable(dataFormat) != 0);
}
bool wxSetClipboardData(int dataFormat, wxObject *obj, int width, int height)
{
switch (dataFormat)
{
case wxCF_BITMAP:
{
wxBitmap *wxBM = (wxBitmap *)obj;
HDC hdcMem = CreateCompatibleDC(NULL);
HDC hdcSrc = CreateCompatibleDC(NULL);
HBITMAP old = ::SelectObject(hdcSrc, (HBITMAP) wxBM->GetHBITMAP());
HBITMAP hBitmap = CreateCompatibleBitmap(hdcSrc,
wxBM->GetWidth(), wxBM->GetHeight());
if (!hBitmap)
{
SelectObject(hdcSrc, old);
DeleteDC(hdcMem);
DeleteDC(hdcSrc);
return FALSE;
}
HBITMAP old1 = SelectObject(hdcMem, hBitmap);
BitBlt(hdcMem, 0, 0, wxBM->GetWidth(), wxBM->GetHeight(),
hdcSrc, 0, 0, SRCCOPY);
// Select new bitmap out of memory DC
SelectObject(hdcMem, old1);
// Set the data
bool success = (bool)(::SetClipboardData(CF_BITMAP, hBitmap) != 0);
// Clean up
SelectObject(hdcSrc, old);
DeleteDC(hdcSrc);
DeleteDC(hdcMem);
return success;
break;
}
case wxCF_DIB:
{
#if USE_IMAGE_LOADING_IN_MSW
HBITMAP hBitmap=(HBITMAP) ((wxBitmap *)obj)->GetHBITMAP();
HANDLE hDIB=BitmapToDIB(hBitmap,NULL); // NULL==uses system palette
bool success = (::SetClipboardData(CF_DIB,hDIB) != 0);
#else
bool success=FALSE;
#endif
return success;
break;
}
#if USE_METAFILE
case wxCF_METAFILE:
{
wxMetaFile *wxMF = (wxMetaFile *)obj;
HANDLE data = GlobalAlloc(GHND, sizeof(METAFILEPICT) + 1);
#ifdef __WINDOWS_386__
METAFILEPICT *mf = (METAFILEPICT *)MK_FP32(GlobalLock(data));
#else
METAFILEPICT *mf = (METAFILEPICT *)GlobalLock(data);
#endif
mf->mm = wxMF->GetWindowsMappingMode();
mf->xExt = width;
mf->yExt = height;
mf->hMF = (HANDLE) wxMF->GetHMETAFILE();
GlobalUnlock(data);
wxMF->SetHMETAFILE((WXHANDLE) NULL);
return (SetClipboardData(CF_METAFILEPICT, data) != 0);
break;
}
#endif
case CF_SYLK:
case CF_DIF:
case CF_TIFF:
case CF_PALETTE:
{
return FALSE;
break;
}
case wxCF_OEMTEXT:
dataFormat = wxCF_TEXT;
case wxCF_TEXT:
width = strlen((char *)obj) + 1;
height = 1;
default:
{
char *s = (char *)obj;
DWORD l;
l = (width * height);
HANDLE hGlobalMemory = GlobalAlloc(GHND, l);
if (!hGlobalMemory)
return FALSE;
#ifdef __WINDOWS_386__
LPSTR lpGlobalMemory = (LPSTR)MK_FP32(GlobalLock(hGlobalMemory));
#else
LPSTR lpGlobalMemory = (LPSTR)GlobalLock(hGlobalMemory);
#endif
#ifdef __WIN32__
memcpy(lpGlobalMemory, s, l);
#elif defined(__WATCOMC__) && defined(__WINDOWS_386__)
memcpy(lpGlobalMemory, s, l);
#else
hmemcpy(lpGlobalMemory, s, l);
#endif
GlobalUnlock(hGlobalMemory);
HANDLE success = SetClipboardData(dataFormat, hGlobalMemory);
return (success != 0);
break;
}
}
return FALSE;
}
wxObject *wxGetClipboardData(int dataFormat, long *len)
{
switch (dataFormat)
{
case wxCF_BITMAP:
{
BITMAP bm;
HBITMAP hBitmap = GetClipboardData(CF_BITMAP);
if (!hBitmap)
return NULL;
HDC hdcMem = CreateCompatibleDC(NULL);
HDC hdcSrc = CreateCompatibleDC(NULL);
HBITMAP old = ::SelectObject(hdcSrc, hBitmap);
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
HBITMAP hNewBitmap = CreateBitmapIndirect(&bm);
if (!hNewBitmap)
{
SelectObject(hdcSrc, old);
DeleteDC(hdcMem);
DeleteDC(hdcSrc);
return NULL;
}
HBITMAP old1 = SelectObject(hdcMem, hNewBitmap);
BitBlt(hdcMem, 0, 0, bm.bmWidth, bm.bmHeight,
hdcSrc, 0, 0, SRCCOPY);
// Select new bitmap out of memory DC
SelectObject(hdcMem, old1);
// Clean up
SelectObject(hdcSrc, old);
DeleteDC(hdcSrc);
DeleteDC(hdcMem);
// Create and return a new wxBitmap
wxBitmap *wxBM = new wxBitmap;
wxBM->SetHBITMAP((WXHBITMAP) hNewBitmap);
wxBM->SetWidth(bm.bmWidth);
wxBM->SetHeight(bm.bmHeight);
wxBM->SetDepth(bm.bmPlanes);
wxBM->SetOk(TRUE);
return (wxObject *)wxBM;
break;
}
case wxCF_METAFILE:
case CF_SYLK:
case CF_DIF:
case CF_TIFF:
case CF_PALETTE:
case wxCF_DIB:
{
return FALSE;
break;
}
case wxCF_OEMTEXT:
dataFormat = wxCF_TEXT;
case wxCF_TEXT:
default:
{
HANDLE hGlobalMemory = GetClipboardData(dataFormat);
if (!hGlobalMemory)
return NULL;
int hsize = (int)GlobalSize(hGlobalMemory);
if (len)
*len = hsize;
char *s = new char[hsize];
if (!s)
return NULL;
#ifdef __WINDOWS_386__
LPSTR lpGlobalMemory = (LPSTR)MK_FP32(GlobalLock(hGlobalMemory));
#else
LPSTR lpGlobalMemory = (LPSTR)GlobalLock(hGlobalMemory);
#endif
#ifdef __WIN32__
memcpy(s, lpGlobalMemory, GlobalSize(hGlobalMemory));
#elif __WATCOMC__ && defined(__WINDOWS_386__)
memcpy(s, lpGlobalMemory, GlobalSize(hGlobalMemory));
#else
hmemcpy(s, lpGlobalMemory, GlobalSize(hGlobalMemory));
#endif
GlobalUnlock(hGlobalMemory);
return (wxObject *)s;
break;
}
}
return NULL;
}
int wxEnumClipboardFormats(int dataFormat)
{
return ::EnumClipboardFormats(dataFormat);
}
int wxRegisterClipboardFormat(char *formatName)
{
return ::RegisterClipboardFormat(formatName);
}
bool wxGetClipboardFormatName(int dataFormat, char *formatName, int maxCount)
{
return (::GetClipboardFormatName(dataFormat, formatName, maxCount) > 0);
}
/*
* Generalized clipboard implementation by Matthew Flatt
*/
wxClipboard *wxTheClipboard = NULL;
void wxInitClipboard(void)
{
if (!wxTheClipboard)
wxTheClipboard = new wxClipboard;
}
wxClipboard::wxClipboard()
{
clipOwner = NULL;
cbString = NULL;
}
wxClipboard::~wxClipboard()
{
if (clipOwner)
clipOwner->BeingReplaced();
if (cbString)
delete[] cbString;
}
static int FormatStringToID(char *str)
{
if (!strcmp(str, "TEXT"))
return wxCF_TEXT;
return wxRegisterClipboardFormat(str);
}
void wxClipboard::SetClipboardClient(wxClipboardClient *client, long time)
{
bool got_selection;
if (clipOwner)
clipOwner->BeingReplaced();
clipOwner = client;
if (cbString) {
delete[] cbString;
cbString = NULL;
}
if (wxOpenClipboard()) {
char **formats, *data;
int i;
int ftype;
long size;
formats = clipOwner->formats.ListToArray(FALSE);
for (i = clipOwner->formats.Number(); i--; ) {
ftype = FormatStringToID(formats[i]);
data = clipOwner->GetData(formats[i], &size);
if (!wxSetClipboardData(ftype, (wxObject *)data, size, 1)) {
got_selection = FALSE;
break;
}
}
if (i < 0)
got_selection = wxCloseClipboard();
} else
got_selection = FALSE;
got_selection = FALSE; // Assume another process takes over
if (!got_selection) {
clipOwner->BeingReplaced();
clipOwner = NULL;
}
}
wxClipboardClient *wxClipboard::GetClipboardClient()
{
return clipOwner;
}
void wxClipboard::SetClipboardString(char *str, long time)
{
bool got_selection;
if (clipOwner) {
clipOwner->BeingReplaced();
clipOwner = NULL;
}
if (cbString)
delete[] cbString;
cbString = str;
if (wxOpenClipboard()) {
if (!wxSetClipboardData(wxCF_TEXT, (wxObject *)str))
got_selection = FALSE;
else
got_selection = wxCloseClipboard();
} else
got_selection = FALSE;
got_selection = FALSE; // Assume another process takes over
if (!got_selection) {
delete[] cbString;
cbString = NULL;
}
}
char *wxClipboard::GetClipboardString(long time)
{
char *str;
long length;
str = GetClipboardData("TEXT", &length, time);
if (!str) {
str = new char[1];
*str = 0;
}
return str;
}
char *wxClipboard::GetClipboardData(char *format, long *length, long time)
{
if (clipOwner) {
if (clipOwner->formats.Member(format))
return clipOwner->GetData(format, length);
else
return NULL;
} else if (cbString) {
if (!strcmp(format, "TEXT"))
return copystring(cbString);
else
return NULL;
} else {
if (wxOpenClipboard()) {
receivedString = (char *)wxGetClipboardData(FormatStringToID(format),
length);
wxCloseClipboard();
} else
receivedString = NULL;
return receivedString;
}
}
#endif // USE_CLIPBOARD