-#include "precomp.h"\r
-\r
-static const TCHAR szMainWndClass[] = TEXT("WordPadMainWndClass");\r
-\r
-#define ID_MDI_FIRSTCHILD 50000\r
-#define ID_MDI_WINDOWMENU 5\r
-\r
-/* menu hints */\r
-static const MENU_HINT MainMenuHintTable[] = {\r
- /* File Menu */\r
- {ID_BLANK, IDS_HINT_BLANK},\r
- {ID_NEW, IDS_HINT_NEW},\r
- {ID_OPEN, IDS_HINT_OPEN},\r
- {ID_CLOSE, IDS_HINT_CLOSE},\r
- {ID_CLOSEALL, IDS_HINT_CLOSEALL},\r
- {ID_SAVE, IDS_HINT_SAVE},\r
- {ID_SAVEAS, IDS_HINT_SAVEAS},\r
- {ID_PRINT, IDS_HINT_PRINT},\r
- {ID_PRINTPRE, IDS_HINT_PRINTPRE},\r
- {ID_PAGESETUP, IDS_HINT_PAGESETUP},\r
- {ID_EXIT, IDS_HINT_EXIT},\r
-\r
- /* Window Menu */\r
- {ID_WINDOW_NEXT, IDS_HINT_NEXT},\r
- {ID_WINDOW_CASCADE, IDS_HINT_CASCADE},\r
- {ID_WINDOW_TILE_HORZ, IDS_HINT_TILE_HORZ},\r
- {ID_WINDOW_TILE_VERT, IDS_HINT_TILE_VERT},\r
- {ID_WINDOW_ARRANGE, IDS_HINT_ARRANGE}\r
-};\r
-\r
-static const MENU_HINT SystemMenuHintTable[] = {\r
- {SC_RESTORE, IDS_HINT_SYS_RESTORE},\r
- {SC_MOVE, IDS_HINT_SYS_MOVE},\r
- {SC_SIZE, IDS_HINT_SYS_SIZE},\r
- {SC_MINIMIZE, IDS_HINT_SYS_MINIMIZE},\r
- {SC_MAXIMIZE, IDS_HINT_SYS_MAXIMIZE},\r
- {SC_CLOSE, IDS_HINT_CLOSE},\r
- {SC_NEXTWINDOW, IDS_HINT_NEXT},\r
-};\r
-\r
-\r
-static VOID\r
-CreateToolbars(PMAIN_WND_INFO Info)\r
-{\r
-\r
-}\r
-\r
-static VOID CALLBACK\r
-MainWndResize(PVOID Context,\r
- WORD cx,\r
- WORD cy)\r
-{\r
- RECT rcClient = {0};\r
- RECT rcStatus = {0};\r
- HDWP dwp;\r
- PMAIN_WND_INFO Info = (PMAIN_WND_INFO)Context;\r
-\r
- /* Calculate the MDI client rectangle */\r
- rcClient.right = cx;\r
- rcClient.bottom = cy;\r
-\r
- if (Info->hStatus != NULL)\r
- {\r
- GetWindowRect(Info->hStatus,\r
- &rcStatus);\r
- rcClient.bottom -= (rcStatus.bottom - rcStatus.top);\r
- }\r
-\r
-\r
- dwp = BeginDeferWindowPos(2);\r
- if (dwp != NULL)\r
- {\r
- /* Update the MDI client */\r
- if (Info->hMdiClient != NULL)\r
- {\r
- dwp = DeferWindowPos(dwp,\r
- Info->hMdiClient,\r
- NULL,\r
- rcClient.left,\r
- rcClient.top,\r
- rcClient.right - rcClient.left,\r
- rcClient.bottom - rcClient.top,\r
- SWP_NOZORDER);\r
- if (dwp == NULL)\r
- return;\r
- }\r
-\r
- /* Update the status bar */\r
- if (Info->hStatus != NULL)\r
- {\r
- dwp = DeferWindowPos(dwp,\r
- Info->hStatus,\r
- NULL,\r
- 0,\r
- cy - (rcStatus.bottom - rcStatus.top),\r
- cx,\r
- rcStatus.bottom - rcStatus.top,\r
- SWP_NOZORDER);\r
- if (dwp == NULL)\r
- return;\r
- }\r
-\r
- EndDeferWindowPos(dwp);\r
- }\r
-}\r
-\r
-static VOID\r
-InitMainWnd(PMAIN_WND_INFO Info)\r
-{\r
- CLIENTCREATESTRUCT ccs;\r
- INT statwidths[] = {110, -1};\r
-\r
- /* FIXME - create controls and initialize the application */\r
-\r
- /* create the status bar */\r
- Info->hStatus = CreateWindowEx(0,\r
- STATUSCLASSNAME,\r
- NULL,\r
- WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | CCS_NOPARENTALIGN | SBARS_SIZEGRIP,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- Info->hSelf,\r
- (HMENU)IDC_STATUSBAR,\r
- hInstance,\r
- NULL);\r
-\r
- if (Info->hStatus != NULL)\r
- SendMessage(Info->hStatus,\r
- SB_SETPARTS,\r
- sizeof(statwidths)/sizeof(int),\r
- (LPARAM)statwidths);\r
-\r
- /* create the MDI client window */\r
- ccs.hWindowMenu = GetSubMenu(GetMenu(Info->hSelf),\r
- ID_MDI_WINDOWMENU);\r
- ccs.idFirstChild = ID_MDI_FIRSTCHILD;\r
- Info->hMdiClient = CreateWindowEx(WS_EX_ACCEPTFILES | WS_EX_CLIENTEDGE,\r
- TEXT("MDICLIENT"),\r
- NULL,\r
- WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VSCROLL | WS_HSCROLL,\r
- 0,\r
- 0,\r
- 0,\r
- 0,\r
- Info->hSelf,\r
- NULL,\r
- hInstance,\r
- &ccs);\r
-\r
- CreateToolbars(Info);\r
-\r
- /* initialize file open/save structure */\r
- FileInitialize(Info->hSelf);\r
-}\r
-\r
-static VOID\r
-MainWndCommand(PMAIN_WND_INFO Info,\r
- WORD CmdId,\r
- HWND hControl)\r
-{\r
- //static TCHAR szFileName[MAX_PATH];\r
- //static TCHAR szImageName[MAX_PATH];\r
-\r
- UNREFERENCED_PARAMETER(hControl);\r
-\r
- switch (CmdId)\r
- {\r
- case ID_NEW:\r
- {\r
- OPEN_EDIT_INFO OpenInfo;\r
- INT Ret;\r
-\r
- OpenInfo.CreateNew = TRUE;\r
-\r
- LoadAndFormatString(hInstance,\r
- IDS_DEFAULT_NAME,\r
- &OpenInfo.lpImageName,\r
- ++Info->ImagesCreated);\r
-\r
- Ret = DialogBox(hInstance,\r
- MAKEINTRESOURCE(IDD_NEWDOCSEL),\r
- Info->hSelf,\r
- NewDocSelDlgProc);\r
- if (Ret != -1)\r
- {\r
- OpenInfo.DocType = Ret;\r
-\r
- CreateEditWindow(Info,\r
- &OpenInfo);\r
- }\r
-\r
- }\r
- break;\r
-\r
- case ID_BOLD:\r
- MessageBox(NULL, _T("Bingo"), NULL, 0);\r
- break;\r
-\r
- case ID_OPEN:\r
- {\r
-/* OPEN_EDIT_INFO OpenInfo;\r
-\r
- if (DoOpenFile(Info->hSelf,\r
- szFileName, / * full file path * /\r
- szImageName)) / * file name * /\r
- {\r
- OpenInfo.CreateNew = FALSE;\r
-\r
- OpenInfo.Open.lpImagePath = szFileName;\r
- OpenInfo.lpImageName = szImageName;\r
-\r
- CreateEditWindow(Info,\r
- &OpenInfo);\r
- }\r
-*/\r
- }\r
- break;\r
-\r
- case ID_EXIT:\r
- SendMessage(Info->hSelf,\r
- WM_CLOSE,\r
- 0,\r
- 0);\r
- break;\r
-\r
- /* Window Menu */\r
- case ID_WINDOW_TILE_HORZ:\r
- SendMessage(Info->hMdiClient,\r
- WM_MDITILE,\r
- MDITILE_HORIZONTAL,\r
- 0);\r
- break;\r
-\r
- case ID_WINDOW_TILE_VERT:\r
- SendMessage(Info->hMdiClient,\r
- WM_MDITILE,\r
- MDITILE_VERTICAL,\r
- 0);\r
- break;\r
-\r
- case ID_WINDOW_CASCADE:\r
- SendMessage(Info->hMdiClient,\r
- WM_MDICASCADE,\r
- 0,\r
- 0);\r
- break;\r
-\r
- case ID_WINDOW_ARRANGE:\r
- SendMessage(Info->hMdiClient,\r
- WM_MDIICONARRANGE,\r
- 0,\r
- 0);\r
- break;\r
-\r
- case ID_WINDOW_NEXT:\r
- SendMessage(Info->hMdiClient,\r
- WM_MDINEXT,\r
- 0,\r
- 0);\r
- break;\r
-\r
- /* Help Menu */\r
- case ID_ABOUT:\r
- DialogBox(hInstance,\r
- MAKEINTRESOURCE(IDD_ABOUTBOX),\r
- Info->hSelf,\r
- AboutDialogProc);\r
- break;\r
- }\r
-}\r
-\r
-static VOID\r
-DestroyMainWnd(PMAIN_WND_INFO Info)\r
-{\r
- /* FIXME - cleanup allocated resources */\r
-}\r
-\r
-\r
-static VOID\r
-UpdateMainStatusBar(PMAIN_WND_INFO Info)\r
-{\r
- if (Info->hStatus != NULL)\r
- {\r
- SendMessage(Info->hStatus,\r
- SB_SIMPLE,\r
- (WPARAM)Info->InMenuLoop,\r
- 0);\r
- }\r
-}\r
-\r
-static BOOL\r
-MainWndMenuHint(PMAIN_WND_INFO Info,\r
- WORD CmdId,\r
- const MENU_HINT *HintArray,\r
- DWORD HintsCount,\r
- UINT DefHintId)\r
-{\r
- BOOL Found = FALSE;\r
- const MENU_HINT *LastHint;\r
- UINT HintId = DefHintId;\r
-\r
- LastHint = HintArray + HintsCount;\r
- while (HintArray != LastHint)\r
- {\r
- if (HintArray->CmdId == CmdId)\r
- {\r
- HintId = HintArray->HintId;\r
- Found = TRUE;\r
- break;\r
- }\r
- HintArray++;\r
- }\r
-\r
- StatusBarLoadString(Info->hStatus,\r
- SB_SIMPLEID,\r
- hInstance,\r
- HintId);\r
-\r
- return Found;\r
-}\r
-\r
-static LRESULT CALLBACK\r
-MainWndProc(HWND hwnd,\r
- UINT uMsg,\r
- WPARAM wParam,\r
- LPARAM lParam)\r
-{\r
- PMAIN_WND_INFO Info;\r
- LRESULT Ret = 0;\r
- static RECT wndOldPos;\r
-\r
- /* Get the window context */\r
- Info = (PMAIN_WND_INFO)GetWindowLongPtr(hwnd,\r
- GWLP_USERDATA);\r
- if (Info == NULL && uMsg != WM_CREATE)\r
- {\r
- goto HandleDefaultMessage;\r
- }\r
-\r
- switch (uMsg)\r
- {\r
- case WM_CREATE:\r
- {\r
- Info = (PMAIN_WND_INFO)(((LPCREATESTRUCT)lParam)->lpCreateParams);\r
-\r
- /* Initialize the main window context */\r
- Info->hSelf = hwnd;\r
-\r
- SetWindowLongPtr(hwnd,\r
- GWLP_USERDATA,\r
- (LONG_PTR)Info);\r
-\r
- InitMainWnd(Info);\r
-\r
- /* Show the window */\r
- ShowWindow(hwnd,\r
- Info->nCmdShow);\r
- /* get the windows position */\r
- GetWindowRect(hwnd,\r
- &wndOldPos);\r
-\r
- break;\r
- }\r
-\r
- case WM_SIZE:\r
- {\r
- MainWndResize(Info,\r
- LOWORD(lParam),\r
- HIWORD(lParam));\r
- /* NOTE - do *not* forward this message to DefFrameProc! Otherwise the MDI client\r
- will attempt to resize itself */\r
-\r
- break;\r
- }\r
-\r
- case WM_MOVE:\r
- {\r
-\r
- }\r
- break;\r
-\r
- case WM_NOTIFY:\r
- {\r
-\r
- /* FIXME - handle other notifications */\r
- break;\r
- }\r
-\r
- case WM_COMMAND:\r
- {\r
- MainWndCommand(Info,\r
- LOWORD(wParam),\r
- (HWND)lParam);\r
- goto HandleDefaultMessage;\r
- }\r
-\r
- case WM_MENUSELECT:\r
- {\r
- if (Info->hStatus != NULL)\r
- {\r
- if (!MainWndMenuHint(Info,\r
- LOWORD(wParam),\r
- MainMenuHintTable,\r
- sizeof(MainMenuHintTable) / sizeof(MainMenuHintTable[0]),\r
- IDS_HINT_BLANK))\r
- {\r
- MainWndMenuHint(Info,\r
- LOWORD(wParam),\r
- SystemMenuHintTable,\r
- sizeof(SystemMenuHintTable) / sizeof(SystemMenuHintTable[0]),\r
- IDS_HINT_BLANK);\r
- }\r
- }\r
- break;\r
- }\r
-\r
- case WM_ENTERMENULOOP:\r
- {\r
- Info->InMenuLoop = TRUE;\r
- UpdateMainStatusBar(Info);\r
- break;\r
- }\r
-\r
- case WM_EXITMENULOOP:\r
- {\r
- Info->InMenuLoop = FALSE;\r
- UpdateMainStatusBar(Info);\r
- break;\r
- }\r
-\r
- case WM_CLOSE:\r
- {\r
- DestroyWindow(hwnd);\r
- break;\r
- }\r
-\r
- case WM_ENABLE:\r
- {\r
-\r
- goto HandleDefaultMessage;\r
- }\r
-\r
- case WM_NCACTIVATE:\r
- {\r
-\r
- goto HandleDefaultMessage;\r
- }\r
-\r
- case WM_ACTIVATEAPP:\r
- {\r
-\r
- goto HandleDefaultMessage;\r
- }\r
-\r
- case WM_DESTROY:\r
- {\r
- DestroyMainWnd(Info);\r
-\r
- /* FIXME: set the windows position in registry*/\r
- //wndOldPos\r
-\r
- HeapFree(ProcessHeap,\r
- 0,\r
- Info);\r
- SetWindowLongPtr(hwnd,\r
- GWLP_USERDATA,\r
- 0);\r
-\r
- /* Break the message queue loop */\r
- PostQuitMessage(0);\r
- break;\r
- }\r
-\r
- default:\r
- {\r
-HandleDefaultMessage:\r
- if (Info != NULL && Info->hMdiClient != NULL)\r
- {\r
- Ret = DefFrameProc(hwnd,\r
- Info->hMdiClient,\r
- uMsg,\r
- wParam,\r
- lParam);\r
- }\r
- else\r
- {\r
- Ret = DefWindowProc(hwnd,\r
- uMsg,\r
- wParam,\r
- lParam);\r
- }\r
- break;\r
- }\r
- }\r
-\r
- return Ret;\r
-}\r
-\r
-MDI_EDITOR_TYPE\r
-MainWndGetCurrentEditor(PMAIN_WND_INFO MainWnd,\r
- PVOID *Info)\r
-{\r
- MDI_EDITOR_TYPE EditorType;\r
-\r
- if (MainWnd->ActiveEditor != NULL)\r
- {\r
- EditorType = *((PMDI_EDITOR_TYPE)MainWnd->ActiveEditor);\r
- *Info = MainWnd->ActiveEditor;\r
- }\r
- else\r
- {\r
- EditorType = metUnknown;\r
- *Info = NULL;\r
- }\r
-\r
- return EditorType;\r
-}\r
-\r
-VOID\r
-MainWndSwitchEditorContext(PMAIN_WND_INFO Info,\r
- HWND hDeactivate,\r
- HWND hActivate)\r
-{\r
- PMDI_EDITOR_TYPE EditorType;\r
-\r
- /* FIXME - optimize light weight switching\r
- when switching from and to an editor of same type */\r
-\r
- if (hDeactivate != NULL)\r
- {\r
- EditorType = (PMDI_EDITOR_TYPE)GetWindowLongPtr(hDeactivate,\r
- GWLP_USERDATA);\r
- if (EditorType != NULL)\r
- {\r
- switch (*EditorType)\r
- {\r
- case metImageEditor:\r
- SetEditorEnvironment((PEDIT_WND_INFO)EditorType,\r
- FALSE);\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
-\r
- Info->ActiveEditor = NULL;\r
- }\r
- }\r
-\r
- if (hActivate != NULL)\r
- {\r
- EditorType = (PMDI_EDITOR_TYPE)GetWindowLongPtr(hActivate,\r
- GWLP_USERDATA);\r
- if (EditorType != NULL)\r
- {\r
- Info->ActiveEditor = EditorType;\r
-\r
- switch (*EditorType)\r
- {\r
- case metImageEditor:\r
- SetEditorEnvironment((PEDIT_WND_INFO)EditorType,\r
- TRUE);\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
- }\r
- }\r
-}\r
-\r
-HWND\r
-CreateMainWindow(LPCTSTR lpCaption,\r
- int nCmdShow)\r
-{\r
- PMAIN_WND_INFO Info;\r
- HWND hMainWnd = NULL;\r
-\r
- Info = HeapAlloc(ProcessHeap,\r
- 0,\r
- sizeof(MAIN_WND_INFO));\r
- if (Info != NULL)\r
- {\r
- ZeroMemory(Info,\r
- sizeof(MAIN_WND_INFO));\r
- Info->nCmdShow = nCmdShow;\r
-\r
- /* FIXME - load the window position from the registry */\r
-\r
- hMainWnd = CreateWindowEx(WS_EX_WINDOWEDGE,\r
- szMainWndClass,\r
- lpCaption,\r
- WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,\r
- CW_USEDEFAULT,\r
- CW_USEDEFAULT,\r
- CW_USEDEFAULT,\r
- CW_USEDEFAULT,\r
- NULL,\r
- NULL,\r
- hInstance,\r
- Info);\r
- if (hMainWnd == NULL)\r
- {\r
- HeapFree(ProcessHeap,\r
- 0,\r
- Info);\r
- }\r
- }\r
-\r
- return hMainWnd;\r
-}\r
-\r
-BOOL\r
-MainWndTranslateMDISysAccel(HWND hwnd,\r
- LPMSG lpMsg)\r
-{\r
- PMAIN_WND_INFO Info;\r
-\r
- /* Get the window context */\r
- Info = (PMAIN_WND_INFO)GetWindowLongPtr(hwnd,\r
- GWLP_USERDATA);\r
- if (Info != NULL && Info->hMdiClient != NULL)\r
- {\r
- return TranslateMDISysAccel(Info->hMdiClient,\r
- lpMsg);\r
- }\r
-\r
- return FALSE;\r
-}\r
-\r
-BOOL\r
-InitMainWindowImpl(VOID)\r
-{\r
- WNDCLASSEX wc = {0};\r
-\r
- wc.cbSize = sizeof(WNDCLASSEX);\r
- wc.lpfnWndProc = MainWndProc;\r
- wc.hInstance = hInstance;\r
- wc.hIcon = LoadIcon(hInstance,\r
- MAKEINTRESOURCE(IDI_ICON));\r
- wc.hCursor = LoadCursor(NULL,\r
- IDC_ARROW);\r
- wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);\r
- wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAINMENU);\r
- wc.lpszClassName = szMainWndClass;\r
- wc.hIconSm = (HICON)LoadImage(hInstance,\r
- MAKEINTRESOURCE(IDI_ICON),\r
- IMAGE_ICON,\r
- 16,\r
- 16,\r
- LR_SHARED);\r
-\r
- return RegisterClassEx(&wc) != (ATOM)0;\r
-}\r
-\r
-VOID\r
-UninitMainWindowImpl(VOID)\r
-{\r
- UnregisterClass(szMainWndClass,\r
- hInstance);\r
-}\r
+#include "precomp.h"
+
+static const TCHAR szMainWndClass[] = TEXT("WordPadMainWndClass");
+
+#define ID_MDI_FIRSTCHILD 50000
+#define ID_MDI_WINDOWMENU 5
+
+/* menu hints */
+static const MENU_HINT MainMenuHintTable[] = {
+ /* File Menu */
+ {ID_BLANK, IDS_HINT_BLANK},
+ {ID_NEW, IDS_HINT_NEW},
+ {ID_OPEN, IDS_HINT_OPEN},
+ {ID_CLOSE, IDS_HINT_CLOSE},
+ {ID_CLOSEALL, IDS_HINT_CLOSEALL},
+ {ID_SAVE, IDS_HINT_SAVE},
+ {ID_SAVEAS, IDS_HINT_SAVEAS},
+ {ID_PRINT, IDS_HINT_PRINT},
+ {ID_PRINTPRE, IDS_HINT_PRINTPRE},
+ {ID_PAGESETUP, IDS_HINT_PAGESETUP},
+ {ID_EXIT, IDS_HINT_EXIT},
+
+ /* Window Menu */
+ {ID_WINDOW_NEXT, IDS_HINT_NEXT},
+ {ID_WINDOW_CASCADE, IDS_HINT_CASCADE},
+ {ID_WINDOW_TILE_HORZ, IDS_HINT_TILE_HORZ},
+ {ID_WINDOW_TILE_VERT, IDS_HINT_TILE_VERT},
+ {ID_WINDOW_ARRANGE, IDS_HINT_ARRANGE}
+};
+
+static const MENU_HINT SystemMenuHintTable[] = {
+ {SC_RESTORE, IDS_HINT_SYS_RESTORE},
+ {SC_MOVE, IDS_HINT_SYS_MOVE},
+ {SC_SIZE, IDS_HINT_SYS_SIZE},
+ {SC_MINIMIZE, IDS_HINT_SYS_MINIMIZE},
+ {SC_MAXIMIZE, IDS_HINT_SYS_MAXIMIZE},
+ {SC_CLOSE, IDS_HINT_CLOSE},
+ {SC_NEXTWINDOW, IDS_HINT_NEXT},
+};
+
+
+static VOID
+CreateToolbars(PMAIN_WND_INFO Info)
+{
+
+}
+
+static VOID CALLBACK
+MainWndResize(PVOID Context,
+ WORD cx,
+ WORD cy)
+{
+ RECT rcClient = {0};
+ RECT rcStatus = {0};
+ HDWP dwp;
+ PMAIN_WND_INFO Info = (PMAIN_WND_INFO)Context;
+
+ /* Calculate the MDI client rectangle */
+ rcClient.right = cx;
+ rcClient.bottom = cy;
+
+ if (Info->hStatus != NULL)
+ {
+ GetWindowRect(Info->hStatus,
+ &rcStatus);
+ rcClient.bottom -= (rcStatus.bottom - rcStatus.top);
+ }
+
+
+ dwp = BeginDeferWindowPos(2);
+ if (dwp != NULL)
+ {
+ /* Update the MDI client */
+ if (Info->hMdiClient != NULL)
+ {
+ dwp = DeferWindowPos(dwp,
+ Info->hMdiClient,
+ NULL,
+ rcClient.left,
+ rcClient.top,
+ rcClient.right - rcClient.left,
+ rcClient.bottom - rcClient.top,
+ SWP_NOZORDER);
+ if (dwp == NULL)
+ return;
+ }
+
+ /* Update the status bar */
+ if (Info->hStatus != NULL)
+ {
+ dwp = DeferWindowPos(dwp,
+ Info->hStatus,
+ NULL,
+ 0,
+ cy - (rcStatus.bottom - rcStatus.top),
+ cx,
+ rcStatus.bottom - rcStatus.top,
+ SWP_NOZORDER);
+ if (dwp == NULL)
+ return;
+ }
+
+ EndDeferWindowPos(dwp);
+ }
+}
+
+static VOID
+InitMainWnd(PMAIN_WND_INFO Info)
+{
+ CLIENTCREATESTRUCT ccs;
+ INT statwidths[] = {110, -1};
+
+ /* FIXME - create controls and initialize the application */
+
+ /* create the status bar */
+ Info->hStatus = CreateWindowEx(0,
+ STATUSCLASSNAME,
+ NULL,
+ WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | CCS_NOPARENTALIGN | SBARS_SIZEGRIP,
+ 0,
+ 0,
+ 0,
+ 0,
+ Info->hSelf,
+ (HMENU)IDC_STATUSBAR,
+ hInstance,
+ NULL);
+
+ if (Info->hStatus != NULL)
+ SendMessage(Info->hStatus,
+ SB_SETPARTS,
+ sizeof(statwidths)/sizeof(int),
+ (LPARAM)statwidths);
+
+ /* create the MDI client window */
+ ccs.hWindowMenu = GetSubMenu(GetMenu(Info->hSelf),
+ ID_MDI_WINDOWMENU);
+ ccs.idFirstChild = ID_MDI_FIRSTCHILD;
+ Info->hMdiClient = CreateWindowEx(WS_EX_ACCEPTFILES | WS_EX_CLIENTEDGE,
+ TEXT("MDICLIENT"),
+ NULL,
+ WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VSCROLL | WS_HSCROLL,
+ 0,
+ 0,
+ 0,
+ 0,
+ Info->hSelf,
+ NULL,
+ hInstance,
+ &ccs);
+
+ CreateToolbars(Info);
+
+ /* initialize file open/save structure */
+ FileInitialize(Info->hSelf);
+}
+
+static VOID
+MainWndCommand(PMAIN_WND_INFO Info,
+ WORD CmdId,
+ HWND hControl)
+{
+ //static TCHAR szFileName[MAX_PATH];
+ //static TCHAR szImageName[MAX_PATH];
+
+ UNREFERENCED_PARAMETER(hControl);
+
+ switch (CmdId)
+ {
+ case ID_NEW:
+ {
+ OPEN_EDIT_INFO OpenInfo;
+ INT Ret;
+
+ OpenInfo.CreateNew = TRUE;
+
+ LoadAndFormatString(hInstance,
+ IDS_DEFAULT_NAME,
+ &OpenInfo.lpImageName,
+ ++Info->ImagesCreated);
+
+ Ret = DialogBox(hInstance,
+ MAKEINTRESOURCE(IDD_NEWDOCSEL),
+ Info->hSelf,
+ NewDocSelDlgProc);
+ if (Ret != -1)
+ {
+ OpenInfo.DocType = Ret;
+
+ CreateEditWindow(Info,
+ &OpenInfo);
+ }
+
+ }
+ break;
+
+ case ID_BOLD:
+ MessageBox(NULL, _T("Bingo"), NULL, 0);
+ break;
+
+ case ID_OPEN:
+ {
+/* OPEN_EDIT_INFO OpenInfo;
+
+ if (DoOpenFile(Info->hSelf,
+ szFileName, / * full file path * /
+ szImageName)) / * file name * /
+ {
+ OpenInfo.CreateNew = FALSE;
+
+ OpenInfo.Open.lpImagePath = szFileName;
+ OpenInfo.lpImageName = szImageName;
+
+ CreateEditWindow(Info,
+ &OpenInfo);
+ }
+*/
+ }
+ break;
+
+ case ID_EXIT:
+ SendMessage(Info->hSelf,
+ WM_CLOSE,
+ 0,
+ 0);
+ break;
+
+ /* Window Menu */
+ case ID_WINDOW_TILE_HORZ:
+ SendMessage(Info->hMdiClient,
+ WM_MDITILE,
+ MDITILE_HORIZONTAL,
+ 0);
+ break;
+
+ case ID_WINDOW_TILE_VERT:
+ SendMessage(Info->hMdiClient,
+ WM_MDITILE,
+ MDITILE_VERTICAL,
+ 0);
+ break;
+
+ case ID_WINDOW_CASCADE:
+ SendMessage(Info->hMdiClient,
+ WM_MDICASCADE,
+ 0,
+ 0);
+ break;
+
+ case ID_WINDOW_ARRANGE:
+ SendMessage(Info->hMdiClient,
+ WM_MDIICONARRANGE,
+ 0,
+ 0);
+ break;
+
+ case ID_WINDOW_NEXT:
+ SendMessage(Info->hMdiClient,
+ WM_MDINEXT,
+ 0,
+ 0);
+ break;
+
+ /* Help Menu */
+ case ID_ABOUT:
+ DialogBox(hInstance,
+ MAKEINTRESOURCE(IDD_ABOUTBOX),
+ Info->hSelf,
+ AboutDialogProc);
+ break;
+ }
+}
+
+static VOID
+DestroyMainWnd(PMAIN_WND_INFO Info)
+{
+ /* FIXME - cleanup allocated resources */
+}
+
+
+static VOID
+UpdateMainStatusBar(PMAIN_WND_INFO Info)
+{
+ if (Info->hStatus != NULL)
+ {
+ SendMessage(Info->hStatus,
+ SB_SIMPLE,
+ (WPARAM)Info->InMenuLoop,
+ 0);
+ }
+}
+
+static BOOL
+MainWndMenuHint(PMAIN_WND_INFO Info,
+ WORD CmdId,
+ const MENU_HINT *HintArray,
+ DWORD HintsCount,
+ UINT DefHintId)
+{
+ BOOL Found = FALSE;
+ const MENU_HINT *LastHint;
+ UINT HintId = DefHintId;
+
+ LastHint = HintArray + HintsCount;
+ while (HintArray != LastHint)
+ {
+ if (HintArray->CmdId == CmdId)
+ {
+ HintId = HintArray->HintId;
+ Found = TRUE;
+ break;
+ }
+ HintArray++;
+ }
+
+ StatusBarLoadString(Info->hStatus,
+ SB_SIMPLEID,
+ hInstance,
+ HintId);
+
+ return Found;
+}
+
+static LRESULT CALLBACK
+MainWndProc(HWND hwnd,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ PMAIN_WND_INFO Info;
+ LRESULT Ret = 0;
+ static RECT wndOldPos;
+
+ /* Get the window context */
+ Info = (PMAIN_WND_INFO)GetWindowLongPtr(hwnd,
+ GWLP_USERDATA);
+ if (Info == NULL && uMsg != WM_CREATE)
+ {
+ goto HandleDefaultMessage;
+ }
+
+ switch (uMsg)
+ {
+ case WM_CREATE:
+ {
+ Info = (PMAIN_WND_INFO)(((LPCREATESTRUCT)lParam)->lpCreateParams);
+
+ /* Initialize the main window context */
+ Info->hSelf = hwnd;
+
+ SetWindowLongPtr(hwnd,
+ GWLP_USERDATA,
+ (LONG_PTR)Info);
+
+ InitMainWnd(Info);
+
+ /* Show the window */
+ ShowWindow(hwnd,
+ Info->nCmdShow);
+ /* get the windows position */
+ GetWindowRect(hwnd,
+ &wndOldPos);
+
+ break;
+ }
+
+ case WM_SIZE:
+ {
+ MainWndResize(Info,
+ LOWORD(lParam),
+ HIWORD(lParam));
+ /* NOTE - do *not* forward this message to DefFrameProc! Otherwise the MDI client
+ will attempt to resize itself */
+
+ break;
+ }
+
+ case WM_MOVE:
+ {
+
+ }
+ break;
+
+ case WM_NOTIFY:
+ {
+
+ /* FIXME - handle other notifications */
+ break;
+ }
+
+ case WM_COMMAND:
+ {
+ MainWndCommand(Info,
+ LOWORD(wParam),
+ (HWND)lParam);
+ goto HandleDefaultMessage;
+ }
+
+ case WM_MENUSELECT:
+ {
+ if (Info->hStatus != NULL)
+ {
+ if (!MainWndMenuHint(Info,
+ LOWORD(wParam),
+ MainMenuHintTable,
+ sizeof(MainMenuHintTable) / sizeof(MainMenuHintTable[0]),
+ IDS_HINT_BLANK))
+ {
+ MainWndMenuHint(Info,
+ LOWORD(wParam),
+ SystemMenuHintTable,
+ sizeof(SystemMenuHintTable) / sizeof(SystemMenuHintTable[0]),
+ IDS_HINT_BLANK);
+ }
+ }
+ break;
+ }
+
+ case WM_ENTERMENULOOP:
+ {
+ Info->InMenuLoop = TRUE;
+ UpdateMainStatusBar(Info);
+ break;
+ }
+
+ case WM_EXITMENULOOP:
+ {
+ Info->InMenuLoop = FALSE;
+ UpdateMainStatusBar(Info);
+ break;
+ }
+
+ case WM_CLOSE:
+ {
+ DestroyWindow(hwnd);
+ break;
+ }
+
+ case WM_ENABLE:
+ {
+
+ goto HandleDefaultMessage;
+ }
+
+ case WM_NCACTIVATE:
+ {
+
+ goto HandleDefaultMessage;
+ }
+
+ case WM_ACTIVATEAPP:
+ {
+
+ goto HandleDefaultMessage;
+ }
+
+ case WM_DESTROY:
+ {
+ DestroyMainWnd(Info);
+
+ /* FIXME: set the windows position in registry*/
+ //wndOldPos
+
+ HeapFree(ProcessHeap,
+ 0,
+ Info);
+ SetWindowLongPtr(hwnd,
+ GWLP_USERDATA,
+ 0);
+
+ /* Break the message queue loop */
+ PostQuitMessage(0);
+ break;
+ }
+
+ default:
+ {
+HandleDefaultMessage:
+ if (Info != NULL && Info->hMdiClient != NULL)
+ {
+ Ret = DefFrameProc(hwnd,
+ Info->hMdiClient,
+ uMsg,
+ wParam,
+ lParam);
+ }
+ else
+ {
+ Ret = DefWindowProc(hwnd,
+ uMsg,
+ wParam,
+ lParam);
+ }
+ break;
+ }
+ }
+
+ return Ret;
+}
+
+MDI_EDITOR_TYPE
+MainWndGetCurrentEditor(PMAIN_WND_INFO MainWnd,
+ PVOID *Info)
+{
+ MDI_EDITOR_TYPE EditorType;
+
+ if (MainWnd->ActiveEditor != NULL)
+ {
+ EditorType = *((PMDI_EDITOR_TYPE)MainWnd->ActiveEditor);
+ *Info = MainWnd->ActiveEditor;
+ }
+ else
+ {
+ EditorType = metUnknown;
+ *Info = NULL;
+ }
+
+ return EditorType;
+}
+
+VOID
+MainWndSwitchEditorContext(PMAIN_WND_INFO Info,
+ HWND hDeactivate,
+ HWND hActivate)
+{
+ PMDI_EDITOR_TYPE EditorType;
+
+ /* FIXME - optimize light weight switching
+ when switching from and to an editor of same type */
+
+ if (hDeactivate != NULL)
+ {
+ EditorType = (PMDI_EDITOR_TYPE)GetWindowLongPtr(hDeactivate,
+ GWLP_USERDATA);
+ if (EditorType != NULL)
+ {
+ switch (*EditorType)
+ {
+ case metImageEditor:
+ SetEditorEnvironment((PEDIT_WND_INFO)EditorType,
+ FALSE);
+ break;
+
+ default:
+ break;
+ }
+
+ Info->ActiveEditor = NULL;
+ }
+ }
+
+ if (hActivate != NULL)
+ {
+ EditorType = (PMDI_EDITOR_TYPE)GetWindowLongPtr(hActivate,
+ GWLP_USERDATA);
+ if (EditorType != NULL)
+ {
+ Info->ActiveEditor = EditorType;
+
+ switch (*EditorType)
+ {
+ case metImageEditor:
+ SetEditorEnvironment((PEDIT_WND_INFO)EditorType,
+ TRUE);
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+}
+
+HWND
+CreateMainWindow(LPCTSTR lpCaption,
+ int nCmdShow)
+{
+ PMAIN_WND_INFO Info;
+ HWND hMainWnd = NULL;
+
+ Info = HeapAlloc(ProcessHeap,
+ 0,
+ sizeof(MAIN_WND_INFO));
+ if (Info != NULL)
+ {
+ ZeroMemory(Info,
+ sizeof(MAIN_WND_INFO));
+ Info->nCmdShow = nCmdShow;
+
+ /* FIXME - load the window position from the registry */
+
+ hMainWnd = CreateWindowEx(WS_EX_WINDOWEDGE,
+ szMainWndClass,
+ lpCaption,
+ WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ NULL,
+ NULL,
+ hInstance,
+ Info);
+ if (hMainWnd == NULL)
+ {
+ HeapFree(ProcessHeap,
+ 0,
+ Info);
+ }
+ }
+
+ return hMainWnd;
+}
+
+BOOL
+MainWndTranslateMDISysAccel(HWND hwnd,
+ LPMSG lpMsg)
+{
+ PMAIN_WND_INFO Info;
+
+ /* Get the window context */
+ Info = (PMAIN_WND_INFO)GetWindowLongPtr(hwnd,
+ GWLP_USERDATA);
+ if (Info != NULL && Info->hMdiClient != NULL)
+ {
+ return TranslateMDISysAccel(Info->hMdiClient,
+ lpMsg);
+ }
+
+ return FALSE;
+}
+
+BOOL
+InitMainWindowImpl(VOID)
+{
+ WNDCLASSEX wc = {0};
+
+ wc.cbSize = sizeof(WNDCLASSEX);
+ wc.lpfnWndProc = MainWndProc;
+ wc.hInstance = hInstance;
+ wc.hIcon = LoadIcon(hInstance,
+ MAKEINTRESOURCE(IDI_ICON));
+ wc.hCursor = LoadCursor(NULL,
+ IDC_ARROW);
+ wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
+ wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAINMENU);
+ wc.lpszClassName = szMainWndClass;
+ wc.hIconSm = (HICON)LoadImage(hInstance,
+ MAKEINTRESOURCE(IDI_ICON),
+ IMAGE_ICON,
+ 16,
+ 16,
+ LR_SHARED);
+
+ return RegisterClassEx(&wc) != (ATOM)0;
+}
+
+VOID
+UninitMainWindowImpl(VOID)
+{
+ UnregisterClass(szMainWndClass,
+ hInstance);
+}