[Windows Programming] ドキュメントの内容をクリップボードへ (MFC版)
SyntaxHighlighter を使って C++ のソースコードに色を付けてみる実験。
// MFC版
// ドキュメントの内容を:
// ・クリップボードへメタファイルと独自形式でコピー
// ・クリップボードから独自形式でペースト
// ※ MyDocument::Serialize と MyView::OnDraw でのドキュメントの描画を実装しておくこと
// MyView.h
class MyView : public CView
{
DECLARE_DYNCREATE(MyView)
DECLARE_MESSAGE_MAP()
HGLOBAL globalMemoryHandle;
protected:
MyView() : globalMemoryHandle(NULL)
{}
MyDocument* GetDocument() const
{ return reinterpret_cast<MyDocument*>(m_pDocument); }
virtual void OnDraw(CDC* pDC)
{
if (GetDocument() != NULL)
/* ドキュメントの描画 */ ;
}
afx_msg void OnEditCopy()
{
if (GetDocument() == NULL)
return;
// ドキュメントが空なら何もしない
// 例.
// if (GetDocument()->IsEmpty())
// return;
// 拡張メタファイルの作成
CClientDC clientDC(this);
CMetaFileDC metaDC;
metaDC.CreateEnhanced(&clientDC, NULL, NULL, NULL);
OnDraw(&metaDC);
const HENHMETAFILE enhancedMetaFileHandle = metaDC.CloseEnhanced();
// メモリへのシリアライズ
CSharedFile sharedFile;
{
CArchive ar(&sharedFile, CArchive::store);
GetDocument()->Serialize(ar);
}
globalMemoryHandle = sharedFile.Detach();
// クリップボードへの書き込み
if (OpenClipboard()) {
::EmptyClipboard();
::SetClipboardData(CF_ENHMETAFILE, CopyEnhMetaFile(enhancedMetaFileHandle, NULL));
::SetClipboardData(CF_PRIVATEFIRST, globalMemoryHandle);
::CloseClipboard();
}
::DeleteEnhMetaFile(enhancedMetaFileHandle);
}
afx_msg void OnEditPaste()
{
if (GetDocument() == NULL)
return;
if (OpenClipboard()) {
const HANDLE clipboardData = ::GetClipboardData(CF_PRIVATEFIRST);
if (clipboardData != NULL) {
CSharedFile sharedFile;
sharedFile.SetHandle(clipboardData);
{
CArchive ar(&sharedFile, CArchive::load);
GetDocument()->Serialize(ar);
}
sharedFile.Detach();
GetDocument()->SetModifiedFlag();
Invalidate();
}
::CloseClipboard();
}
}
afx_msg void OnDestroyClipboard()
{
CView::OnDestroyClipboard();
// WM_DESTROYCLIPBOARD 時に CF_PRIVATEFIRST で確保したメモリを開放する必要がある
if (globalMemoryHandle != NULL) {
::GlobalUnlock(globalMemoryHandle);
::GlobalFree (globalMemoryHandle);
globalMemoryHandle = NULL;
}
}
};
// MyView.cpp
#include "MyView.h"
IMPLEMENT_DYNCREATE(MyView, CView)
BEGIN_MESSAGE_MAP(MyView, CView)
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
ON_WM_DESTROYCLIPBOARD()
END_MESSAGE_MAP()



最近のコメント
さくらさくら [03/10 15:08]
Fujiwo [03/10 15:22]
さくらさくら [03/10 16:17]
平鍋 [09/10 22:12]
takakuro [09/06 10:20]
Fujiwo [09/07 16:55]
wan [02/23 15:24]
Fujiwo [02/23 19:00]
福王寺聡明(FP!) [02/14 10:46]
Fujiwo [02/14 15:32]
επιστημη [02/22 00:03]
Fujiwo [02/22 04:37]
福王寺聡明(FP!) [02/16 09:22]
Fujiwo [02/16 11:02]
くま [03/24 23:47]
Fujiwo [03/25 13:51]
Gill [02/06 13:29]
Fujiwo [02/06 16:02]
Tak.Arai [12/02 02:43]
Fujiwo [12/02 07:50]
ななしさん [02/05 02:19]
[02/05 02:37]
Fujiwo [02/06 02:48]
クロ [12/20 12:51]
shinchan55 [12/20 17:27]
Fujiwo [12/20 19:48]
ichikawa [11/22 09:19]
Fujiwo [11/22 10:22]
なますて [11/24 15:49]
Fujiwo [11/24 19:12]