GDI /GDI+ を使用して GUI を描画する方法を学んで います。すべてのアプリケーションがその計算を行うため、適切に表示できるようになりますか?
ウィンドウ上のボタン、画像、およびすべてのコントロールのクライアント座標を計算して、異なる解像度で同じ位置に配置する方法を誰かが説明できますか?
前もって感謝します。
GDI では、GetDeviceCaps
関数とLOGPIXELSX
を使用LOGPIXELSY
して DPI を検索し、これらの値を使用してサイズをスケーリングできます。
HDC hdc = GetDC(hwnd);
int ppix = GetDeviceCaps(hdc, LOGPIXELSX);
int ppiy = GetDeviceCaps(hdc, LOGPIXELSY);
ReleaseDC(hdc);
// for a control that is 1.5 inches wide and 0.5 inches high.
int ctrl_width = int(1.5 * ppix + 0.5);
int ctrl_height = int(0.5 * ppiy + 0.5);
// for a button that conforms to Microsoft's UI guidelines of 75x23 @ 96dpi.
int btn_width = (75 * ppix + 48) / 96;
int btn_height = (23 * ppiy + 48) / 96;
GDI+ はこれをかなり簡単にします:
Graphics g;
g.SetPageUnit(UnitInch);
// now you can specify draw coordinates in inches
// and it'll figure out DPI for you.
GDI+ ソリューションは、GDI 呼び出しやコントロールの座標ではなく、GDI+ 描画呼び出しにのみ影響することに注意してください。
dpi 認識を無視すると、すぐに苦痛になり始めます。ディスプレイ技術は非常に長い間 96 dpi にとどまっており、すでに 20 年も経過しています。自動 dpi スケーリングと非常にアクセスしやすい「定規」アプレットを備えた Vista は、ゲーム チェンジャーでした。「Retina」ディスプレイを推進している Apple が、真の推進力です。次の Apple MacBook には 2880 x 1800 のディスプレイが搭載されています。通常の 1024 x 768 のウィンドウは、そのようなディスプレイでは郵便切手になります。
自動化するためのツールはすぐに利用でき、XAML ベースのクラス ライブラリ (WPF、Silverlight、Metro) は完全に解像度に依存しません。HTML と Winforms の自動スケーリングはかなりうまくいきます。もちろん、GDI の助けにはなりません。そして、User32 にはまったく何もなく、ピクセルランドにしっかりと立ち往生しています。あなたは確かにコードを書くことができますが、それは書くのが楽しいコードではありません. 従来の理由で生の API をまだプログラミングしている場合は、Vista 以降に組み込まれている自動スケーリングが魅力的です。まあ、努力を減らすために、それはあまり魅力的に見えません:)