6 * Copyright (C) 2002 Robert Dickenson <robd@reactos.org>
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.
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.
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.
26 #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
42 ////////////////////////////////////////////////////////////////////////////////
55 TCHAR szTitle
[MAX_LOADSTRING
];
56 TCHAR szFrameClass
[MAX_LOADSTRING
];
57 TCHAR szChildClass
[MAX_LOADSTRING
];
60 ////////////////////////////////////////////////////////////////////////////////
63 // FUNCTION: InitInstance(HANDLE, int)
65 // PURPOSE: Saves instance handle and creates main window
69 // In this function, we save the instance handle in a global variable and
70 // create and display the main program window.
72 BOOL
InitInstance(HINSTANCE hInstance
, int nCmdShow
)
74 // ChildWnd* pChildWnd;
76 WNDCLASSEX wcFrame
= {
78 CS_HREDRAW
| CS_VREDRAW
/*style*/,
83 LoadIcon(hInstance
, MAKEINTRESOURCE(IDI_MDI_APP
)),
84 LoadCursor(0, IDC_ARROW
),
88 (HICON
)LoadImage(hInstance
, MAKEINTRESOURCE(IDI_MDI_APP
), IMAGE_ICON
,
89 GetSystemMetrics(SM_CXSMICON
), GetSystemMetrics(SM_CYSMICON
), LR_SHARED
)
91 ATOM hFrameWndClass
= RegisterClassEx(&wcFrame
); // register frame window class
94 CS_CLASSDC
|CS_DBLCLKS
|CS_VREDRAW
,
100 LoadCursor(0, IDC_ARROW
),
105 ATOM hChildWndClass
= RegisterClass(&wcChild
); // register child windows class
107 WNDCLASSEX wcChild
= {
109 CS_HREDRAW
| CS_VREDRAW
/*style*/,
112 sizeof(HANDLE
)/*cbWndExtra*/,
114 LoadIcon(hInstance
, MAKEINTRESOURCE(IDI_MDI_APP
)),
115 LoadCursor(0, IDC_ARROW
),
119 (HICON
)LoadImage(hInstance
, MAKEINTRESOURCE(IDC_MDI_APP
), IMAGE_ICON
,
120 GetSystemMetrics(SM_CXSMICON
), GetSystemMetrics(SM_CYSMICON
), LR_SHARED
)
123 ATOM hChildWndClass
= RegisterClassEx(&wcChild
); // register child windows class
126 HMENU hMenu
= LoadMenu(hInstance
, MAKEINTRESOURCE(IDC_MDI_APP
));
127 HMENU hMenuOptions
= GetSubMenu(hMenu
, ID_OPTIONS_MENU
);
128 HMENU hChildMenu
= LoadMenu(hInstance
, MAKEINTRESOURCE(IDC_MDI_APP_CHILD
));
130 INITCOMMONCONTROLSEX icc
= {
131 sizeof(INITCOMMONCONTROLSEX
),
138 // hMenuView = GetSubMenu(hMenuFrame, ID_VIEW_MENU);
139 hAccel
= LoadAccelerators(hInstance
, MAKEINTRESOURCE(IDC_MDI_APP
));
140 hFont
= CreateFont(-MulDiv(8,GetDeviceCaps(hdc
,LOGPIXELSY
),72), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _T("MS Sans Serif"));
143 hFrameWnd
= CreateWindowEx(0, (LPCTSTR
)(int)hFrameWndClass
, szTitle
,
144 // hFrameWnd = CreateWindow(szFrameClass, szTitle,
145 WS_OVERLAPPEDWINDOW
| WS_CLIPCHILDREN
,
146 CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
,
147 NULL
/*hWndParent*/, hMenuFrame
, hInstance
, NULL
/*lpParam*/);
152 if (InitCommonControlsEx(&icc
))
155 TBBUTTON toolbarBtns
[] = {
156 {0, 0, 0, TBSTYLE_SEP
},
157 {0, ID_WINDOW_NEW_WINDOW
, TBSTATE_ENABLED
, TBSTYLE_BUTTON
},
158 {1, ID_WINDOW_CASCADE
, TBSTATE_ENABLED
, TBSTYLE_BUTTON
},
159 {2, ID_WINDOW_TILE_HORZ
, TBSTATE_ENABLED
, TBSTYLE_BUTTON
},
160 {3, ID_WINDOW_TILE_VERT
, TBSTATE_ENABLED
, TBSTYLE_BUTTON
},
161 {4, 2/*TODO: ID_...*/, TBSTATE_ENABLED
, TBSTYLE_BUTTON
},
162 {5, 2/*TODO: ID_...*/, TBSTATE_ENABLED
, TBSTYLE_BUTTON
},
165 hToolBar
= CreateToolbarEx(hFrameWnd
, WS_CHILD
|WS_VISIBLE
,
166 IDC_TOOLBAR
, 2, hInstance
, IDB_TOOLBAR
, toolbarBtns
,
167 sizeof(toolbarBtns
)/sizeof(TBBUTTON
), 16, 15, 16, 15, sizeof(TBBUTTON
));
168 CheckMenuItem(hMenuOptions
, ID_OPTIONS_TOOLBAR
, MF_BYCOMMAND
|MF_CHECKED
);
170 // Create the status bar
171 hStatusBar
= CreateStatusWindow(WS_VISIBLE
|WS_CHILD
|WS_CLIPSIBLINGS
|SBT_NOBORDERS
,
172 "", hFrameWnd
, IDC_STATUSBAR
);
175 CheckMenuItem(hMenuOptions
, ID_OPTIONS_STATUSBAR
, MF_BYCOMMAND
|MF_CHECKED
);
177 // Create the status bar panes
181 SendMessage(hStatusBar
, SB_SETPARTS
, 3, (long)nParts
);
183 CheckMenuItem(hMenuOptions
, ID_OPTIONS_TOOLBAR
, MF_BYCOMMAND
|MF_GRAYED
);
184 CheckMenuItem(hMenuOptions
, ID_OPTIONS_STATUSBAR
, MF_BYCOMMAND
|MF_GRAYED
);
187 ShowWindow(hFrameWnd
, nCmdShow
);
188 UpdateWindow(hFrameWnd
);
193 void UpdateStatusBar(void)
198 size
= sizeof(text
)/sizeof(TCHAR
);
199 GetUserName(text
, &size
);
200 SendMessage(hStatusBar
, SB_SETTEXT
, 1, (LPARAM
)text
);
201 size
= sizeof(text
)/sizeof(TCHAR
);
202 GetComputerName(text
, &size
);
203 SendMessage(hStatusBar
, SB_SETTEXT
, 0, (LPARAM
)text
);
207 static int g_foundPrevInstance
= 0;
209 // search for already running win[e]files
210 static BOOL CALLBACK
EnumWndProc(HWND hWnd
, LPARAM lParam
)
214 GetClassName(hWnd
, cls
, 128);
215 if (!lstrcmp(cls
, (LPCTSTR
)lParam
)) {
216 g_foundPrevInstance
++;
223 void ExitInstance(void)
225 DestroyMenu(hMenuFrame
);
229 int APIENTRY
WinMain(HINSTANCE hInstance
,
230 HINSTANCE hPrevInstance
,
238 // Initialize global strings
239 LoadString(hInstance
, IDS_APP_TITLE
, szTitle
, MAX_LOADSTRING
);
240 LoadString(hInstance
, IDC_MDI_APP
, szFrameClass
, MAX_LOADSTRING
);
241 LoadString(hInstance
, IDC_MDI_APP_CHILD
, szChildClass
, MAX_LOADSTRING
);
243 // Allow only one running instance
244 EnumWindows(EnumWndProc
, (LPARAM
)szFrameClass
);
245 if (g_foundPrevInstance
)
248 // Store instance handle in our global variable
251 // Perform application initialization:
252 if (!InitInstance(hInstance
, nCmdShow
)) {
255 hAccel
= LoadAccelerators(hInstance
, (LPCTSTR
)IDC_MDI_APP
);
256 hMDIClient
= GetWindow(hFrameWnd
, GW_CHILD
);
258 // Main message loop:
259 while (GetMessage(&msg
, (HWND
)NULL
, 0, 0)) {
260 if (!TranslateMDISysAccel(hMDIClient
, &msg
) &&
261 !TranslateAccelerator(hFrameWnd
/*hwndFrame*/, hAccel
, &msg
)) {
262 TranslateMessage(&msg
);
263 DispatchMessage(&msg
);