Friday, January 11, 2008

Copying a Bitmap of the Client Area

The following bit of code renders the client area using OnDraw() into a bitmap. The bitmap is placed on the clipboard as a CF_BITMAP that is recognizable by most applications that accept bitmaps. This code will work will all mapping modes provided that mapping mode is set in the OnPrepareDC() function.

Collapsevoid CXStitchView::OnEditCopy()
{
CRect rect;
CClientDC dc(this);
CDC memDC;
CBitmap bitmap;

GetClientRect(&rect);

// Create memDC
memDC.CreateCompatibleDC(&dc);
bitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);

// Fill in memDC
memDC.FillSolidRect(rect, dc.GetBkColor());
OnPrepareDC(&memDC);
OnDraw(&memDC);

// Copy contents of memDC to clipboard
OpenClipboard();
EmptyClipboard();
SetClipboardData(CF_BITMAP, bitmap.GetSafeHandle());
CloseClipboard();

// Clean up
memDC.SelectObject(pOldBitmap);
bitmap.Detach();
}

Copying a Table of Data to the Clipboard
Placing a table of data on the clipboard is easy. It is simply a string of text. Tabs separate columns, new lines separate rows. Here's some example source.

#include

void CClipExamView::OnEditCopy()
{
// Create a shared memory file
CSharedFile sf(GMEM_MOVEABLE | GMEM_SHARE | GMEM_ZEROINIT);

// Place clipboard data in the shared memory file
RenderTableData(sf);

if (sf.GetLength() > 0) {
// Put the data on the clipboard
OpenClipboard();
EmptyClipboard();
SetClipboardData(CF_TEXT, sf.Detach());
CloseClipboard();
}
}

void CClipExamView::RenderTableData(CFile &file)
{
// Columns are separated by tabs ('\t')
// Rows are separated by new lines ('\n')
CString buffer = "1\t2\t3\n4\t5\t6\n";
file.Write(buffer, buffer.GetLength());
}

Copying Formatted Data to the Clipboard
Formatted text can support bold, italic or any other formatting that can be done in a word processor. Formatted text is usually placed on the clipboard as RTF (Rich Text Format).

The Rich Text Format is intended as an interchange format for Word-processing applications. Because of that, it is a rather large and feature rich file format. Fortunately, it is possible to describe a minimal RTF command set for creating simple formatted documents.

Basic RTF commands:
\par - Starts a new paragraph.
\tab - A tab.
\b - Enable Bold (scoped within a group)
\i - Enable Italics (scoped within a group)
\ul - Enable Underline (scoped within a group)

For example, the RTF string:

{\rtf1 {1 \tab 2 \tab 3 \par 4 \tab {\b\i 5} \tab 6}}

Source

#include

void CClipExamView::OnEditCopy()
{
// Create a shared memory file
CSharedFile sf(GMEM_MOVEABLE | GMEM_SHARE | GMEM_ZEROINIT);

// Place clipboard data in the shared memory file
RenderFormattedData(sf);

if (sf.GetLength() > 0) {
// Put the data on the clipboard
OpenClipboard();
EmptyClipboard();
SetClipboardData(::RegisterClipboardFormat(CF_RTF), sf.Detach());
CloseClipboard();
}
}

void CClipExamView::RenderFormattedData(CFile &file)
{
// RTF (Rich Text Format) - Don't forget to escape
// the \ character in your C strings!
CString buffer = "{\\rtf1 {1 \\tab 2 \\tab 3"
" \\par 4 \\tab {\\b\\i 5} \\tab 6}}";
file.Write(buffer, buffer.GetLength());
}

Getting More Info on RTF

No comments: