2012-03-16 30 views
1

私はSetViewportExt()SetViewportExtEx()に関する奇妙な動作に陥っています。SetWindowExtとSetWindowExtExの奇妙さ(負の高さ、逆さの逆)

私のMFCアプリケーションは、表示デバイスコンテキストを設定するためのMM_ISOTROPICマッピングを使用して、次のようにデバイスコンテキストを設定します。私の見解をレンダリングする場合

  • m_dc.SetMapMode(MM_ISOTROPIC); 
    
    // Set the window extent (document space) 
    CSize docSizeLP = GetDocumentSizeLP(); 
    m_dc.SetWindowExt(docSizeLP.cx, docSizeLP.cy); 
    
    // Next set the viewport extent 
    CSize docSizeDP = GetDocumentSizeDP(); 
    m_dc.SetViewportExt((int) (docSizeDP.cx * fZoom), (int) (docSizeDP.cy * fZoom)); 
    

    は今、私は3奇妙なに遭遇していますメタファイル(CMetaFileDC)に私のの表示内容は、メタファイルで上下が逆です。しかし、SetViewportExt()コールをSetViewportExtEx()コールで置き換えると、メタファイルは正しいです。違いは、SetViewportExtEx()はマイナスのビューポートの高さを設定していますが、私の渡された値は確実にプラスです。メタファイルを正しく取得するには負のビューポートの高さが必要です。

  • 一方、SetViewportExtEx()をデフォルトとして使用すると、印刷プレビューには何も表示されないが表示されます。また、SetViewportExtEx()を呼び出すと、ビューポートの高さが負になります。これがおそらく原因です。
  • ノーマルビューレンダリング(MFCビュー)では、SetViewportExt()SetViewportExtEx()の両方が正のビューポートの高さになります。

だから、誰もこの2つの質問に答えますか?

  1. なぜ私はポジティブ1を渡すもののSetViewportExtEx()は、メタファイルおよび印刷プレビューレンダリングで負の値としての私のビューポートの高さを設定しない一体?
  2. 最後に逆さまにならないようにメタファイルのレンダリングで負のビューポートの高さが必要なのはなぜですか?

私の知恵がここで終わって以来、誰かがこれに対する答えを持っているかどうかは不思議です。 :-)

答えて

1

あなたの質問は、私が拡張メタファイルで持っていた問題を解決するヒントを与えました。私のアプリケーションは、MM_ISOTROPICモードを使用し、ビューの中央に論理(0,0)を使用して出力していました。出力イメージはオフセットされ、正しくスケーリングされませんでした。

かなりの時間を費やした結果、MFCのCDCにある2つのバージョンのデバイスコンテキストで問題が発生する可能性があることがわかりました。最初のDC m_hDCは実際の出力用であり、もう1つはm_hAttribDCはDPIのようなデバイスメトリックを照会するためのものです。私は最終的にやってしまった何を

は、次のようにデバイスコンテキストを調製することであった:

if (pDC->IsPrinting()){ 
    pDC->SetMapMode(MM_ISOTROPIC); 
    pDC->SetViewportOrg(x0, y0); 
    pDC->SetWindowExt(wind_extent, wind_extent); 
    pDC->SetViewportExt(viewport_extent, -viewport_extent); 
} 
else{ 
    ::SetMapMode(pDC->m_hDC, MM_ISOTROPIC); 
    ::SetViewportOrgEx(pDC->m_hDC, x0, y0, NULL); 
    ::SetWindowExtEx(pDC->m_hDC, wind_extent, wind_extent, NULL); 
    ::SetViewportExtEx(pDC->m_hDC, viewport_extent, -viewport_extent, NULL); 
} 

印刷プレビューやメタファイル出力は、その後うまく働きました。

これが役に立ちます。

+0

ご提案いただきありがとうございます。残念ながら、これは私のためには機能しませんでした。 – Fabian

+1

もう少しメタファイルの問題をデバッグするとき、私はあなたからこの文に関連していくつかを見つけました。「出力イメージはオフセットされ、間違ってスケールされました。メタファイルはHORZSIZEデバイスキャップを使用して境界を判断しますが、このサイズは一部のOSバージョンでは間違っていると考えられています(Win7では大きすぎ、Vistaでは小さすぎます)。 また、MS Wordにメタメージを挿入すると、それは面白いことに、既定のスケール(例えば75%)を得ています。上記のバグを補うと思います。そのスケールでは、そこに正しいサイズがあります。 MSが何かを混乱させたように見える。 – Fabian

+0

参照:http://thetweaker.wordpress.com/2011/11/13/reading-monitor-physical-dimensions-orgetting-the-edid-the-right-way/ – Fabian

関連する問題