1 /* 2 * ReactOS Application 3 * 4 * main.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 "main.h" 38 #include "framewnd.h" 39 #include "childwnd.h" 40 41 42 //////////////////////////////////////////////////////////////////////////////// 43 // Global Variables: 44 // 45 46 HINSTANCE hInst; 47 HACCEL hAccel; 48 HWND hFrameWnd; 49 HWND hMDIClient; 50 HMENU hMenuFrame; 51 HWND hStatusBar; 52 HWND hToolBar; 53 HFONT hFont; 54 55 TCHAR szTitle[MAX_LOADSTRING]; 56 TCHAR szFrameClass[MAX_LOADSTRING]; 57 TCHAR szChildClass[MAX_LOADSTRING]; 58 59 60 //////////////////////////////////////////////////////////////////////////////// 61 62 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 63 { 64 WNDCLASSEX wcFrame = { 65 sizeof(WNDCLASSEX), 66 CS_HREDRAW | CS_VREDRAW/*style*/, 67 FrameWndProc, 68 0/*cbClsExtra*/, 69 0/*cbWndExtra*/, 70 hInstance, 71 LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MDI_APP)), 72 LoadCursor(0, IDC_ARROW), 73 0/*hbrBackground*/, 74 0/*lpszMenuName*/, 75 szFrameClass, 76 (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDI_MDI_APP), IMAGE_ICON, 77 GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED) 78 }; 79 ATOM hFrameWndClass = RegisterClassEx(&wcFrame); // register frame window class 80 #if 0 81 WNDCLASS wcChild = { 82 CS_CLASSDC|CS_DBLCLKS|CS_VREDRAW, 83 ChildWndProc, 84 0/*cbClsExtra*/, 85 0/*cbWndExtra*/, 86 hInstance, 87 0/*hIcon*/, 88 LoadCursor(0, IDC_ARROW), 89 0/*hbrBackground*/, 90 0/*lpszMenuName*/, 91 szChildClass 92 }; 93 ATOM hChildWndClass = RegisterClass(&wcChild); // register child windows class 94 #else 95 // WNDCLASSEX wcChild = { 96 // sizeof(WNDCLASSEX), 97 // CS_HREDRAW | CS_VREDRAW/*style*/, 98 // ChildWndProc, 99 // 0/*cbClsExtra*/, 100 // sizeof(HANDLE)/*cbWndExtra*/, 101 // hInstance, 102 // LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MDI_APP)), 103 // LoadCursor(0, IDC_ARROW), 104 // 0/*hbrBackground*/, 105 // 0/*lpszMenuName*/, 106 // szChildClass, 107 // (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDC_MDI_APP), IMAGE_ICON, 108 // GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED) 109 // }; 110 // ATOM hChildWndClass = RegisterClassEx(&wcChild); // register child windows class 111 #endif 112 113 HMENU hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDC_MDI_APP)); 114 HMENU hMenuOptions = GetSubMenu(hMenu, ID_OPTIONS_MENU); 115 // HMENU hChildMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDC_MDI_APP_CHILD)); 116 117 INITCOMMONCONTROLSEX icc = { 118 sizeof(INITCOMMONCONTROLSEX), 119 ICC_BAR_CLASSES 120 }; 121 122 HDC hdc = GetDC(0); 123 124 hMenuFrame = hMenu; 125 // hMenuView = GetSubMenu(hMenuFrame, ID_VIEW_MENU); 126 hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MDI_APP)); 127 hFont = CreateFont(-MulDiv(8,GetDeviceCaps(hdc,LOGPIXELSY),72), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _T("MS Sans Serif")); 128 ReleaseDC(0, hdc); 129 130 hFrameWnd = CreateWindowEx(0, (LPCTSTR)(ULONG_PTR)hFrameWndClass, szTitle, 131 // hFrameWnd = CreateWindow(szFrameClass, szTitle, 132 WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, 133 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 134 NULL/*hWndParent*/, hMenuFrame, hInstance, NULL/*lpParam*/); 135 if (!hFrameWnd) { 136 return FALSE; 137 } 138 139 if (InitCommonControlsEx(&icc)) 140 { 141 int nParts[3]; 142 TBBUTTON toolbarBtns[] = { 143 {0, 0, 0, TBSTYLE_SEP}, 144 {0, ID_WINDOW_NEW_WINDOW, TBSTATE_ENABLED, TBSTYLE_BUTTON}, 145 {1, ID_WINDOW_CASCADE, TBSTATE_ENABLED, TBSTYLE_BUTTON}, 146 {2, ID_WINDOW_TILE_HORZ, TBSTATE_ENABLED, TBSTYLE_BUTTON}, 147 {3, ID_WINDOW_TILE_VERT, TBSTATE_ENABLED, TBSTYLE_BUTTON}, 148 {4, 2/*TODO: ID_...*/, TBSTATE_ENABLED, TBSTYLE_BUTTON}, 149 {5, 2/*TODO: ID_...*/, TBSTATE_ENABLED, TBSTYLE_BUTTON}, 150 }; 151 152 hToolBar = CreateToolbarEx(hFrameWnd, WS_CHILD|WS_VISIBLE, 153 IDC_TOOLBAR, 2, hInstance, IDB_TOOLBAR, toolbarBtns, 154 sizeof(toolbarBtns)/sizeof(TBBUTTON), 16, 15, 16, 15, sizeof(TBBUTTON)); 155 CheckMenuItem(hMenuOptions, ID_OPTIONS_TOOLBAR, MF_BYCOMMAND|MF_CHECKED); 156 157 // Create the status bar 158 hStatusBar = CreateStatusWindow(WS_VISIBLE|WS_CHILD|WS_CLIPSIBLINGS|SBT_NOBORDERS, 159 "", hFrameWnd, IDC_STATUSBAR); 160 if (!hStatusBar) 161 return FALSE; 162 CheckMenuItem(hMenuOptions, ID_OPTIONS_STATUSBAR, MF_BYCOMMAND|MF_CHECKED); 163 164 // Create the status bar panes 165 nParts[0] = 100; 166 nParts[1] = 210; 167 nParts[2] = 400; 168 SendMessage(hStatusBar, SB_SETPARTS, 3, (LPARAM)nParts); 169 } else { 170 CheckMenuItem(hMenuOptions, ID_OPTIONS_TOOLBAR, MF_BYCOMMAND|MF_GRAYED); 171 CheckMenuItem(hMenuOptions, ID_OPTIONS_STATUSBAR, MF_BYCOMMAND|MF_GRAYED); 172 } 173 174 ShowWindow(hFrameWnd, nCmdShow); 175 UpdateWindow(hFrameWnd); 176 UpdateStatusBar(); 177 return TRUE; 178 } 179 180 //////////////////////////////////////////////////////////////////////////////// 181 182 void UpdateStatusBar(void) 183 { 184 TCHAR text[260]; 185 DWORD size; 186 187 size = sizeof(text)/sizeof(TCHAR); 188 GetUserName(text, &size); 189 SendMessage(hStatusBar, SB_SETTEXT, 1, (LPARAM)text); 190 size = sizeof(text)/sizeof(TCHAR); 191 GetComputerName(text, &size); 192 SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)text); 193 } 194 195 196 static int g_foundPrevInstance = 0; 197 198 // search for already running win[e]files 199 static BOOL CALLBACK EnumWndProc(HWND hWnd, LPARAM lParam) 200 { 201 TCHAR cls[128]; 202 203 GetClassName(hWnd, cls, 128); 204 if (!lstrcmp(cls, (LPCTSTR)lParam)) { 205 g_foundPrevInstance++; 206 return FALSE; 207 } 208 return TRUE; 209 } 210 211 //////////////////////////////////////////////////////////////////////////////// 212 213 void ExitInstance(void) 214 { 215 DestroyMenu(hMenuFrame); 216 } 217 218 219 int APIENTRY WinMain(HINSTANCE hInstance, 220 HINSTANCE hPrevInstance, 221 LPSTR lpCmdLine, 222 int nCmdShow) 223 { 224 MSG msg; 225 // HACCEL hAccel; 226 HWND hMDIClient; 227 228 // Initialize global strings 229 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); 230 LoadString(hInstance, IDC_MDI_APP, szFrameClass, MAX_LOADSTRING); 231 LoadString(hInstance, IDC_MDI_APP_CHILD, szChildClass, MAX_LOADSTRING); 232 233 // Allow only one running instance 234 EnumWindows(EnumWndProc, (LPARAM)szFrameClass); 235 if (g_foundPrevInstance) 236 return 1; 237 238 // Store instance handle in our global variable 239 hInst = hInstance; 240 241 // Perform application initialization: 242 if (!InitInstance(hInstance, nCmdShow)) { 243 return FALSE; 244 } 245 // hAccel = LoadAccelerators(hInstance, (LPCTSTR)IDC_MDI_APP); 246 hMDIClient = GetWindow(hFrameWnd, GW_CHILD); 247 248 // Main message loop: 249 while (GetMessage(&msg, (HWND)NULL, 0, 0)) { 250 if (!TranslateMDISysAccel(hMDIClient, &msg) && 251 !TranslateAccelerator(hFrameWnd, hAccel, &msg)) { 252 TranslateMessage(&msg); 253 DispatchMessage(&msg); 254 } 255 } 256 ExitInstance(); 257 return msg.wParam; 258 } 259