本ページは公開が終了したページの複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。

[SDK16] クリップボード形式のメタファイルの読み込みと保存方法

PWJ1785 - 95/10

この資料は以下の製品について記述したものです。

  

概要

この資料はクリップボード形式のメタファイルの読み込みと保存の一つの方法を紹介したものです。

  

詳細

このサンプルはクリップボード形式(.CLP)で保存されたメタファイルをクリップボードへ読み込む方法と、クリップボード中のメタファイルをクリップボード形式でファイルに保存する方法に関して説明したものです。

メタファイルをクリップボード形式で扱うためには以下の様な宣言を必要とします。(プログラマーズリファレンス Vol.4 リソース P.19〜22 参照)

/* File Identifier */
#define CLP_ID 0xC350

/* Clipboard-File Header */
typedef struct {
WORD wFileIdentifier;
int nFormatCount;
} CBF_HEADER;

/* Clipboard-File Structure */
typedef struct {
UINT uFormatID;
DWORD dwLenData;
DWORD dwOffData;
char szName[79];
} CBF_FORMAT;

//////////////////// ファイル(.CLP)→クリップボード ////////////////////
void LoadMetaFileToClipBoard(void)
{
LPCSTR lpszFileName = "test.clp";
HFILE hfFile;
HGLOBAL hglbMFPict;
HGLOBAL hglbMFData;
void FAR* lpMFData;
OFSTRUCT Ofs;
CBF_HEADER FileHeader;
CBF_FORMAT ClipHeader;
LPMETAFILEPICT lpMFPict;

if ((hfFile = OpenFile(lpszFileName, &Ofs, OF_READ)) == HFILE_ERROR)
return;
hglbMFPict = GlobalAlloc(GHND, sizeof(METAFILEPICT));
lpMFPict = (LPMETAFILEPICT)GlobalLock(hglbMFPict);
_lread(hfFile, (void _huge *)&FileHeader, sizeof(CBF_HEADER));
_llseek(hfFile, sizeof(CBF_HEADER), 0);
_lread(hfFile, (void _huge *)&ClipHeader, sizeof(CBF_FORMAT));
hglbMFData = GlobalAlloc(GHND,
ClipHeader.dwLenData - sizeof(METAFILEPICT));
lpMFData = GlobalLock(hglbMFData);
_llseek(hfFile, ClipHeader.dwOffData, 0);
_lread(hfFile, (void _huge *)lpMFPict, sizeof(METAFILEPICT));
_llseek(hfFile, ClipHeader.dwOffData + sizeof(METAFILEPICT), 0);
_lread(hfFile, (void _huge *)lpMFData,
(UINT)ClipHeader.dwLenData - sizeof(METAFILEPICT));
lpMFPict->hMF = SetMetaFileBits(hglbMFData);
_lclose(hfFile);

if (OpenClipboard(NULL)) {
EmptyClipboard();
SetClipboardData(ClipHeader.uFormatID, hglbMFPict);
CloseClipboard();
}
}

//////////////////// クリップボード→ファイル(.CLP) ////////////////////
void SaveMetaFileFromClipBoard(void)
{
LPCSTR lpszFileName = "clone.clp";
HFILE hfFile;
HGLOBAL hglbMFPict;
HGLOBAL hglbMFData;
void FAR* lpMFData;
OFSTRUCT Ofs;
CBF_HEADER FileHeader;
CBF_FORMAT ClipHeader;
LPMETAFILEPICT lpMFPict;

if (!OpenClipboard(NULL))
return;
hglbMFPict = GetClipboardData(EnumClipboardFormats(0));
lpMFPict = (LPMETAFILEPICT)GlobalLock(hglbMFPict);
FileHeader.wFileIdentifier = CLP_ID;
FileHeader.nFormatCount = CountClipboardFormats();
ClipHeader.uFormatID = EnumClipboardFormats(0);
ClipHeader.dwLenData =
(DWORD)sizeof(METAFILEPICT) + GlobalSize((lpMFPict)->hMF);
ClipHeader.dwOffData = sizeof(CBF_HEADER) + sizeof(CBF_FORMAT) - 1;
GetClipboardFormatName(ClipHeader.uFormatID, ClipHeader.szName, 79);
CloseClipboard();

if ((hfFile = OpenFile(lpszFileName, &Ofs, OF_CREATE)) != HFILE_ERROR) {
_lwrite(hfFile, (void _huge *)&FileHeader, sizeof(CBF_HEADER));
_llseek(hfFile, sizeof(CBF_HEADER), 0);
_lwrite(hfFile, (void _huge *)&ClipHeader, sizeof(CBF_FORMAT));
_llseek(hfFile, sizeof(CBF_HEADER) + sizeof(CBF_FORMAT) - 1, 0);
_lwrite(hfFile, (void _huge *)lpMFPict, sizeof(METAFILEPICT));
_llseek(hfFile, sizeof(CBF_HEADER) +
sizeof(CBF_FORMAT) + sizeof(METAFILEPICT) - 1, 0);
hglbMFData = GetMetaFileBits(lpMFPict->hMF);
lpMFData = GlobalLock(hglbMFData);
_lwrite(hfFile,
(void _huge *)lpMFData, (UINT)GlobalSize(lpMFPict->hMF));
_lclose(hfFile);
}
}

注:このサンプルはファイルサイズ及びフォーマット数を特定しています。

(ファイル・サイズ:64Kバイト以内、フォーマット数:1個)

  

その他

(C)1994 Microsoft Corporation. All rights reserved.

マイクロソフト株式会社 テクニカル サポート


UP
UP
Home
HOMEPAGE
inserted by FC2 system