From 7fe83417f103b82f7d885910924141c9996d1d38 Mon Sep 17 00:00:00 2001
From: kgv <kgv@opencascade.com>
Date: Mon, 17 Dec 2012 12:44:37 +0400
Subject: [PATCH] 0023628: Snapshots have wrong dimension when OCCT is built by
 VC++ 11

Use AdjustWindowRect() function to adjust window rectangle instead of
manual GetSystemMetrics().
---
 src/Draw/Draw_Window.cxx | 23 +++++++++++-----------
 src/WNT/WNT_Window.cxx   | 42 +++++++++++++++++++++++-----------------
 2 files changed, 36 insertions(+), 29 deletions(-)

diff --git a/src/Draw/Draw_Window.cxx b/src/Draw/Draw_Window.cxx
index c3d778abf1..8710e735dd 100755
--- a/src/Draw/Draw_Window.cxx
+++ b/src/Draw/Draw_Window.cxx
@@ -18,11 +18,6 @@
 // purpose or non-infringement. Please see the License for the specific terms
 // and conditions governing the rights and limitations under the License.
 
-// Updated by DPF Fri Mar 21 18:40:58 1997
-//              Added casting in void to compile
-//              on AO1 int 32 bits -> pointer 64 bits ????
-// Robert Boehne 30 May 2000 : Dec Osf
-
 // include windows.h first to have all definitions available
 #ifdef WNT
 #include <windows.h>
@@ -1474,13 +1469,19 @@ void DrawWindow::Init(Standard_Integer theXLeft, Standard_Integer theYTop,
 
   // include decorations in the window dimensions
   // to reproduce same behaviour of Xlib window.
-  theXLeft   -= GetSystemMetrics(SM_CXSIZEFRAME);
-  theYTop    -= GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CYCAPTION);
-  theWidth   += 2 * GetSystemMetrics(SM_CXSIZEFRAME);
-  theHeight  += 2 * GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CYCAPTION);
+  DWORD aWinStyle   = GetWindowLongPtr (win, GWL_STYLE);
+  DWORD aWinStyleEx = GetWindowLongPtr (win, GWL_EXSTYLE);
+  HMENU aMenu       = GetMenu (win);
 
-  SetPosition (theXLeft, theYTop);
-  SetDimension (theWidth, theHeight);
+  RECT aRect;
+  aRect.top    = theYTop;
+  aRect.bottom = theYTop + theHeight;
+  aRect.left   = theXLeft;
+  aRect.right  = theXLeft + theWidth;
+  AdjustWindowRectEx (&aRect, aWinStyle, aMenu != NULL ? TRUE : FALSE, aWinStyleEx);
+
+  SetPosition  (aRect.left, aRect.top);
+  SetDimension (aRect.right - aRect.left, aRect.bottom - aRect.top);
   // Save the pointer at the instance associated to the window
   SetWindowLong(win, CLIENTWND, (LONG)this);
   HDC hDC = GetDC(win);
diff --git a/src/WNT/WNT_Window.cxx b/src/WNT/WNT_Window.cxx
index 134e1e6427..8c617da8a9 100755
--- a/src/WNT/WNT_Window.cxx
+++ b/src/WNT/WNT_Window.cxx
@@ -119,15 +119,18 @@ WNT_Window::WNT_Window (const Handle(WNT_GraphicDevice)& theDevice,
     dwStyle |= WS_CLIPCHILDREN;
   }
 
-  if (dwStyle & WS_OVERLAPPEDWINDOW)
-  {
-    // include decorations in the window dimensions
-    // to reproduce same behaviour of Xw_Window.
-    aXLeft   -= GetSystemMetrics(SM_CXSIZEFRAME);
-    aYTop    -= GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CYCAPTION);
-    aXRight  += GetSystemMetrics(SM_CXSIZEFRAME);
-    aYBottom += GetSystemMetrics(SM_CYSIZEFRAME);
-  }
+  // include decorations in the window dimensions
+  // to reproduce same behaviour of Xw_Window.
+  RECT aRect;
+  aRect.top    = aYTop;
+  aRect.bottom = aYBottom;
+  aRect.left   = aXLeft;
+  aRect.right  = aXRight;
+  AdjustWindowRect (&aRect, dwStyle, theMenu != NULL ? TRUE : FALSE);
+  aXLeft   = aRect.left;
+  aYTop    = aRect.top;
+  aXRight  = aRect.right;
+  aYBottom = aRect.bottom;
 
   myHWindow = CreateWindow (
               myWClass->Name(),                 // window's class name
@@ -198,15 +201,18 @@ WNT_Window::WNT_Window (const Handle(WNT_GraphicDevice)& theDevice,
     dwStyle |= WS_CLIPCHILDREN;
   }
 
-  if (dwStyle & WS_OVERLAPPEDWINDOW)
-  {
-    // include decorations in the window dimensions
-    // to reproduce same behaviour of Xw_Window.
-    aXLeft   -= GetSystemMetrics(SM_CXSIZEFRAME);
-    aYTop    -= GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CYCAPTION);
-    aXRight  += GetSystemMetrics(SM_CXSIZEFRAME);
-    aYBottom += GetSystemMetrics(SM_CYSIZEFRAME);
-  }
+  // include decorations in the window dimensions
+  // to reproduce same behaviour of Xw_Window.
+  RECT aRect;
+  aRect.top    = aYTop;
+  aRect.bottom = aYBottom;
+  aRect.left   = aXLeft;
+  aRect.right  = aXRight;
+  AdjustWindowRect (&aRect, dwStyle, theMenu != NULL ? TRUE : FALSE);
+  aXLeft   = aRect.left;
+  aYTop    = aRect.top;
+  aXRight  = aRect.right;
+  aYBottom = aRect.bottom;
 
   myHWindow = CreateWindow (
               myWClass->Name(),                 // window's class name