WinXP(SP2) + VC6.0
MFC:スタティックライブラリを使用
お世話になります。初心者ですので拙い質問で申し訳ありません。
私はVBから制御して
EMF(エンハンスドメタファイル)を作製するOCXを上記環境で作成しました。
このOCXは,Win95/98/2000/XP(SP2)で問題なく動作していたのですが,
XP(SP2)の一部機種(比較的新しい機種)およびWindowsVistaで,
作製されるEMFの大きさと縦横比が変わりました。
現状ではEMFを作製するときに
SetMapModeでMM_ANISOTROPICを指定し,
ディスプレイの解像度に合わせて
SetWindowExtで縦横比を調整しているのですが,
新しい仕様?ではx方向の解像度のみを考慮し,
SetWindowExtでは縦横比を1:1にしなくてはならないようです。
この仕様がVista固有のものであればOSのバージョンを見て
場合分けをすれば良いのですが,
XP(SP2)の場合はPCによって結果が異なるので,
場合分けができない状況です。
何か良い知恵があったらご教示願います。お願いします。
#上記記述に間違いがありました。
#Win95/98では私作のOCXは動作しません。
どうやら,OSの内部的な処理の仕様が変わっている模様です。
Win2000,WinXPの旧機種では
GetDeviceCaps(HORZSIZE)=320 , GetDeviceCaps(VERTSIZE)=240
で(ディスプレイの大きさや解像度の設定に関わらず)戻り値が固定だったのが,
WinXPの新機種,WinVistaの場合はGetDeviceCaps関数の戻り値が
実際のディスプレイの大きさや解像度の設定に依存して変化する模様です。
この仕様変更と共に,SetWindowExt関数の動作も変更されたようです。
未調査ですが,他にも動作が変更された関数があるのではないかと思います。
とりあえず,旧機種では物理ディスプレイの大きさが320×240固定という点に
着目して処理を分けようかと思っています。
ただ,新機種のPCで320×240が戻り値となった場合の処理は考えねばなりません。
この辺をもっと確実に場合分けするお知恵がありましたらご教示願います。
なんとなくだが Vista で AERO=OFF にしたらどうなるかとか
その辺が気になったけどテストマシンも情報も無いな・・・
AERO=OFF では (320,240) になったりする可能性がありそう
VistaにてAERO=Offにしてみましたが,
GetDeviceCaps(HORZSIZE) , GetDeviceCaps(VERTSIZE)の戻り値は
AERO=On の時と同じでした。
なお,Vistaだけでなく,XP(SP2)でも(320,240)になるPCとならないPCがあります。
これは,
1)OSのマイナーなバージョンの違いのせい(DLL地獄的なもの?)
2)OSの設定の違いのせい(出荷時の初期設定が変わった)
3)PC側でなくディスプレイの能力の違いのせい
のどれかかなぁと今のところ思っています。
どれが原因にしろ,デバイスコンテキストまわりの関数は軒並み怪しげだなという気が
します。
どの関数がどんな影響を受けているのか全て把握したいところです。
引き続き,情報お待ちいたしております。宜しくお願いします。
旧仕様のXPパソコンとVistaのパソコンのディスプレイを交換して調べましたが,
GetDeviceCaps(HORZSIZE) , GetDeviceCaps(VERTSIZE)の戻り値は
ディスプレイでなくパソコンに依存する模様です。
上記3)の線はないものと思われます。
このスレタイは適切なものではないと思われるので,いったん「解決」として別のスレ
を立てようかと思います。
いまいち状況を把握できていないのですが。
EnhancedMetaHeaderのWidthDevPixels, HeightDevPixelsとかで
判断できないものカナ・・・
それらの値がHORZSIZE, VERTSIZEのそれぞれと等しいかどうかで
処理を分けるとか。
>玲音 (st.lain)様
すみません,このスレは[解決]にしてしまったので,
もう少し下調べをしてから日にちをおいて改めてスレ立て致します。
ご助言に関しては,調査し,有効であった場合はこのスレに追記させていただきます。