GetDeviceCapsの値が不正

[戻る]
ken 2012/10/23(火) 10:20:14
環境:WindowsXP(SP2) , VisualStudio2010+MFC

初めて参加させて頂きます。宜しくお願いします。

現在、MFCを使ってドローツールを作成しています。
画面に描画される大きさと印刷される大きさが同じになるように
マップモードをMM_HIMETRICとし、内部データも0.01mm単位で持ち、
View描画処理と印刷処理を共通化しています(単位変換を行っていない)。

今、HIMETRICとPIXCELの変換処理にGetDeviceCaps(HORZSIZE OR VERTSIZE)を
使っているのですが、この関数は、ディスプレイ(グラフィックボード)によって
実寸が取得できないことが判明しました。

仕方なく、別の手段としてGetDeviceCaps(LOGPIXELSX OR LOGPIXELSY)や
HIMETRICtoDPなど使用してみたのですが、マップモードをMM_HIMETRICとした場合、
これらの関数と組み合わせると正しく描画できなく困っています。

そこで質問なのですが、この問題を解決するために以下のような方策を考えています。

・View描画処理と印刷処理を共通化を諦めて、内部データはピクセルで持ち、印刷処理で
単位変換する。
・内部データを0.01mm単位のままにして、マップモードをユーザ定義(MM_ANISOTROPIC)
にする。

もっと良い方法があるのでしょうか?
どうすれば一番良いか行き詰ってしまいました。
印刷機能を必要とするドローツールを作成した経験のあるい方がいたら教えて下さい。

宜しくお願い致します。

しま 2012/10/23(火) 12:13:50
>画面に描画される大きさと印刷される大きさが同じになるように
>マップモードをMM_HIMETRICとし、内部データも0.01mm単位で持ち、

1)画面上の大きさとは何を指していますか?
2)印刷することが目的でしょうか?

>今、HIMETRICとPIXCELの変換処理にGetDeviceCaps(HORZSIZE OR VERTSIZE)を
>使っているのですが、この関数は、ディスプレイ(グラフィックボード)によって
>実寸が取得できないことが判明しました。
の意味が不明です。
3)実寸とは
  ピクセル数のことでしょうか?
  mm単位の長さなのでしょうか?

幾つか不明な点がありますが、私なりの考えを述べます。
印刷することが主眼のアプリケーションなら、用紙の印刷可能領域内に
描画対象については、描画単位系で位置を記録すればよいと考えます。
画面上のピクセル単位の位置情報は元の位置情報に基づいて描画した結果だと
私なら捉えます。

ken 2012/10/23(火) 13:03:29
しま様
説明が足りず申し訳ありませでした。

>>画面に描画される大きさと印刷される大きさが同じになるように
>>マップモードをMM_HIMETRICとし、内部データも0.01mm単位で持ち、
>
>1)画面上の大きさとは何を指していますか?
↓
テレビのスクリーンに表示される長さ(mm)です。

>2)印刷することが目的でしょうか?
↓
はい。画面に表示した内容を印刷したいと考えています。

>
>>今、HIMETRICとPIXCELの変換処理にGetDeviceCaps(HORZSIZE OR VERTSIZE)を
>>使っているのですが、この関数は、ディスプレイ(グラフィックボード)によって
>>実寸が取得できないことが判明しました。
>の意味が不明です。
>3)実寸とは
>  ピクセル数のことでしょうか?
>  mm単位の長さなのでしょうか?
↓
mm単位の長さです。

>
>幾つか不明な点がありますが、私なりの考えを述べます。
>印刷することが主眼のアプリケーションなら、用紙の印刷可能領域内に
>描画対象については、描画単位系で位置を記録すればよいと考えます。
>画面上のピクセル単位の位置情報は元の位置情報に基づいて描画した結果だと
>私なら捉えます。

現在、マップモードを変えて試行錯誤していますが、
やりたいことを整理し直したいと思います。
ご回答有難うございました。

ken 2012/10/23(火) 18:51:42
[[解決]]
以下の修正で思ったとおり表示できるようになりましたました。

・マップモードをMM_HIMETRICからMM_ANISOTROPICにし、
 SetWindowExt()とSetViewportExt()を使って任意のスケールを指定する。
・ピクセルとmmの変換には、GetDeviceCaps()のLOGPIXELSX、LOGPIXELSYを使用する。

とりあえず解決とさせて頂きます。有難うございました。

ロマ 2012/10/23(火) 18:56:27
私は、内部データはdouble[m]、描画の単位は0.01[mm]、マッピングモードは
MM_ANISOTROPICにしています。印刷でも拡大縮小が必要な場合があったからでした。
画面の場合は、論理インチ(LOGPIXELSX/Y)を基本にしていますが、図全体がウィンドウ
に収まるようなスケールも用意しています(いずれでもズームできるようにしていま
す)。

画面で論理インチを採用している理由は、多くのアプリケーションに従ったためです(メ
モ帳のフォントは論理インチで表示されます)。
ここらの詳細は下記をご覧ください。
http://rarara.cafe.coocan.jp/cgi-bin/lng/vc/vclng.cgi?print+201002/10020010.txt

古いスレッドには追加発言できません。