2

私は C++ と OpenGL が初めてです。誰かが以前に書いた (Linux ベースの) C++ アプリケーションがあり、微調整する必要があります。

基本的に、このアプリケーションでは、プロットを含むウィンドウがあります。現在、このウィンドウは、プロットをビットマップ (tga、jpg、および bmp) にエクスポートする機能をサポートしています。プロットの内容を拡張メタ ファイルとして保存する別の関数を追加したいと考えています。

CDC デバイス ハンドラーを取得し、その HDC を使用して、プロットと同じ幅/高さの空の EMF を作成することができましたが、プロットのコンテンツを EMF ファイルに移行する方法の手がかりがありません。これを行うコードはありますか?

空の EMF ファイルを作成するために使用しているコードは次のとおりです。どんな種類のアイデアや助けにも感謝します!

CDC* dc = pWnd->GetDC();
HDC hdcRef;
hdcRef = dc->GetSafeHdc();

CRect rect;
pWnd->GetClientRect(rect);

// Convert client coordinates to .01-mm units.
// Use iWidthMM, iWidthPels, iHeightMM, and
int iWidthMM = GetDeviceCaps (hdcRef, HORZSIZE);  
int iHeightMM = GetDeviceCaps (hdcRef, VERTSIZE);  
int iWidthPels = GetDeviceCaps (hdcRef, HORZRES);  
int iHeightPels = GetDeviceCaps (hdcRef, VERTRES);  
rect.left = (rect.left * iWidthMM * 100) / iWidthPels;  
rect.top = (rect.top * iHeightMM * 100) / iHeightPels;  
rect.right = (rect.right * iWidthMM * 100) / iWidthPels;  
rect.bottom = (rect.bottom * iHeightMM * 100) / iHeightPels;

//::SetMapMode(hdcRef, MM_HIMETRIC);
HDC hdcMeta = CreateEnhMetaFile(hdcRef, "C:\\temp\\testEMF.emf", &rect, "Example metafile\0");
if (!hdcMeta) 
    GenAppWarningMsg("CreateEnhMetaFile", "Error");

// Set the device context back to its original state.  
SetMapMode(hdcMeta, MM_ANISOTROPIC); 
::ReleaseDC(NULL, hdcRef);

HENHMETAFILE meta = CloseEnhMetaFile (hdcMeta);
4

1 に答える 1

1

あなたは正しい軌道に乗っています。基本的に、メタ ファイルの DC を作成し (これまでに行ったように)、元のコードにプロットをその DC にレンダリングするように要求します。

元のコードにはそのような機能があるかもしれません。そうでない場合は、Windows メッセージWM_PRINTを送信して、DC でレンダリングするようにだますことができる場合があります。一部の Windows は WM_PRINT が依存する WM_PRINTCLIENT のハンドラーを実装していないため、これが機能する保証はありません。

それを機能させることができない場合 (元のコードには任意の DC にレンダリングする方法がなく、その機能を追加するためにコードを変更できないため)、ビットマップ ファイルを取得することが最善の方法です。 BitBlt を直接あなたのhdcMeta. EMF を拡大/縮小しようとすると、このアプローチは見栄えがよくありません。

于 2012-09-14T19:54:28.337 に答える