オフスクリーンにレンダリングしたものをクリップボードにコピーしていて,
5000x5000x4 バイトの CF_BITMAP がうまく動作しない.
原因は Office クリップボードの制限みたいで 8 M まで.
Office クリップボードにアイテムを追加できない場合の確認事項
無効にして対応.
よくわからないが,以下の様にした.
CF_METAFILEPICT StretchDIBits
CF_BITMAP AlphaBlend
AlphaBlend function (Windows) – TechNet – Microsoft に,
An error occurs (…) if the source device context identifies an enhanced metafile device context.
コピー画像は,
いろいろやっていて,一度 EMF に吐いて
::GetEnhMetaFile(…) で返される HENHMETAFILE を CF_ENHMETAFILE で意図した動作となった.
{
CString tmpPath = ::GetTempPath() ;
tmpPath = CString(::Path_AddLastSP(tmpPath).c_str()) + _T(“Debug.tmp”) ;
tmpPath = CString(::Path_AddLastSP(tmpPath).c_str()) + ::GetFileTitle(::GetModuleFileName()) ;
CString nowStr = CTime::GetCurrentTime().Format(_T(“%d%H%M%S”)) ;
CString tmpName = CString(::Path_AddLastSP(tmpPath).c_str()) + nowStr + _T(“.emf”) ;
::CreateFolder(tmpPath) ;
::ToEMF(dib,tmpName) ;
HENHMETAFILE hMetaFile = ::GetEnhMetaFile(tmpName) ;
return hMetaFile ;
}
…
::SetClipboardData(CF_ENHMETAFILE, hGMemEnhM) ;
i_DIB_x.hxx
i_DIB_Fn.hxx
i_dib.hxx
今度はメモリメタファイル(第 2 引数を NULL)にして,
{
CMetaFileDC mf_DC ;
BOOL ret = mf_DC.CreateEnhanced(NULL,NULL,NULL,NULL) ;
::AlphaBlend (mf_DC.GetSafeHdc(),dRect,dib) ;
HENHMETAFILE hEnhMetaF = mf_DC.CloseEnhanced() ;
return hEnhMetaF ;
}
CreateEnhanced の幾つかの引数が NULL は知らなかった.
CreateEnhMetaFile
Programming Windows 5 18.2.2
Programming Windows 5
XP 環境のクリップブックや,Word 2003 などでの CF_METAFILEPICT がうまくない.
{
CMetaFileDC mf_DC ;
BOOL ret = mf_DC.Create() ;
::StretchDIBits (mf_DC.GetSafeHdc(),dRect,dib) ;
HMETAFILE hMetaFile = mf_DC.Close() ;
hGMemMeta = ::GlobalAlloc( GHND, (DWORD) sizeof(METAFILEPICT)) ;
{
LPMETAFILEPICT lpMFP = (LPMETAFILEPICT)GlobalLock(hGMemMeta) ;
lpMFP->mm = MM_TEXT ;
lpMFP->xExt = dRect.right ;
lpMFP->yExt = dRect.bottom ;
lpMFP->hMF = hMetaFile ;
}
::GlobalUnlock(hGMemMeta) ;
return hGMemMeta ;
}
StretchDIBits とした.