一応、CDC::DPtoHIMETRIC から物理解像度を得られるだろうと
思っていたコードはこんな感じです。
(画面のプロパティで設定される解像度とは違います)
#コンパイル通らなかったらごめん。
CDC dc;
dc.CreateDC(_T(DISPLAY), NULL, NULL, NULL);
dc.SetMapMode(MM_HIMETRIC);
CSize size(100, 100);
dc.DPtoHIMETRIC(&size);
ATLTRACE2(_T(%d), MulDiv(100, 2540, size.cx));
CDC::GetDeviceCapsで取得する方法や
MM_TEXTで計算した場合には画面のピクセル数の設定を変えても
常に96DPIが得られるけど、上記の方法なら異なるはずです。
実際にディスプレイサイズを測って比べたわけではないので
この値が正確なものかどうかはわかりませんが。。。
subaruさん、PATIOさん、レスありがとうございます。
aetosさんから紹介されたHPをみると、MSDNのマニュアルでは、できそうに書いて
いますが、実際には、なかなかむずかしくなりそうなことが書いてあります。
以下の記述が要点で・・・
> Windowsはこれを96DPIだと勝手に決め付ける。
> GetDeviceCapsにHORZSIZE、VERTSIZEを渡せば取得できそうに見えるが、これはデタラ
メな値しか返さないので使えない。
とかかれています。これは、ディスプレイにディスプレイ仕様を応答する機能がないん
ですが、MSDNには、できるように書かれているという、事実に会うお話だとおもい
ます。
もし試せる方がいたら、GetMonitorDisplayAreaSize っていう関数がどんな結果を返す
か検証してほしいです。
http://msdn.microsoft.com/en-us/library/dd692944.aspx
>もし試せる方がいたら、GetMonitorDisplayAreaSize っていう関数がどんな結果を返す
>か検証してほしいです。
>
> http://msdn.microsoft.com/en-us/library/dd692944.aspx
GetMonitorCapabilities で MC_CAPS_DISPLAY_AREA_SIZE が返らず断念。
>検索したらこんなの見つけました。
> http://www.wankuma.com/seminar/20080126tokyo16/3.pdf
私の示した計算方法はこのページに出てくる
1インチ= GetDeviceCaps(hdc, HORZRES) / (GetDeviceCaps(hdc, HORZSIZE) / 25.4)
と同じ結果になってしまうようでした。
どうやら HORZSIZE が正確でないのと同じ理由でダメみたいです。
ちなみに WPF ならもしかしてどんな環境でも正方形になるのか?とも思い、
2Dと3Dの表示でそれぞれ試してみましたが、ディスプレイモードの設定で
やはり縦横比は変わってしまうようでした。
え~と
なんか難しい話になってるようですが、気になるのはスレ主さんの
>描画する正方形(100pixelx100pixel)に、(なにか絵を正方形に描くとか・・
>して)上下関係がある場合、90度回すと違う形になってしまいますね。
>なにか対策は、ないのでしょうか?
の部分ですね。
ちゃんと浮動少数点で演算し、整数に代入時に四捨五入すれば
座標値はそんなことにはなりません。
MM_TEXTの状態で、かつ座標値が正しければ、
プログラマが他にやるべきことはあまりありません。
このあたりはどうでしょう。
モニタ毎にドライバがあれば良いのでしょうけれど、
実際にはグラフィックボード毎にしかドライバが無いので
モニタの情報がOS側で取り込めないのですよね。
一応、モニタの種類を設定できるようにはなっているみたいなんですけどねぇ。
aetosさんが紹介してくれたURLの内容にもあるように
DPIの値を正確にする方向で考えてしまうとユーザーの手助けが必要になるでしょうね。
ある程度設定で逃げるしかないかもしれませんね。
本題に立ち返ると…
デフォルトの MM_TEXT モードでも、モニタの表示領域とデスクトップのピクセル数のア
スペクト比が異なれば、ピクセルは正方形でなくなるでしょうね。
あとは、そのような事態を想定してプログラムを組むのかどうか、つまり、モニタの大
きさやデスクトップの設定に依存せず、常に正方形に見えるように描く必要があるのか
否か、が争点ですか。
プログラムから API に渡す値として縦と横を同じにすれば、正方形が描かれているもの
としてよいかどうか。
> モニタの情報がOS側で取り込めないのですよね。
取り込むための規格と API はあります。
モニタが対応しているかどうかは別問題ですが。
そもそもの話として
雑談:
上司「昔は画面上での1ピクセルは、縦横サイズが違ったんだよねー」
(だってディスプレイって4:3で横長なんだもん)
部下「ふーん」
という単なる雑談だったのか
命令指示:
上司:「ヘイ糞ども、どんなディスプレイアダプタでもどんなディスプレイでも、
画面上の線分を定規で実測して常に正方形になるようなソフトを作れ」
部下:「サー、イエッサー」
という命令だったのか
俺たち読者にはわからんのだよなー
前者なのだったら気にする必要はないし
後者なのだったら、それは「練習課題」にするにはヘヴィすぎるんぢゃないかなー
とか思う今日子の頃
まあ外野は好きなように盛り上がっていればそれでいいので気楽なもんですわ
雑談の続き・・・
>上司「昔は画面上での1ピクセルは、縦横サイズが違ったんだよねー」
自分が知っている限りで、かつパソコンに限ると、
PC8001の擬似グラフィックモードがそうだったかも・・・
ぐらいしか思いつきません。
ベーシックマスターもFM-7/8もMZもMSXも全部1:1だったような
気のせいがします。
ミッキー比が変なマウスはあったんですけどね(vv;)。
aetosさん、subaruさん、仲澤@失業者 さん、tetrapod さん、PATIO さん、レス
ありがとうございます。
いつもお世話になってる蒼々たる面々ですね。
> subaru さん、
検証ありがとうございました。
>仲澤@失業者さん、
グラフィックアニメーションで正方形の中に絵を描くと多少縦長になりますよね。
90度回すと多少横長になってしまって、絵の感じがかわってしまうと、同じ絵が回っ
てるような感じにならないのでは・・・とおもったのですが、実際には、それほど、縦
長、横長にならないので、気にしないのがいいのかもと、みなさんのお答えを聞いて思
っているところです。
> PATIO さん
いつもありがとうございます。まさに知りたいのはそこのところでした。
マニュアルを読んでると、できるかも知れないという気になってくるし・・・
> aetosさん
いつもありがとうございます。PATIOさんと同じような返事になってしまいます
が、いつも的確なレスありがとうございます。
まず、実現可能?ということが一番大事ですし、マニュアルを読んでると、ひょっとし
て、アスペクト比を意識しないでコーディングできるようになってる?のかなとも思え
てきます。だってピクセル単位でなく、mm単位で座標を設定できるみたいだし・・
貴重なレスありがとうございました。
> tetrapod さん
いつもありがとうございます。
> 上司「昔は画面上での1ピクセルは、縦横サイズが違ったんだよねー」
のほうが近い感じです。そこから、それだったら、グラフィックアニメーションは、ど
うしてるの?って私が、たぐってしまいました。
上司の方と交流すべしと思い、書き込みを控えていましたが、
解決しましたので、以下雑感。
>> 上司「昔は画面上での1ピクセルは、縦横サイズが違ったんだよねー」
>のほうが近い感じです。そこから、それだったら、グラフィックアニメーションは、ど
>うしてるの?って私が、たぐってしまいました。
私としては、MM_TEXTで補正なしに正方形を描くのはNGです。
ASPECTX CGA Petzoldで検索してみてください。
CGA(640 x 200),EGA(640 x 350)下で16bitWindowsと格闘したらしい上司は貴重です。
-----------------------------
論理インチのDPIは、LOGPIXELSX/LOGPIXELSYで得られるものです。
物理インチのDPIは、HORZSIZEとHORZRES/VERTSIZEとVERTRESで得られるものです。
どちらを使うかは、設計上の方針です。場合によっては混合しても良いです。
物理インチの計算にはDCかICを使うか、あるいはMulDivを使うべきです。
または、MM_HIMETRICなど Metric Mapping Modeから求めても良いです。
> CGA(640 x 200),EGA(640 x 350)下で16bitWindowsと格闘したらしい上司は貴重です。
もっと(日本では)メジャーなところでは、
NECのPC-9801シリーズが640x400を4:3ディスプレイに表示してました。
×「蒼々たる」
○「錚々たる」