better handling of caption buttons
authorThomas Bluemel <thomas@reactsoft.com>
Sat, 6 Sep 2003 14:30:21 +0000 (14:30 +0000)
committerThomas Bluemel <thomas@reactsoft.com>
Sat, 6 Sep 2003 14:30:21 +0000 (14:30 +0000)
svn path=/trunk/; revision=5999

reactos/lib/user32/windows/defwnd.c

index d6ff41f..72c786c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: defwnd.c,v 1.76 2003/08/31 14:25:28 rcampbell Exp $
+/* $Id: defwnd.c,v 1.77 2003/09/06 14:30:21 weiden Exp $
  *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS user32.dll
@@ -861,6 +861,71 @@ DefWndHitTestNC(HWND hWnd, POINT Point)
   return(HTNOWHERE);
 }
 
+VOID STATIC
+DefWndDoButtonHandle(HWND hWnd, WPARAM wParam)
+{
+  MSG Msg;
+  BOOL InBtn = TRUE, HasBtn = FALSE;
+  ULONG Btn;
+  WPARAM SCMsg, CurBtn = wParam, OrigBtn = wParam;
+  
+  switch(wParam)
+  {
+    case HTCLOSE:
+      Btn = DFCS_CAPTIONCLOSE;
+      SCMsg = SC_CLOSE;
+      HasBtn = IsCloseBoxActive(hWnd);
+      break;
+    case HTMINBUTTON:
+      Btn = DFCS_CAPTIONMIN;
+      SCMsg = SC_MINIMIZE;
+      HasBtn = IsMinBoxActive(hWnd);
+      break;
+    case HTMAXBUTTON:
+      Btn = DFCS_CAPTIONMAX;
+      SCMsg = SC_MAXIMIZE;
+      HasBtn = IsMaxBoxActive(hWnd);
+      break;
+    default:
+      return;
+  }
+  
+  SetCapture(hWnd);
+  UserDrawCaptionButton( hWnd, GetWindowDC(hWnd), HasBtn , Btn);
+  
+  while(1)
+  {
+    GetMessageW(&Msg, 0, 0, 0);
+    switch(Msg.message)
+    {
+      case WM_NCLBUTTONUP:
+      case WM_LBUTTONUP:
+        if(InBtn)
+          goto done;
+        else
+        {
+          ReleaseCapture();
+          return;
+        }
+      case WM_NCMOUSEMOVE:
+      case WM_MOUSEMOVE:
+        CurBtn = DefWndHitTestNC(hWnd, Msg.pt);
+        if(InBtn != (CurBtn == OrigBtn))
+        {
+          UserDrawCaptionButton( hWnd, GetWindowDC(hWnd), (CurBtn == OrigBtn) , Btn);
+        }
+        InBtn = CurBtn == OrigBtn;
+        break;
+    }
+  }
+  
+done:
+  UserDrawCaptionButton( hWnd, GetWindowDC(hWnd), FALSE , Btn);
+  ReleaseCapture();
+  SendMessageA(hWnd, WM_SYSCOMMAND, SCMsg, 0);
+  return;
+}
+
 LRESULT
 DefWndHandleLButtonDownNC(HWND hWnd, WPARAM wParam, LPARAM lParam)
 {
@@ -892,7 +957,7 @@ DefWndHandleLButtonDownNC(HWND hWnd, WPARAM wParam, LPARAM lParam)
         }
         case HTMENU:
         {
-            SendMessageA(hWnd, WM_SYSCOMMAND, SC_MOUSEMENU, lParam);
+            SendMessageA(hWnd, WM_SYSCOMMAND, SC_MOUSEMENU + HTMENU, lParam);
             break;
         }
         case HTHSCROLL:
@@ -906,19 +971,11 @@ DefWndHandleLButtonDownNC(HWND hWnd, WPARAM wParam, LPARAM lParam)
             break;
         }
         case HTMINBUTTON:
-        {
-            UserDrawCaptionButton( hWnd, GetWindowDC(hWnd), IsMinBoxActive(hWnd), DFCS_CAPTIONMIN);
-            break;
-        }
         case HTMAXBUTTON:
-        {
-            UserDrawCaptionButton( hWnd, GetWindowDC(hWnd), IsMaxBoxActive(hWnd), DFCS_CAPTIONMAX);
-            break;
-        }
         case HTCLOSE:
         {
-            UserDrawCaptionButton( hWnd, GetWindowDC(hWnd), TRUE, DFCS_CAPTIONCLOSE);
-            break;
+          DefWndDoButtonHandle(hWnd, wParam);
+          break;
         }
         case HTLEFT:
         case HTRIGHT:
@@ -948,27 +1005,7 @@ DefWndHandleLButtonDblClkNC(HWND hWnd, WPARAM wParam, LPARAM lParam)
 LRESULT
 DefWndHandleLButtonUpNC(HWND hWnd, WPARAM wParam, LPARAM lParam)
 {
-    UserDrawCaptionButton( hWnd, GetWindowDC(hWnd), FALSE, DFCS_CAPTIONMIN);
-    UserDrawCaptionButton( hWnd, GetWindowDC(hWnd), FALSE, DFCS_CAPTIONMAX);
-    UserDrawCaptionButton( hWnd, GetWindowDC(hWnd), FALSE, DFCS_CAPTIONCLOSE);
-    switch (wParam)
-    {
-        case HTMINBUTTON:
-        {
-            SendMessageA(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
-            break;
-        }
-        case HTMAXBUTTON:
-        {
-            SendMessageA(hWnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
-            break;
-        }
-        case HTCLOSE:
-        {
-            SendMessageA(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0);
-            break;
-        }
-    }
+  UNIMPLEMENTED;
   return(0);
 }