1 /* 2 * ReactOS Application MDI Child Window 3 * 4 * childwnd.c 5 * 6 * Copyright (C) 2002 Robert Dickenson <robd@reactos.org> 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, write to the Free Software 20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 21 */ 22 23 #ifdef _MSC_VER 24 #include "stdafx.h" 25 #else 26 #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers 27 #include <windows.h> 28 #include <commctrl.h> 29 #include <stdlib.h> 30 #include <malloc.h> 31 #include <memory.h> 32 #include <tchar.h> 33 #include <process.h> 34 #include <stdio.h> 35 #endif 36 37 #include <assert.h> 38 #define ASSERT assert 39 40 #include "main.h" 41 #include "childwnd.h" 42 43 //////////////////////////////////////////////////////////////////////////////// 44 45 static void draw_splitbar(HWND hWnd, int x) 46 { 47 RECT rt; 48 HDC hdc = GetDC(hWnd); 49 50 GetClientRect(hWnd, &rt); 51 rt.left = x - SPLIT_WIDTH/2; 52 rt.right = x + SPLIT_WIDTH/2+1; 53 InvertRect(hdc, &rt); 54 ReleaseDC(hWnd, hdc); 55 } 56 57 static void OnPaint(HWND hWnd, ChildWnd* pChildWnd) 58 { 59 PAINTSTRUCT ps; 60 RECT rt; 61 GetClientRect(hWnd, &rt); 62 BeginPaint(hWnd, &ps); 63 64 // lastBrush = SelectObject(ps.hdc, (HBRUSH)GetStockObject(WHITE_BRUSH)); 65 // Rectangle(ps.hdc, rt.left, rt.top-1, rt.right, rt.bottom+1); 66 // SelectObject(ps.hdc, lastBrush); 67 // rt.top = rt.bottom - GetSystemMetrics(SM_CYHSCROLL); 68 FillRect(ps.hdc, &rt, GetStockObject(BLACK_BRUSH)); 69 /* 70 rt.left = pChildWnd->nSplitPos-SPLIT_WIDTH/2; 71 rt.right = pChildWnd->nSplitPos+SPLIT_WIDTH/2+1; 72 lastBrush = SelectBrush(ps.hdc, (HBRUSH)GetStockObject(COLOR_SPLITBAR)); 73 Rectangle(ps.hdc, rt.left, rt.top-1, rt.right, rt.bottom+1); 74 SelectObject(ps.hdc, lastBrush); 75 #ifdef _NO_EXTENSIONS 76 rt.top = rt.bottom - GetSystemMetrics(SM_CYHSCROLL); 77 FillRect(ps.hdc, &rt, GetStockObject(BLACK_BRUSH)); 78 #endif 79 */ 80 EndPaint(hWnd, &ps); 81 } 82 83 84 static void OnSize(ChildWnd* pChildWnd, WPARAM wParam, LPARAM lParam) 85 { 86 if (wParam != SIZE_MINIMIZED) { 87 //resize_tree(pChildWnd, LOWORD(lParam), HIWORD(lParam)); 88 } 89 } 90 91 // 92 // FUNCTION: ChildWndProc(HWND, unsigned, WORD, LONG) 93 // 94 // PURPOSE: Processes messages for the child windows. 95 // 96 // WM_COMMAND - process the application menu 97 // WM_PAINT - Paint the main window 98 // WM_DESTROY - post a quit message and return 99 // 100 // 101 LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 102 { 103 static int last_split; 104 ChildWnd* pChildWnd = (ChildWnd*)GetWindowLongPtr(hWnd, GWLP_USERDATA); 105 ASSERT(pChildWnd); 106 107 switch(message) { 108 case WM_CREATE: 109 return 0; 110 111 case WM_MDIACTIVATE: // set an alternate menu here 112 if (lParam == (LPARAM)hWnd) { 113 } else { 114 } 115 DrawMenuBar(hFrameWnd); 116 // return 0; 117 break; 118 119 case WM_PAINT: 120 OnPaint(hWnd, pChildWnd); 121 return 0; 122 123 case WM_NCDESTROY: 124 // SetWindowLongPtr(hWnd, GWLP_USERDATA, 0); 125 break; 126 127 case WM_SETCURSOR: 128 if (LOWORD(lParam) == HTCLIENT) { 129 POINT pt; 130 GetCursorPos(&pt); 131 ScreenToClient(hWnd, &pt); 132 133 if (pt.x>=pChildWnd->nSplitPos-SPLIT_WIDTH/2 && pt.x<pChildWnd->nSplitPos+SPLIT_WIDTH/2+1) { 134 SetCursor(LoadCursor(0, IDC_SIZEWE)); 135 return TRUE; 136 } 137 } 138 //goto def; 139 break; 140 141 case WM_LBUTTONDOWN: { 142 RECT rt; 143 int x = LOWORD(lParam); 144 GetClientRect(hWnd, &rt); 145 if (x>=pChildWnd->nSplitPos-SPLIT_WIDTH/2 && x<pChildWnd->nSplitPos+SPLIT_WIDTH/2+1) { 146 last_split = pChildWnd->nSplitPos; 147 #ifdef _NO_EXTENSIONS 148 draw_splitbar(hWnd, last_split); 149 #endif 150 SetCapture(hWnd); 151 } 152 break;} 153 154 case WM_LBUTTONUP: 155 if (GetCapture() == hWnd) { 156 #ifdef _NO_EXTENSIONS 157 RECT rt; 158 int x = LOWORD(lParam); 159 draw_splitbar(hWnd, last_split); 160 last_split = -1; 161 GetClientRect(hWnd, &rt); 162 pChildWnd->nSplitPos = x; 163 //resize_tree(pChildWnd, rt.right, rt.bottom); 164 #endif 165 ReleaseCapture(); 166 } 167 break; 168 169 #ifdef _NO_EXTENSIONS 170 case WM_CAPTURECHANGED: 171 if (GetCapture()==hWnd && last_split>=0) 172 draw_splitbar(hWnd, last_split); 173 break; 174 #endif 175 case WM_KEYDOWN: 176 if (wParam == VK_ESCAPE) 177 if (GetCapture() == hWnd) { 178 RECT rt; 179 #ifdef _NO_EXTENSIONS 180 draw_splitbar(hWnd, last_split); 181 #else 182 pChildWnd->nSplitPos = last_split; 183 #endif 184 GetClientRect(hWnd, &rt); 185 //resize_tree(pChildWnd, rt.right, rt.bottom); 186 last_split = -1; 187 ReleaseCapture(); 188 SetCursor(LoadCursor(0, IDC_ARROW)); 189 } 190 break; 191 192 case WM_MOUSEMOVE: 193 if (GetCapture() == hWnd) { 194 RECT rt; 195 int x = LOWORD(lParam); 196 #ifdef _NO_EXTENSIONS 197 HDC hdc = GetDC(hWnd); 198 GetClientRect(hWnd, &rt); 199 rt.left = last_split-SPLIT_WIDTH/2; 200 rt.right = last_split+SPLIT_WIDTH/2+1; 201 InvertRect(hdc, &rt); 202 last_split = x; 203 rt.left = x-SPLIT_WIDTH/2; 204 rt.right = x+SPLIT_WIDTH/2+1; 205 InvertRect(hdc, &rt); 206 ReleaseDC(hWnd, hdc); 207 #else 208 GetClientRect(hWnd, &rt); 209 if (x>=0 && x<rt.right) { 210 pChildWnd->nSplitPos = x; 211 resize_tree(pChildWnd, rt.right, rt.bottom); 212 rt.left = x-SPLIT_WIDTH/2; 213 rt.right = x+SPLIT_WIDTH/2+1; 214 InvalidateRect(hWnd, &rt, FALSE); 215 UpdateWindow(pChildWnd->left.hWnd); 216 UpdateWindow(hWnd); 217 UpdateWindow(pChildWnd->right.hWnd); 218 } 219 #endif 220 } 221 break; 222 223 #ifndef _NO_EXTENSIONS 224 case WM_GETMINMAXINFO: 225 DefMDIChildProc(hWnd, message, wParam, lParam); 226 {LPMINMAXINFO lpmmi = (LPMINMAXINFO)lParam; 227 lpmmi->ptMaxTrackSize.x <<= 1;//2*GetSystemMetrics(SM_CXSCREEN) / SM_CXVIRTUALSCREEN 228 lpmmi->ptMaxTrackSize.y <<= 1;//2*GetSystemMetrics(SM_CYSCREEN) / SM_CYVIRTUALSCREEN 229 break;} 230 #endif 231 232 case WM_SETFOCUS: 233 SetCurrentDirectory(pChildWnd->szPath); 234 SetFocus(pChildWnd->nFocusPanel? pChildWnd->hRightWnd: pChildWnd->hLeftWnd); 235 break; 236 /* 237 case WM_COMMAND: 238 pane = GetFocus()==pChildWnd->left.hWnd? &pChildWnd->left: &pChildWnd->right; 239 switch(LOWORD(wParam)) { 240 case ID_WINDOW_NEW_WINDOW: 241 return 0; 242 default: 243 return pane_command(pane, LOWORD(wParam)); 244 break; 245 } 246 break; 247 */ 248 case WM_SIZE: 249 if (wParam != SIZE_MINIMIZED) { 250 OnSize(pChildWnd, wParam, lParam); 251 } 252 // fall through 253 // default: def: 254 return DefMDIChildProc(hWnd, message, wParam, lParam); 255 } 256 return DefMDIChildProc(hWnd, message, wParam, lParam); 257 } 258