10

このMSDNガイドを使用して、アプリケーションをDPIセンシティブにする作業を行っています。スケーリングの手法では、デバイスコンテキストのXおよびY論理ピクセルを使用します。

int _dpiX = 96, _pdiY = 96;   
HDC hdc = GetDC(NULL);
if (hdc)
{
    _dpiX = GetDeviceCaps(hdc, LOGPIXELSX);
    _dpiY = GetDeviceCaps(hdc, LOGPIXELSY);
    ReleaseDC(NULL, hdc);
}

次に、を使用してX座標とY座標をスケーリングできます

int ScaleX(int x) { return MulDiv(x, _dpiX, 96); }
int ScaleY(int y) { return MulDiv(y, _dpiY, 96); }

モニターに対して異なる数値を返す状況はありGetDeviceCaps(hdc, LOGPIXELSX)ますか。GetDeviceCaps(hdc, LOGPIXELSY)私が本当に心配している唯一のデバイスはモニターですが、個別ScaleX(int x)ScaleY(int y)機能が必要ですか?Scale(int px)1つの関数だけを使用できますか?これを行うことにはマイナス面がありますか?

助けてくれてありがとう。

4

2 に答える 2

10

理論的には可能ですが、正方形以外のピクセルを使用する最近のモニターは知りません。正方形ピクセルには非常に多くの利点があり、既存のソフトウェアの多くは正方形ピクセルを前提としているため、主流のモニターが非正方形ピクセル モードで登場する可能性は低いと思われます。

多くの場合、正方形以外のピクセルのモニターを使用ている場合は、変換を適用して、正方形のピクセルがあるように見せることができます (たとえば、マッピング モードを設定することにより)。

とはいえ、プリンタのデバイス ユニットが正方形でないことはよくあることです。それらの多くは、一方の次元が他方の次元よりもはるかに高い解像度を持っています。一部のドライバーは、この解像度を呼び出し元が利用できるようにします。正方形のピクセルがあるように見せるものもあります。印刷用にコードを再利用したい場合は、水平方向と垂直方向のスケーリングを混同しないことをお勧めします。

于 2012-05-04T16:20:53.253 に答える