2011年9月11日日曜日

デバイス非依存ピクセル

最近はまった事例を少し。
コンピュータ上でのピクセル表現には、ハードウェアピクセルとデバイス非依存ピクセルの2種類がある。
詳しいことは書かないけど(そもそも厳密に分かってはいない…)、OSの設定でDPI(dot per inch)を変更するとデザインに狂いが生じる可能性があるため、DPIに影響されないピクセル表現としてデバイス非依存ピクセルがあるみたい。
#間違っていたらご指摘下さい
で、Win32API等一昔前のAPIだとハードウェアピクセル、WPF等最近のAPIだとデバイス非依存ピクセルが基本となっている。
それぞれ単独で使う分には問題ないんだけど、相互運用時には少し注意しなければならない。
例えば、Win32APIで座標(100,100)とWPFでの座標(100,100)では結果としてデスクトップ上の異なる座標を指すことがある。
WPFでも96DPIの場合(Windows7では「テキストやその他の項目の大きさの変更」で「小–100% (既定)」を選んでいる場合)には同じ座標を指すことになるけど、その他の設定(96DPI以外)にしている場合には一致しなくなる。
そのため、両者間で橋渡しするためには座標変換が必要になる。
私が利用している基本コードは以下の通り。

// hardwarePointはハードウェアピクセル
Point HardwareToWpf(Point hardwarePoint)
{
    PresentationSource pSource = PresentationSource.FromVisual(Visualオブジェクト);
    CompositionTarget cTarget = pSource.CompositionTarget;
    Matrix hardwareToWpfMatrix = cTarget.TransformFromDevice;
    return hardwareToWpfMatrix.Transform(Point hardwarePoint);
}

ただし、SourceInitialized以降でないときちんと動かないのでご注意を。
参照を増やしたくないからこのような手法を取ってるけど、そうでないならこちらで紹介されている手法の方が理解しやすいかも知れないなぁ。

0 件のコメント:

コメントを投稿