お世話になります。
Windows7, Visual Studio 2010 Pro, MFC
MFCを使用したOLEサーバーのソフトを開発しているのですが、
クライアント側に提供するプレゼンテーション用のデータについて、分からないことが
あります。
元々は、アプリ内部では拡張メタファイル形式でプレゼンデータを作成しているのです
が、MFCが標準メタファイル形式をデフォルトにしているので、GetWinMetaFileBits()
というAPIを使用して、標準メタファイル形式に変換しています。
その影響だと思うのですが、Unicode領域の文字や記号を含むオブジェクトをクライアン
トに貼り付けると、
文字化けを起こしてしまいます。この文字化けを解消したい、というのが本来の目的で
す。
MFCのCOleServerItemクラスでは、プレゼン用のデータ形式のデフォルトは標準メタファ
イル形式になっています。これを拡張メタファイル形式に変更できないか、いろいろと
調べているのですが、よく分かりません。
BOOL COleServerItem::OnRenderData(LPFORMATETC lpFormatEtc, LPSTGMEDIUM
lpStgMedium)
{
(中略)
// default implementation supports both types of metafiles
if (lpFormatEtc->cfFormat == CF_METAFILEPICT)
return GetMetafileData(lpFormatEtc, lpStgMedium);
return FALSE; // cfFormat not supported
}
MFCの中にこのような関数があり、ここで標準メタファイルのデータを作成しているので
すが、
この関数の中に以下のようなコードを追加してみました。
if (lpFormatEtc->cfFormat == CF_ENHMETAFILE) {
lpFormatEtc->cfFormat = CF_ENHMETAFILE;
lpFormatEtc->tymed = TYMED_ENHMF;
return GetEnhMetafileData(lpFormatEtc, lpStgMedium);
}
GetEnhMetafileData()は自作の関数です。
でも、このif文の中には飛び込みません。
これは想像なのですが、サーバーが提供できるプレセンデータのフォーマットを
どこかに指定(あるいは登録)してやる必要があるような気がします。
COleServerItem::AddOtherClipboardData()の中で、サーバーがサポートしている
フォーマットを列挙してループしているような箇所があるのですが、
どのようにして拡張メタファイルをサポートしていることを通知すればいいのか分かり
ません。
もし、ご存じの方がいましたら、アドバイスをお願い致します。
OnRenderDataって、遅延レンダリング用だと思います。
(遅延レンダリングとは、クリップボードにデータを置かず、
ペースト時にサーバーを呼び出すやり方です)
さて、生のOLEだと、
IDataObject::EnumFormatEtc
IDataObject::GetData
ですが、
MFCだとどのようになっているのか、私にはわかりません。