int main() { FILE *fp; char wmf[] = "\x01\x00\x09\x00\x00\x03\x11\x00\x00\x00\x00\x00"\ "\x05\x00\x00\x00\x00\x00\xFF\xFF\xFF\xFF\x13\x02"\ "\x32\x00\x96\x00\x03\x00\x00\x00\x00\x00"; int i; HMETAFILE srcMeta; usage(); if ((fp = fopen(WMF_FILE, "w")) == NULL) { printf("File %s write error\n", WMF_FILE); return 0; } for(i=0; i<sizeof(wmf)-1; i++) fputc(wmf[i], fp); fclose(fp); srcMeta = GetMetaFile(WMF_FILE); CopyMetaFile( srcMeta, NULL); return 0; }
void IT_COPYMETAFILE(ENV *envp,LONGPROC f) { char buf[0x100]; WORD wSel; HGLOBAL hGlobal; LPSTR lpszFile; LPBYTE lpData; wSel = GETWORD(SP+8); hGlobal = GetSelectorHandle(wSel); lpszFile = GetAddress(GETWORD(SP+6),GETWORD(SP+4)); if (lpszFile && strchr(lpszFile,'\\')) { xdoscall(XDOS_GETALTNAME,0,(void *) buf,(void *) lpszFile); lpszFile = buf; } hGlobal = CopyMetaFile(hGlobal,lpszFile); if (hGlobal) { lpData = (LPBYTE)GlobalLock(hGlobal); wSel = AssignSelector(lpData,0,TRANSFER_DATA, GlobalSize(hGlobal)); SetSelectorHandle(wSel,hGlobal); GlobalUnlock(hGlobal); } else wSel = 0; envp->reg.sp += HANDLE_86 + LP_86 + RET_86; envp->reg.ax = wSel & 0xfffe; envp->reg.dx = 0; }
bool wxMetafileDataObject::GetDataHere(void *buf) const { METAFILEPICT *mfpict = (METAFILEPICT *)buf; const wxMetafile& mf = GetMetafile(); wxCHECK_MSG( mf.GetHMETAFILE(), false, wxT("copying invalid metafile") ); // doesn't seem to work with any other mapping mode... mfpict->mm = MM_ANISOTROPIC; //mf.GetWindowsMappingMode(); mfpict->xExt = mf.GetWidth(); mfpict->yExt = mf.GetHeight(); // transform the picture size to HIMETRIC units (0.01mm) - as we don't know // what DC the picture will be rendered to, use the default display one PixelToHIMETRIC(&mfpict->xExt, &mfpict->yExt); mfpict->hMF = CopyMetaFile((HMETAFILE)mf.GetHMETAFILE(), NULL); return true; }
/* * clipboard_data_to_file - データをファイルに保存 */ BOOL clipboard_data_to_file(DATA_INFO *di, const TCHAR *file_name, const int filter_index, TCHAR *err_str) { HMETAFILE hMeta; HENHMETAFILE enh_meta; BYTE *tmp; DWORD size; if (di->data == NULL) { if (file_write_buf(file_name, NULL, 0, err_str) == FALSE) { return FALSE; } return TRUE; } switch (di->format) { case CF_OWNERDISPLAY: return FALSE; case CF_DSPMETAFILEPICT: case CF_METAFILEPICT: // メタファイル if ((tmp = GlobalLock(di->data)) == NULL) { message_get_error(GetLastError(), err_str); return FALSE; } if ((hMeta = CopyMetaFile(((METAFILEPICT *)tmp)->hMF, file_name)) == NULL) { message_get_error(GetLastError(), err_str); GlobalUnlock(di->data); return FALSE; } DeleteMetaFile(hMeta); GlobalUnlock(di->data); break; case CF_DSPENHMETAFILE: case CF_ENHMETAFILE: // 拡張メタファイル if ((enh_meta = CopyEnhMetaFile(di->data, file_name)) == NULL) { message_get_error(GetLastError(), err_str); return FALSE; } DeleteEnhMetaFile(enh_meta); break; default: // その他 // データをバイト列に変換 if ((tmp = clipboard_data_to_bytes(di, &size)) == NULL) { message_get_error(GetLastError(), err_str); return FALSE; } // ファイルに書き込む if (file_write_buf(file_name, tmp, di->size, err_str) == FALSE) { mem_free(&tmp); return FALSE; } mem_free(&tmp); break; } return TRUE; }
/* * clipboard_copy_data - クリップボードデータのコピーを作成 */ HANDLE clipboard_copy_data(const UINT format, const HANDLE data, DWORD *ret_size) { HANDLE ret = NULL; BYTE *from_mem, *to_mem; LOGPALETTE *lpal; WORD pcnt; if (data == NULL) { return NULL; } switch (format) { case CF_PALETTE: // パレット pcnt = 0; if (GetObject(data, sizeof(WORD), &pcnt) == 0) { return NULL; } if ((lpal = mem_calloc(sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * pcnt))) == NULL) { return NULL; } lpal->palVersion = 0x300; lpal->palNumEntries = pcnt; if (GetPaletteEntries(data, 0, pcnt, lpal->palPalEntry) == 0) { mem_free(&lpal); return NULL; } ret = CreatePalette(lpal); *ret_size = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * pcnt); mem_free(&lpal); break; case CF_DSPBITMAP: case CF_BITMAP: // ビットマップ if ((to_mem = bitmap_to_dib(data, ret_size)) == NULL) { return NULL; } ret = dib_to_bitmap(to_mem); mem_free(&to_mem); break; case CF_OWNERDISPLAY: *ret_size = 0; break; case CF_DSPMETAFILEPICT: case CF_METAFILEPICT: // コピー元ロック if ((from_mem = GlobalLock(data)) == NULL) { return NULL; } // メタファイル if ((ret = GlobalAlloc(GHND, sizeof(METAFILEPICT))) == NULL) { GlobalUnlock(data); return NULL; } // コピー先ロック if ((to_mem = GlobalLock(ret)) == NULL) { GlobalFree(ret); GlobalUnlock(data); return NULL; } CopyMemory(to_mem, from_mem, sizeof(METAFILEPICT)); if ((((METAFILEPICT *)to_mem)->hMF = CopyMetaFile(((METAFILEPICT *)from_mem)->hMF, NULL)) != NULL) { *ret_size = sizeof(METAFILEPICT) + GetMetaFileBitsEx(((METAFILEPICT *)to_mem)->hMF, 0, NULL); } // ロック解除 GlobalUnlock(ret); GlobalUnlock(data); break; case CF_DSPENHMETAFILE: case CF_ENHMETAFILE: // 拡張メタファイル if ((ret = CopyEnhMetaFile(data, NULL)) != NULL) { *ret_size = GetEnhMetaFileBits(ret, 0, NULL); } break; default: // その他 // メモリチェック if (IsBadReadPtr(data, 1) == TRUE) { return NULL; } // サイズ取得 if ((*ret_size = GlobalSize(data)) == 0) { return NULL; } // コピー元ロック if ((from_mem = GlobalLock(data)) == NULL) { return NULL; } // コピー先確保 if ((ret = GlobalAlloc(GHND, *ret_size)) == NULL) { GlobalUnlock(data); return NULL; } // コピー先ロック if ((to_mem = GlobalLock(ret)) == NULL) { GlobalFree(ret); GlobalUnlock(data); return NULL; } // コピー CopyMemory(to_mem, from_mem, *ret_size); // ロック解除 GlobalUnlock(ret); GlobalUnlock(data); break; } return ret; }