static HMETAFILE GetPlaceableMetaFile( HWND hwnd, LPCSTR szFileName ) { LPBYTE lpData; METAHEADER mfHeader; APMFILEHEADER APMHeader; HFILE fh; HMETAFILE hmf; WORD checksum, *p; HDC hdc; int i; if( (fh = _lopen( szFileName, OF_READ ) ) == HFILE_ERROR ) return 0; _llseek(fh, 0, 0); if (!_lread(fh, (LPSTR)&APMHeader, sizeof(APMFILEHEADER))) return 0; _llseek(fh, sizeof(APMFILEHEADER), 0); checksum = 0; p = (WORD *) &APMHeader; for(i=0; i<10; i++) checksum ^= *p++; if (checksum != APMHeader.checksum) { char msg[128]; sprintf(msg, "Computed checksum %04x != stored checksum %04x\n", checksum, APMHeader.checksum); MessageBox(hwnd, msg, "Checksum failed", MB_OK); return 0; } if (!_lread(fh, (LPSTR)&mfHeader, sizeof(METAHEADER))) return 0; if (!(lpData = GlobalAlloc(GPTR, (mfHeader.mtSize * 2L)))) return 0; _llseek(fh, sizeof(APMFILEHEADER), 0); if (!_lread(fh, lpData, (UINT)(mfHeader.mtSize * 2L))) { GlobalFree((HGLOBAL)lpData); _lclose(fh); return 0; } _lclose(fh); if (!(hmf = SetMetaFileBitsEx(mfHeader.mtSize*2, lpData))) return 0; width = APMHeader.bbox.Right - APMHeader.bbox.Left; height = APMHeader.bbox.Bottom - APMHeader.bbox.Top; /* printf("Ok! width %d height %d inch %d\n", width, height, APMHeader.inch); */ hdc = GetDC(hwnd); width = width * GetDeviceCaps(hdc, LOGPIXELSX)/APMHeader.inch; height = height * GetDeviceCaps(hdc,LOGPIXELSY)/APMHeader.inch; ReleaseDC(hwnd, hdc); deltax = 0; deltay = 0 ; return hmf; }
static BOOL ClipboardReadMetafile(HANDLE hFile, DWORD dwOffset, DWORD dwLength) { HMETAFILE hMf; HGLOBAL hData; LPVOID lpData; hData = ClipboardReadMemoryBlock(hFile, dwOffset, dwLength); if (!hData) { return FALSE; } lpData = GlobalLock(hData); if (!lpData) { GlobalFree(hData); return FALSE; } hMf = SetMetaFileBitsEx(dwLength, lpData); GlobalUnlock(hData); GlobalFree(hData); if (!hMf) { SetLastError(ERROR_OUTOFMEMORY); return FALSE; } if (!SetClipboardData(CF_METAFILEPICT, hMf)) { DeleteMetaFile(hMf); return FALSE; } return TRUE; }
/****************************************************************** * create_metafile32 * * Create a 32-bit metafile from a 16-bit one. */ static HMETAFILE create_metafile32( HMETAFILE16 hmf16 ) { METAHEADER *mh = MF_GetMetaHeader16( hmf16 ); if (!mh) return 0; return SetMetaFileBitsEx( mh->mtSize * 2, (BYTE *)mh ); }
/* * clipboard_bytes_to_data - バイト列をデータに変換 */ HANDLE clipboard_bytes_to_data(TCHAR *format_name, const BYTE *data, DWORD *size) { HANDLE ret = NULL; BYTE *to_mem; if (data == NULL) { return NULL; } switch (clipboard_get_format(0, format_name)) { case CF_PALETTE: // パレット ret = CreatePalette((LOGPALETTE *)data); break; case CF_DSPBITMAP: case CF_BITMAP: // ビットマップ ret = dib_to_bitmap(data); break; case CF_OWNERDISPLAY: break; case CF_DSPMETAFILEPICT: case CF_METAFILEPICT: // メタファイル if ((ret = GlobalAlloc(GHND, sizeof(METAFILEPICT))) == NULL) { break; } if ((to_mem = GlobalLock(ret)) == NULL) { GlobalFree(ret); ret = NULL; break; } CopyMemory(to_mem, data, sizeof(METAFILEPICT)); if ((((METAFILEPICT *)to_mem)->hMF = SetMetaFileBitsEx(*size - sizeof(METAFILEPICT), data + sizeof(METAFILEPICT))) == NULL) { GlobalUnlock(ret); GlobalFree(ret); ret = NULL; break; } GlobalUnlock(ret); break; case CF_DSPENHMETAFILE: case CF_ENHMETAFILE: ret = SetEnhMetaFileBits(*size, data); break; default: // その他 // コピー先確保 if ((ret = GlobalAlloc(GHND, *size)) == NULL) { return NULL; } // コピー先ロック if ((to_mem = GlobalLock(ret)) == NULL) { GlobalFree(ret); return NULL; } // コピー CopyMemory(to_mem, data, *size); // ロック解除 GlobalUnlock(ret); break; } return ret; }
static HMETAFILE GetPlaceableMetaFile( LPCWSTR szFileName ) { LPBYTE lpData; METAHEADER mfHeader; APMFILEHEADER APMHeader; HANDLE handle; DWORD size; HMETAFILE hmf; WORD checksum, *p; HDC hdc; int i; handle = CreateFileW( szFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ); if (handle == INVALID_HANDLE_VALUE) return 0; if (!ReadFile( handle, &APMHeader, sizeof(APMFILEHEADER), &size, NULL ) || size != sizeof(APMFILEHEADER)) { CloseHandle( handle ); return 0; } checksum = 0; p = (WORD *) &APMHeader; for(i=0; i<10; i++) checksum ^= *p++; if (checksum != APMHeader.checksum) { char msg[128]; sprintf(msg, "Computed checksum %04x != stored checksum %04x\n", checksum, APMHeader.checksum); MessageBoxA(hMainWnd, msg, "Checksum failed", MB_OK); CloseHandle( handle ); return 0; } if (!ReadFile( handle, &mfHeader, sizeof(METAHEADER), &size, NULL) || size != sizeof(METAHEADER)) { CloseHandle( handle ); return 0; } if (!(lpData = GlobalAlloc(GPTR, (mfHeader.mtSize * 2L)))) { CloseHandle( handle ); return 0; } SetFilePointer( handle, sizeof(APMFILEHEADER), NULL, FILE_BEGIN ); if (!ReadFile(handle, lpData, mfHeader.mtSize * 2, &size, NULL ) || size != mfHeader.mtSize * 2) { GlobalFree(lpData); CloseHandle( handle ); return 0; } CloseHandle( handle ); if (!(hmf = SetMetaFileBitsEx(mfHeader.mtSize*2, lpData))) { GlobalFree(lpData); return 0; } width = APMHeader.bbox.Right - APMHeader.bbox.Left; height = APMHeader.bbox.Bottom - APMHeader.bbox.Top; /* printf("Ok! width %d height %d inch %d\n", width, height, APMHeader.inch); */ hdc = GetDC(hMainWnd); width = width * GetDeviceCaps(hdc, LOGPIXELSX)/APMHeader.inch; height = height * GetDeviceCaps(hdc,LOGPIXELSY)/APMHeader.inch; ReleaseDC(hMainWnd, hdc); deltax = 0; deltay = 0 ; GlobalFree(lpData); return hmf; }