PhysicalToLogicalPoint 関数 (winuser.h)

ウィンドウ内のポイントの物理座標を論理座標に変換します。

構文

BOOL PhysicalToLogicalPoint(
  [in]      HWND    hWnd,
  [in, out] LPPOINT lpPoint
);

パラメーター

[in] hWnd

型: HWND

変換に変換が使用されるウィンドウへのハンドル。 最上位レベルのウィンドウは完全にサポートされています。 子ウィンドウの場合、親ウィンドウと子ウィンドウの間の重複領域のみが変換されます。

[in, out] lpPoint

種類: LPPOINT

変換する物理座標または画面座標を指定する POINT 構造体へのポインター。 関数が成功すると、新しい論理座標がこの構造体にコピーされます。

戻り値

なし

解説

Windows Vista では、物理座標の概念が導入されています。 デスクトップ ウィンドウ マネージャー (DWM) は、ディスプレイが高 dpi の場合、1 インチあたりのドット数 (dpi) に対応しないウィンドウをスケーリングします。 画面に表示されるウィンドウは、物理的な座標に対応しています。 アプリケーションは引き続き論理空間で動作します。 したがって、アプリケーションのウィンドウビューは、画面に表示されるビューとは異なります。 スケーリングされたウィンドウでは、論理座標と物理座標が異なります。

関数は、 hWnd パラメーターで識別されるウィンドウと POINT 構造体で指定された物理座標を使用して、論理座標を計算します。 論理座標は、プログラムによる方法でアプリケーションに表示される 、スケーリングされていない 座標です。 つまり、論理座標はアプリケーションが認識する座標であり、物理座標とは異なる場合があります。 次に、API は物理座標を論理座標に置き換えます。 新しい座標は、デスクトップ上の原点が (0, 0) の ワールド 座標にあります。 API に渡される座標は hWnd 上にある必要があります。

ソース座標はデバイス単位です。

すべてのプラットフォームで、幅または高さが 0 のウィンドウで PhysicalToLogicalPoint が失敗します。アプリケーションでは、 まず MoveWindow などを呼び出して、0 以外の幅と高さを確立する必要があります。 Windows の一部のバージョン (Windows 7 を含む) では、SH_HIDE を使用して ShowWindow を呼び出した後に MoveWindow が呼び出された場合でも、PhysicalToLogicalPointは失敗します。

Windows 8 では、システム DPI 対応アプリケーションは、PhysicalToLogicalPoint と LogicalToPhysicalPoint を使用して物理空間と論理空間の間で変換します。 Windows 8.1では、システムとプロセス間通信の仮想化が追加されるため、ほとんどのアプリケーションでは、これらの API は必要ありません。 その結果、Windows 8.1では、PhysicalToLogicalPoint と LogicalToPhysicalPoint はポイントを変換しなくなりました。 システムは、独自の座標空間内のアプリケーションへのすべてのポイントを返します。 この動作では、ほとんどのアプリケーションの機能が保持されますが、アプリケーションが期待どおりに動作するように変更を加える必要がある例外がいくつかあります。 このような場合は、PhysicalToLogicalPointForPerMonitorDPILogicalToPhysicalPointForPerMonitorDPI を使用します。

要件

   
サポートされている最小のクライアント Windows Vista [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2008 [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー winuser.h (Windows.h を含む)
Library User32.lib
[DLL] User32.dll
API セット ext-ms-win-ntuser-window-l1-1-1 (Windows 8.1 で導入)