Author: gadamopoulos
Date: Sun May 22 15:47:47 2011
New Revision: 51848

URL: http://svn.reactos.org/svn/reactos?rev=51848&view=rev
Log:
[uxtheme]
- Implement handling WM_NCHITTEST

Modified:
    branches/GSoC_2011/ThemesSupport/dll/win32/uxtheme/nonclient.c

Modified: branches/GSoC_2011/ThemesSupport/dll/win32/uxtheme/nonclient.c
URL: 
http://svn.reactos.org/svn/reactos/branches/GSoC_2011/ThemesSupport/dll/win32/uxtheme/nonclient.c?rev=51848&r1=51847&r2=51848&view=diff
==============================================================================
--- branches/GSoC_2011/ThemesSupport/dll/win32/uxtheme/nonclient.c [iso-8859-1] 
(original)
+++ branches/GSoC_2011/ThemesSupport/dll/win32/uxtheme/nonclient.c [iso-8859-1] 
Sun May 22 15:47:47 2011
@@ -7,6 +7,7 @@
  */
  
 #include <windows.h>
+#include <windowsx.h>
 #include "undocuser.h"
 #include "vfwmsgs.h"
 #include "uxtheme.h"
@@ -47,6 +48,12 @@
     BUTTON_DISABLED ,
     BUTTON_INACTIVE
 } THEME_BUTTON_STATES;
+
+#define HASSIZEGRIP(Style, ExStyle, ParentStyle, WindowRect, ParentClientRect) 
\
+            ((!(Style & WS_CHILD) && (Style & WS_THICKFRAME) && !(Style & 
WS_MAXIMIZE))  || \
+             ((Style & WS_CHILD) && (ParentStyle & WS_THICKFRAME) && 
!(ParentStyle & WS_MAXIMIZE) && \
+             (WindowRect.right - WindowRect.left == ParentClientRect.right) && 
\
+             (WindowRect.bottom - WindowRect.top == ParentClientRect.bottom)))
 
 #define HAS_MENU(hwnd,style)  ((((style) & (WS_CHILD | WS_POPUP)) != WS_CHILD) 
&& GetMenu(hwnd))
 
@@ -640,6 +647,228 @@
 
     if (Pressed)
         SendMessageW(hWnd, WM_SYSCOMMAND, SCMsg, 0);
+}
+
+
+static LRESULT
+DefWndNCHitTest(HWND hWnd, POINT Point)
+{
+    RECT WindowRect;
+    POINT ClientPoint;
+    WINDOWINFO wi;
+
+    GetWindowInfo(hWnd, &wi);
+
+    if (!PtInRect(&wi.rcWindow, Point))
+    {
+        return HTNOWHERE;
+    }
+    WindowRect = wi.rcWindow;
+
+    if (UserHasWindowEdge(wi.dwStyle, wi.dwExStyle))
+    {
+        LONG XSize, YSize;
+
+        InflateRect(&WindowRect, -(int)wi.cxWindowBorders, 
-(int)wi.cyWindowBorders);
+        XSize = GetSystemMetrics(SM_CXSIZE) * GetSystemMetrics(SM_CXBORDER);
+        YSize = GetSystemMetrics(SM_CYSIZE) * GetSystemMetrics(SM_CYBORDER);
+        if (!PtInRect(&WindowRect, Point))
+        {
+            BOOL ThickFrame;
+
+            ThickFrame = (wi.dwStyle & WS_THICKFRAME);
+            if (Point.y < WindowRect.top)
+            {
+                if(wi.dwStyle & WS_MINIMIZE)
+                    return HTCAPTION;
+                if(!ThickFrame)
+                    return HTBORDER;
+                if (Point.x < (WindowRect.left + XSize))
+                    return HTTOPLEFT;
+                if (Point.x >= (WindowRect.right - XSize))
+                    return HTTOPRIGHT;
+                return HTTOP;
+            }
+            if (Point.y >= WindowRect.bottom)
+            {
+                if(wi.dwStyle & WS_MINIMIZE)
+                    return HTCAPTION;
+                if(!ThickFrame)
+                    return HTBORDER;
+                if (Point.x < (WindowRect.left + XSize))
+                    return HTBOTTOMLEFT;
+                if (Point.x >= (WindowRect.right - XSize))
+                    return HTBOTTOMRIGHT;
+                return HTBOTTOM;
+            }
+            if (Point.x < WindowRect.left)
+            {
+                if(wi.dwStyle & WS_MINIMIZE)
+                    return HTCAPTION;
+                if(!ThickFrame)
+                    return HTBORDER;
+                if (Point.y < (WindowRect.top + YSize))
+                    return HTTOPLEFT;
+                if (Point.y >= (WindowRect.bottom - YSize))
+                    return HTBOTTOMLEFT;
+                return HTLEFT;
+            }
+            if (Point.x >= WindowRect.right)
+            {
+                if(wi.dwStyle & WS_MINIMIZE)
+                    return HTCAPTION;
+                if(!ThickFrame)
+                    return HTBORDER;
+                if (Point.y < (WindowRect.top + YSize))
+                    return HTTOPRIGHT;
+                if (Point.y >= (WindowRect.bottom - YSize))
+                    return HTBOTTOMRIGHT;
+                return HTRIGHT;
+            }
+        }
+    }
+    else
+    {
+        if (wi.dwExStyle & WS_EX_STATICEDGE)
+            InflateRect(&WindowRect, -GetSystemMetrics(SM_CXBORDER),
+                                     -GetSystemMetrics(SM_CYBORDER));
+        if (!PtInRect(&WindowRect, Point))
+            return HTBORDER;
+    }
+
+    if ((wi.dwStyle & WS_CAPTION) == WS_CAPTION)
+    {
+        if (wi.dwExStyle & WS_EX_TOOLWINDOW)
+            WindowRect.top += GetSystemMetrics(SM_CYSMCAPTION);
+        else
+            WindowRect.top += GetSystemMetrics(SM_CYCAPTION);
+
+        if (!PtInRect(&WindowRect, Point))
+        {
+
+            INT ButtonWidth;
+
+            if (wi.dwExStyle & WS_EX_TOOLWINDOW)
+                ButtonWidth = GetSystemMetrics(SM_CXSMSIZE);
+            else
+                ButtonWidth = GetSystemMetrics(SM_CXSIZE);
+
+            ButtonWidth -= 4;
+            ButtonWidth+= BUTTON_GAP_SIZE;
+
+            if (wi.dwStyle & WS_SYSMENU)
+            {
+                if (wi.dwExStyle & WS_EX_TOOLWINDOW)
+                {
+                    WindowRect.right -= ButtonWidth;
+                }
+                else
+                {
+                    if(!(wi.dwExStyle & WS_EX_DLGMODALFRAME))
+                        WindowRect.left += ButtonWidth;
+                    WindowRect.right -= ButtonWidth;
+                }
+            }
+            if (Point.x < WindowRect.left)
+                return HTSYSMENU;
+            if (WindowRect.right <= Point.x)
+                return HTCLOSE;
+            if (wi.dwStyle & WS_MAXIMIZEBOX || wi.dwStyle & WS_MINIMIZEBOX)
+                WindowRect.right -= ButtonWidth;
+            if (Point.x >= WindowRect.right)
+                return HTMAXBUTTON;
+            if (wi.dwStyle & WS_MINIMIZEBOX)
+                WindowRect.right -= ButtonWidth;
+            if (Point.x >= WindowRect.right)
+                return HTMINBUTTON;
+            return HTCAPTION;
+        }
+    }
+
+    if(!(wi.dwStyle & WS_MINIMIZE))
+    {
+        HMENU menu;
+
+        ClientPoint = Point;
+        ScreenToClient(hWnd, &ClientPoint);
+        GetClientRect(hWnd, &wi.rcClient);
+
+        if (PtInRect(&wi.rcClient, ClientPoint))
+        {
+            return HTCLIENT;
+        }
+
+        if ((menu = GetMenu(hWnd)) && !(wi.dwStyle & WS_CHILD))
+        {
+            if (Point.x > 0 && Point.x < WindowRect.right && ClientPoint.y < 0)
+                return HTMENU;
+        }
+
+        if (wi.dwExStyle & WS_EX_CLIENTEDGE)
+        {
+            InflateRect(&WindowRect, -2 * GetSystemMetrics(SM_CXBORDER),
+                        -2 * GetSystemMetrics(SM_CYBORDER));
+        }
+
+        if ((wi.dwStyle & WS_VSCROLL) && (wi.dwStyle & WS_HSCROLL) &&
+            (WindowRect.bottom - WindowRect.top) > 
GetSystemMetrics(SM_CYHSCROLL))
+        {
+            RECT ParentRect, TempRect = WindowRect, TempRect2 = WindowRect;
+            HWND Parent = GetParent(hWnd);
+
+            TempRect.bottom -= GetSystemMetrics(SM_CYHSCROLL);
+            if ((wi.dwExStyle & WS_EX_LEFTSCROLLBAR) != 0)
+                TempRect.right = TempRect.left + 
GetSystemMetrics(SM_CXVSCROLL);
+            else
+                TempRect.left = TempRect.right - 
GetSystemMetrics(SM_CXVSCROLL);
+            if (PtInRect(&TempRect, Point))
+                return HTVSCROLL;
+
+            TempRect2.top = TempRect2.bottom - GetSystemMetrics(SM_CYHSCROLL);
+            if ((wi.dwExStyle & WS_EX_LEFTSCROLLBAR) != 0)
+                TempRect2.left += GetSystemMetrics(SM_CXVSCROLL);
+            else
+                TempRect2.right -= GetSystemMetrics(SM_CXVSCROLL);
+            if (PtInRect(&TempRect2, Point))
+                return HTHSCROLL;
+
+            TempRect.top = TempRect2.top;
+            TempRect.bottom = TempRect2.bottom;
+            if(Parent)
+                GetClientRect(Parent, &ParentRect);
+            if (PtInRect(&TempRect, Point) && HASSIZEGRIP(wi.dwStyle, 
wi.dwExStyle,
+                      GetWindowLongW(Parent, GWL_STYLE), wi.rcWindow, 
ParentRect))
+            {
+                if ((wi.dwExStyle & WS_EX_LEFTSCROLLBAR) != 0)
+                    return HTBOTTOMLEFT;
+                else
+                    return HTBOTTOMRIGHT;
+            }
+        }
+        else
+        {
+            if (wi.dwStyle & WS_VSCROLL)
+            {
+                RECT TempRect = WindowRect;
+
+                if ((wi.dwExStyle & WS_EX_LEFTSCROLLBAR) != 0)
+                    TempRect.right = TempRect.left + 
GetSystemMetrics(SM_CXVSCROLL);
+                else
+                    TempRect.left = TempRect.right - 
GetSystemMetrics(SM_CXVSCROLL);
+                if (PtInRect(&TempRect, Point))
+                    return HTVSCROLL;
+            } 
+            else if (wi.dwStyle & WS_HSCROLL)
+            {
+                RECT TempRect = WindowRect;
+                TempRect.top = TempRect.bottom - 
GetSystemMetrics(SM_CYHSCROLL);
+                if (PtInRect(&TempRect, Point))
+                    return HTHSCROLL;
+            }
+        }
+    }
+
+    return HTNOWHERE;
 }
 
 LRESULT CALLBACK 
@@ -669,6 +898,13 @@
             default:
                 return DefWndProc(hWnd, Msg, wParam, lParam);
         }
+    case WM_NCHITTEST:
+    {
+        POINT Point;
+        Point.x = GET_X_LPARAM(lParam);
+        Point.y = GET_Y_LPARAM(lParam);
+        return DefWndNCHitTest(hWnd, Point);
+    }
     default:
         return DefWndProc(hWnd, Msg, wParam, lParam);
     }


Reply via email to