BEGIN\r
POPUP "&File"\r
BEGIN\r
- MENUITEM "New...", ID_NEW\r
- MENUITEM "Open...", ID_OPEN\r
- MENUITEM "Close", ID_CLOSE, GRAYED\r
- MENUITEM "Close all", ID_CLOSEALL, GRAYED\r
+ MENUITEM "&New...", ID_NEW\r
+ MENUITEM "&Open...", ID_OPEN\r
MENUITEM SEPARATOR\r
- MENUITEM "Save", ID_SAVE, GRAYED\r
- MENUITEM "Save As", ID_SAVEAS, GRAYED\r
+ MENUITEM "&Close\tCtrl+F4", ID_CLOSE, GRAYED\r
+ MENUITEM "C&lose all", ID_CLOSEALL, GRAYED\r
MENUITEM SEPARATOR\r
- MENUITEM "Print Preview", ID_PRINTPRE, GRAYED\r
- MENUITEM "Print...", ID_PRINT, GRAYED\r
+ MENUITEM "&Save", ID_SAVE, GRAYED\r
+ MENUITEM "Save &As...", ID_SAVEAS, GRAYED\r
MENUITEM SEPARATOR\r
- MENUITEM "Properties...", ID_PROP, GRAYED\r
+ MENUITEM "Print Pre&view", ID_PRINTPRE, GRAYED\r
+ MENUITEM "&Print...", ID_PRINT, GRAYED\r
MENUITEM SEPARATOR\r
- MENUITEM "E&xit", ID_EXIT\r
+ MENUITEM "Pr&operties...", ID_PROP, GRAYED\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "E&xit\tAlt+F4", ID_EXIT\r
END\r
- POPUP "Edit"\r
+ POPUP "&Edit"\r
BEGIN\r
- MENUITEM "Undo", ID_UNDO, GRAYED\r
- MENUITEM "Redo", ID_REDO, GRAYED\r
+ MENUITEM "&Undo", ID_UNDO, GRAYED\r
+ MENUITEM "&Redo", ID_REDO, GRAYED\r
MENUITEM SEPARATOR\r
- MENUITEM "Cut", ID_CUT, GRAYED\r
- MENUITEM "Copy", ID_COPY, GRAYED\r
- MENUITEM "Paste", ID_PASTE, GRAYED\r
- MENUITEM "Paste as new image",ID_PASTENEWIMAGE, GRAYED\r
+ MENUITEM "Cu&t", ID_CUT, GRAYED\r
+ MENUITEM "&Copy", ID_COPY, GRAYED\r
+ MENUITEM "&Paste", ID_PASTE, GRAYED\r
+ MENUITEM "Paste as new &image", ID_PASTENEWIMAGE, GRAYED\r
MENUITEM SEPARATOR\r
- MENUITEM "Select All", ID_SELALL, GRAYED\r
+ MENUITEM "Select &All", ID_SELALL, GRAYED\r
END\r
- POPUP "View"\r
+ POPUP "&View"\r
BEGIN\r
- MENUITEM "Tools", ID_TOOLS, CHECKED\r
- MENUITEM "Status Bar", ID_STATUSBAR, CHECKED\r
+ MENUITEM "&Tools", ID_TOOLS, CHECKED\r
+ MENUITEM "&Status Bar", ID_STATUSBAR, CHECKED\r
END\r
- POPUP "Image"\r
+ POPUP "&Image"\r
BEGIN\r
- MENUITEM "Crop", -1, GRAYED\r
- MENUITEM "Resize", -1, GRAYED\r
- MENUITEM "Rotate", -1, GRAYED\r
- MENUITEM "Flip", -1, GRAYED\r
- MENUITEM "Stretch", -1, GRAYED\r
- MENUITEM "Skew", -1, GRAYED\r
- MENUITEM "Invert Colours", -1, GRAYED\r
+ MENUITEM "&Crop...", -1, GRAYED\r
+ MENUITEM "&Resize...", -1, GRAYED\r
+ MENUITEM "R&otate...", -1, GRAYED\r
+ MENUITEM "&Flip...", -1, GRAYED\r
+ MENUITEM "&Stretch...", -1, GRAYED\r
+ MENUITEM "S&kew...", -1, GRAYED\r
+ MENUITEM "&Invert Colors", -1, GRAYED\r
MENUITEM SEPARATOR\r
- MENUITEM "Attributes", -1, GRAYED\r
+ MENUITEM "&Attributes...", -1, GRAYED\r
END\r
- POPUP "Colours"\r
+ POPUP "&Colors"\r
BEGIN\r
- MENUITEM "Edit Colours...", ID_EDITCOLOURS\r
+ MENUITEM "&Edit Colors...", ID_EDITCOLOURS\r
END\r
- POPUP "Window"\r
+ POPUP "&Window"\r
BEGIN\r
- MENUITEM "Tile", -1\r
- MENUITEM "Cascade", -1\r
+ MENUITEM "&Cascade", ID_WINDOW_CASCADE\r
+ MENUITEM "Tile &Horizontally", ID_WINDOW_TILE_HORZ\r
+ MENUITEM "Tile &Vertiacally", ID_WINDOW_TILE_VERT\r
+ MENUITEM "&Arrange Icons", ID_WINDOW_ARRANGE\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "Nex&t\tCtrl+F6", ID_WINDOW_NEXT\r
END\r
- POPUP "Help"\r
+ POPUP "&Help"\r
BEGIN\r
- MENUITEM "About...", ID_ABOUT\r
+ MENUITEM "&About...", ID_ABOUT\r
END\r
END\r
\r
\r
STRINGTABLE DISCARDABLE\r
BEGIN\r
+ IDS_APPNAME "ImageSoft"\r
IDS_LICENSE "This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA."\r
-END\r
-\r
-/* status bar info */\r
-STRINGTABLE DISCARDABLE\r
-BEGIN\r
- IDS_CURPOS "Cursor : %d,%d"\r
- IDS_READY "Ready"\r
+ IDS_READY " Ready."\r
+ \r
+ IDS_TOOLBAR_STANDARD "Standard"\r
+ IDS_TOOLBAR_TEST "Test"\r
+ IDS_IMAGE_NAME "Image %1!u!"\r
END\r
\r
/* Tooltips */\r
IDS_TOOLTIP_UNDO "Undo"\r
IDS_TOOLTIP_REDO "Redo"\r
END\r
+\r
+/* Hints */\r
+STRINGTABLE DISCARDABLE\r
+BEGIN\r
+ IDS_HINT_EXIT " Exits this application."\r
+\r
+ IDS_HINT_SYS_RESTORE " Restores this window to normal size."\r
+ IDS_HINT_SYS_MOVE " Moves this window."\r
+ IDS_HINT_SYS_SIZE " Resizes this window."\r
+ IDS_HINT_SYS_MINIMIZE " Collapses this window to an icon."\r
+ IDS_HINT_SYS_MAXIMIZE " Expands this window to fill this screen."\r
+ IDS_HINT_SYS_CLOSE " Closes this window."\r
+ IDS_HINT_SYS_NEXT " Activates the next window."\r
+END\r
+\r
-#include "imagesoft.h"\r
-\r
-extern HINSTANCE hInstance;\r
+#include <precomp.h>\r
\r
#ifdef _MSC_VER\r
#pragma warning(disable : 4100)\r
#endif\r
-BOOL CALLBACK\r
+INT_PTR CALLBACK\r
AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
{\r
HWND hLicenseEditWnd;\r
-#include "imagesoft.h"\r
-\r
-#define ID_MDI_FIRSTCHILD 50000\r
-\r
-const TCHAR AppClassName[] = _T("Parent");\r
-const TCHAR ChildClassName[] = _T("Child");\r
-\r
+#include <precomp.h>\r
\r
HINSTANCE hInstance;\r
-HWND hMainWnd;\r
-HWND hMDIClient;\r
-HWND hStatus;\r
-HWND hTool;\r
-HWND hFloatTool;\r
-HMENU hShortcutMenu;\r
-\r
-WORD cxClient;\r
-WORD cyClient;\r
+HANDLE ProcessHeap;\r
\r
-/*\r
- * Initialize the structure and send a message to the MDI\r
- * frame requesting a new new child window.\r
- */\r
-HWND CreateNewMDIChild(HWND hMDIClient)\r
+#ifdef _MSC_VER\r
+#pragma warning(disable : 4100)\r
+#endif\r
+int WINAPI\r
+WinMain(HINSTANCE hThisInstance,\r
+ HINSTANCE hPrevInstance,\r
+ LPSTR lpCmdLine,\r
+ int nCmdShow)\r
{\r
- MDICREATESTRUCT mcs;\r
- HWND hChild;\r
- TCHAR Buf[15];\r
- static DWORD MDINum = 1;\r
- DWORD style;\r
-\r
- _sntprintf(Buf, sizeof(Buf) / sizeof(TCHAR), _T("Untitled%d"), MDINum);\r
+ LPTSTR lpAppName;\r
+ HWND hMainWnd;\r
+ MSG Msg;\r
+ BOOL bRet;\r
+ int Ret = 1;\r
+ INITCOMMONCONTROLSEX icex;\r
\r
- style = 0;//MDIS_ALLCHILDSTYLES & ~WS_BORDER;\r
+ hInstance = hThisInstance;\r
+ ProcessHeap = GetProcessHeap();\r
\r
- mcs.szTitle = Buf;\r
- mcs.szClass = ChildClassName;\r
- mcs.hOwner = hInstance;\r
- mcs.x = mcs.cx = CW_USEDEFAULT;\r
- mcs.y = mcs.cy = CW_USEDEFAULT;\r
- mcs.style = style; //MDIS_ALLCHILDSTYLES | WS_MAXIMIZE;\r
+ icex.dwSize = sizeof(INITCOMMONCONTROLSEX);\r
+ icex.dwICC = ICC_BAR_CLASSES | ICC_COOL_CLASSES;\r
+ InitCommonControlsEx(&icex);\r
\r
- hChild = (HWND)SendMessage(hMDIClient, WM_MDICREATE, 0, (LPARAM)&mcs);\r
- if(!hChild)\r
+ if (!AllocAndLoadString(&lpAppName,\r
+ hInstance,\r
+ IDS_APPNAME))\r
{\r
- MessageBox(hMDIClient, _T("MDI Child creation failed."), _T("Error!"),\r
- MB_ICONEXCLAMATION | MB_OK);\r
- return hChild;\r
+ return 1;\r
}\r
\r
- MDINum++;\r
- return hChild;\r
-}\r
-\r
-\r
-/*\r
- * Main program message handler\r
- */\r
-LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)\r
-{\r
- switch(msg)\r
+ if (TbdInitImpl())\r
{\r
- case WM_CREATE:\r
- {\r
- CLIENTCREATESTRUCT ccs;\r
- TBADDBITMAP tbab;\r
- HMENU hMenu;\r
- INT iImageOffset;\r
- INT statwidths[] = {300, 450, 550, -1}; /* widths of status bar */\r
- TCHAR Buf[6];\r
-\r
- /* Standard toolbar buttons */\r
- TBBUTTON StdButtons [NUM_BUTTONS] =\r
- {\r
- /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */\r
- {STD_FILENEW, ID_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0, 0}, /* new */\r
- {STD_FILEOPEN, ID_OPEN, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, /* open */\r
- {STD_FILESAVE, ID_SAVE, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0}, /* save */\r
-\r
- {10, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, /* separator */\r
-\r
- {STD_PRINTPRE, ID_PRINTPRE, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* print */\r
- {STD_PRINT, ID_PRINT, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* print preview */\r
-\r
- {10, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, /* separator */\r
-\r
- {STD_CUT, ID_CUT, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* cut */\r
- {STD_COPY, ID_COPY, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* copy */\r
- {STD_PASTE, ID_PASTE, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* paste */\r
-\r
- {10, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, /* separator */\r
-\r
- {STD_UNDO, ID_UNDO, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* undo */\r
- {STD_REDOW, ID_REDO, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* redo */\r
-\r
- {10, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0},\r
- };\r
-\r
-\r
-/* ======================== Create Std Toolbar ============================== */\r
-\r
- /* Create Toolbar */\r
- hTool = CreateWindowEx(0,\r
- TOOLBARCLASSNAME,\r
- NULL,\r
- WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_TOOLTIPS,\r
- 0, 0, 0, 0,\r
- hwnd,\r
- (HMENU)IDC_TOOLBAR,\r
- hInstance,\r
- NULL);\r
- if(hTool == NULL)\r
- MessageBox(hwnd, _T("Could not create tool bar."), _T("Error!"), MB_OK | MB_ICONERROR);\r
-\r
- /* Send the TB_BUTTONSTRUCTSIZE message, which is required for backward compatibility */\r
- SendMessage(hTool, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);\r
-\r
- /* Add standard images */\r
- tbab.hInst = HINST_COMMCTRL;\r
- tbab.nID = IDB_STD_SMALL_COLOR;\r
- SendMessage(hTool, TB_ADDBITMAP, NUM_BUTTONS, (LPARAM)&tbab);\r
-\r
- /* Add buttons to toolbar */\r
- SendMessage(hTool, TB_ADDBUTTONS, NUM_BUTTONS, (LPARAM) &StdButtons);\r
-\r
- /* Show toolbar */\r
- ShowWindow(hTool, SW_SHOW);\r
-\r
-\r
-\r
-/* ======================== Create Floating Toolbar ============================== */\r
-\r
- hFloatTool = CreateDialog(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_TOOLBAR),\r
- hwnd, (DLGPROC)ToolDlgProc);\r
- if(hFloatTool != NULL)\r
- {\r
- ;//ShowWindow(hFloatTool, SW_SHOW);\r
- }\r
- else\r
- {\r
- MessageBox(hwnd, _T("CreateDialog returned NULL"), _T("Warning!"),\r
- MB_OK | MB_ICONINFORMATION);\r
- }\r
-\r
- /* Send the TB_BUTTONSTRUCTSIZE message, which is required for backward compatibility */\r
- SendMessage(hFloatTool, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);\r
-\r
- /* Add custom images */\r
- tbab.hInst = HINST_COMMCTRL;\r
- tbab.nID = IDB_STD_SMALL_COLOR;\r
- iImageOffset = (INT)SendMessage(hFloatTool, TB_ADDBITMAP, 10, (LPARAM)&tbab);\r
-\r
- /* StdButtons[0].iBitmap += iImageOffset; / * properties * /\r
- StdButtons[1].iBitmap += iImageOffset; / * refresh * /\r
- StdButtons[2].iBitmap += iImageOffset; / * export * /\r
- StdButtons[4].iBitmap += iImageOffset; / * create * /\r
- StdButtons[6].iBitmap += iImageOffset; / * start * /\r
- StdButtons[7].iBitmap += iImageOffset; / * stop * /\r
- StdButtons[8].iBitmap += iImageOffset; / * pause * /\r
- StdButtons[9].iBitmap += iImageOffset; / * restart * /\r
- StdButtons[11].iBitmap += iImageOffset; / * help * /\r
- StdButtons[12].iBitmap += iImageOffset; / * exit * /\r
-*/\r
-\r
- /* Add buttons to toolbar */\r
- SendMessage(hFloatTool, TB_ADDBUTTONS, NUM_BUTTONS, (LPARAM) &StdButtons);\r
-\r
- /* Show toolbar */\r
- //ShowWindow(hFloatTool, SW_SHOWNORMAL);\r
-\r
-\r
-\r
-/* ======================== Create Status Bar ============================== */\r
-\r
- hStatus = CreateWindowEx(0,\r
- STATUSCLASSNAME,\r
- NULL,\r
- WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP,\r
- 0, 0, 0, 0,\r
- hwnd,\r
- (HMENU)IDC_STATUSBAR,\r
- hInstance,\r
- NULL);\r
- if(hStatus == NULL)\r
- MessageBox(hwnd, _T("Could not create status bar."),\r
- _T("Error!"), MB_OK | MB_ICONERROR);\r
-\r
- SendMessage(hStatus, SB_SETPARTS, sizeof(statwidths)/sizeof(int), (LPARAM)statwidths);\r
-\r
-\r
-/* ======================== Create Popup Menu ============================== */\r
-\r
- hShortcutMenu = LoadMenu(hInstance, MAKEINTRESOURCE (IDR_POPUP));\r
- hShortcutMenu = GetSubMenu(hShortcutMenu, 0);\r
-\r
-\r
-/* ======================= Create MDI Client ============================= */\r
-\r
- /* Find window menu where children will be listed */\r
- ccs.hWindowMenu = GetSubMenu(GetMenu(hwnd), 5);\r
- ccs.idFirstChild = ID_MDI_FIRSTCHILD;\r
-\r
- hMDIClient = CreateWindowEx(WS_EX_CLIENTEDGE,\r
- _T("mdiclient"),\r
- NULL,\r
- WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL | WS_VISIBLE,\r
- CW_USEDEFAULT,\r
- CW_USEDEFAULT,\r
- CW_USEDEFAULT,\r
- CW_USEDEFAULT,\r
- hwnd,\r
- (HMENU)IDC_MAIN_MDI,\r
- GetModuleHandle(NULL),\r
- (LPVOID)&ccs);\r
-\r
-\r
- if(hMDIClient == NULL)\r
- MessageBox(hwnd, _T("Could not create MDI client."),\r
- _T("Error!"), MB_OK | MB_ICONERROR);\r
-\r
-\r
-/* ======================= Miscelaneous ============================= */\r
-\r
- hMenu = GetMenu(hwnd);\r
-\r
- EnableMenuItem(hMenu, 1, MF_DELETE); /* edit */\r
- EnableMenuItem(hMenu, 2, MF_REMOVE); /* image */\r
- EnableMenuItem(hMenu, 3, MF_BYPOSITION | MF_REMOVE); /* colours */\r
- EnableMenuItem(hMenu, 4, MF_BYPOSITION | MF_DELETE); /* window */\r
-\r
-\r
- /* indicate program is ready in the status bar */\r
- LoadString(hInstance, IDS_READY, Buf, sizeof(Buf) / sizeof(TCHAR));\r
- SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)Buf);\r
-\r
- /* inilalize file open/save structure */\r
- FileInitialize(hwnd);\r
-\r
- //Style = GetWindowLong(hwnd, GWL_STYLE);\r
-\r
- //SetWindowLong(hwnd, GWL_STYLE, (Style & DS_CENTER));\r
-\r
- }\r
- break;\r
-\r
- case WM_SIZE:\r
- {\r
- RECT rcTool;\r
- int iToolHeight;\r
-\r
- RECT rcStatus;\r
- int iStatusHeight;\r
-\r
- HWND hMDI;\r
- int iMDIHeight;\r
- RECT rcClient;\r
-\r
- cxClient = LOWORD(lParam);\r
- cyClient = HIWORD(lParam);\r
-\r
- /* Size toolbar and get height */\r
- hTool = GetDlgItem(hwnd, IDC_TOOLBAR);\r
- SendMessage(hTool, TB_AUTOSIZE, 0, 0);\r
-\r
- GetWindowRect(hTool, &rcTool);\r
- iToolHeight = rcTool.bottom - rcTool.top;\r
-\r
- /* Size status bar and get height */\r
- hStatus = GetDlgItem(hwnd, IDC_STATUSBAR);\r
- GetWindowRect(hStatus, &rcStatus);\r
- iStatusHeight = rcStatus.bottom - rcStatus.top;\r
-\r
- /* Calculate remaining height and size for the MDI frame */\r
- GetClientRect(hwnd, &rcClient);\r
-\r
- iMDIHeight = rcClient.bottom - iToolHeight - iStatusHeight;\r
-\r
- hMDI = GetDlgItem(hwnd, IDC_MAIN_MDI);\r
- SetWindowPos(hMDIClient, NULL, 0, iToolHeight, rcClient.right, iMDIHeight, SWP_NOZORDER);\r
- }\r
- break;\r
-\r
- case WM_NOTIFY:\r
- {\r
- NMHDR* nm = (NMHDR*) lParam;\r
-\r
- switch (nm->code)\r
- {\r
- case TTN_GETDISPINFO:\r
- {\r
- LPTOOLTIPTEXT lpttt;\r
- UINT idButton;\r
-\r
- lpttt = (LPTOOLTIPTEXT) lParam;\r
-\r
- /* Specify the resource identifier of the descriptive\r
- * text for the given button. */\r
- idButton = (UINT)lpttt->hdr.idFrom;\r
- switch (idButton)\r
- {\r
- case ID_NEW:\r
- lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_NEW);\r
- break;\r
-\r
- case ID_OPEN:\r
- lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_OPEN);\r
- break;\r
-\r
- case ID_SAVE:\r
- lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_SAVE);\r
- break;\r
-\r
- case ID_PRINTPRE:\r
- lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_PRINTPRE);\r
- break;\r
-\r
- case ID_PRINT:\r
- lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_PRINT);\r
- break;\r
-\r
- case ID_CUT:\r
- lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_CUT);\r
- break;\r
-\r
- case ID_COPY:\r
- lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_COPY);\r
- break;\r
-\r
- case ID_PASTE:\r
- lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_PASTE);\r
- break;\r
-\r
- case ID_UNDO:\r
- lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_UNDO);\r
- break;\r
-\r
- case ID_REDO:\r
- lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_REDO);\r
- break;\r
-\r
- }\r
- }\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
- }\r
- break;\r
-/*\r
- case WM_CONTEXTMENU:\r
+ if (InitMainWindowImpl())\r
{\r
- int xPos, yPos;\r
-\r
- xPos = GET_X_LPARAM(lParam);\r
- yPos = GET_Y_LPARAM(lParam);\r
-\r
- TrackPopupMenuEx(hShortcutMenu, TPM_RIGHTBUTTON,\r
- xPos, yPos, hwnd, NULL);\r
- }\r
- break;\r
-*/\r
- case WM_COMMAND:\r
-\r
- switch(LOWORD(wParam))\r
+ if (InitImageEditWindowImpl())\r
{\r
- case ID_NEW:\r
- CreateNewMDIChild(hMDIClient);\r
- break;\r
-\r
- case ID_OPEN:\r
- DoOpenFile(hwnd);\r
- break;\r
-\r
- case ID_SAVEAS:\r
- DoSaveFile(hwnd);\r
- break;\r
-\r
- case ID_CLOSE:\r
+ hMainWnd = CreateMainWindow(lpAppName,\r
+ nCmdShow);\r
+ if (hMainWnd != NULL)\r
{\r
- /* close the active child window */\r
- HWND hChild = (HWND)SendMessage(hMDIClient, WM_MDIGETACTIVE,0,0);\r
- if(hChild)\r
+ /* pump the message queue */\r
+ while((bRet = GetMessage(&Msg,\r
+ NULL,\r
+ 0,\r
+ 0) != 0))\r
{\r
- SendMessage(hChild, WM_CLOSE, 0, 0);\r
+ if (bRet != (BOOL)-1)\r
+ {\r
+ if (!MainWndTranslateMDISysAccel(hMainWnd,\r
+ &Msg))\r
+ {\r
+ TranslateMessage(&Msg);\r
+ DispatchMessage(&Msg);\r
+ }\r
+ }\r
}\r
- }\r
- break;\r
\r
- case ID_CLOSEALL:\r
- {\r
- HWND hChild;\r
- /* loop until all windows have been closed */\r
- while ((hChild = (HWND)SendMessage(hMDIClient, WM_MDIGETACTIVE,0,0)) != NULL)\r
- {\r
- SendMessage(hChild, WM_CLOSE, 0, 0);\r
- }\r
+ Ret = 0;\r
}\r
- break;\r
\r
- case ID_TOOLS:\r
- ShowHideToolbar(hFloatTool);\r
- break;\r
-\r
- case ID_STATUSBAR:\r
- ShowHideToolbar(hStatus);\r
- /* FIXME: Need to resize client area */\r
- break;\r
-\r
- case ID_EXIT:\r
- PostMessage(hwnd, WM_CLOSE, 0, 0);\r
- break;\r
-\r
- case ID_EDITCOLOURS:\r
- {\r
- /* open up the colour selection dialog */\r
-\r
- static CHOOSECOLOR cc;\r
- static COLORREF crCustColors[16];\r
-\r
- cc.lStructSize = sizeof(CHOOSECOLOR);\r
- cc.hwndOwner = hwnd;\r
- cc.hInstance = NULL;\r
- cc.rgbResult = RGB(0x80, 0x80, 0x80);\r
- cc.lpCustColors = crCustColors;\r
- cc.Flags = CC_RGBINIT | CC_FULLOPEN;\r
- cc.lCustData = 0;\r
- cc.lpfnHook = NULL;\r
- cc.lpTemplateName = NULL;\r
-\r
- ChooseColor(&cc);\r
- }\r
- break;\r
-\r
- case ID_WINDOW_TILE:\r
- SendMessage(hMDIClient, WM_MDITILE, 0, 0);\r
- break;\r
-\r
- case ID_WINDOW_CASCADE:\r
- SendMessage(hMDIClient, WM_MDICASCADE, 0, 0);\r
- break;\r
-\r
- case ID_ABOUT:\r
- DialogBox(hInstance,\r
- MAKEINTRESOURCE(IDD_ABOUTBOX),\r
- hMainWnd,\r
- (DLGPROC)AboutDialogProc);\r
- break;\r
-\r
- default:\r
- /* Catch all commands that I didn't process directly and do\r
- * a check to see if the value is greater than or equal to\r
- * ID_MDI_FIRSTCHILD. If it is, then the user has clicked\r
- * on one of the Window menu items and we send the message\r
- * on to DefFrameProc() for processing.\r
- */\r
- if(LOWORD(wParam) >= ID_MDI_FIRSTCHILD)\r
- DefFrameProc(hwnd, hMDIClient, WM_COMMAND, wParam, lParam);\r
- else\r
- {\r
- HWND hChild = (HWND)SendMessage(hMDIClient, WM_MDIGETACTIVE,0,0);\r
- if(hChild)\r
- SendMessage(hChild, WM_COMMAND, wParam, lParam);\r
- }\r
- }\r
- break;\r
-\r
- case WM_CLOSE:\r
- DestroyMenu(hShortcutMenu);\r
- DestroyWindow(hwnd);\r
- break;\r
-\r
- case WM_DESTROY:\r
- PostQuitMessage(0);\r
- break;\r
-\r
- default:\r
- return DefFrameProc(hwnd, hMDIClient, msg, wParam, lParam);\r
- }\r
- return 0;\r
-}\r
-\r
-\r
-void GetLargestDisplayMode (int * pcxBitmap, int * pcyBitmap)\r
-{\r
- DEVMODE devmode ;\r
- int iModeNum = 0 ;\r
-\r
- * pcxBitmap = * pcyBitmap = 0 ;\r
-\r
- ZeroMemory (&devmode, sizeof (DEVMODE)) ;\r
- devmode.dmSize = sizeof (DEVMODE) ;\r
-\r
- while (EnumDisplaySettings (NULL, iModeNum++, &devmode))\r
- {\r
- * pcxBitmap = max (* pcxBitmap, (int) devmode.dmPelsWidth) ;\r
- * pcyBitmap = max (* pcyBitmap, (int) devmode.dmPelsHeight) ;\r
- }\r
-}\r
-\r
-\r
-\r
-/*\r
- * MDI child window message handler\r
- */\r
-LRESULT CALLBACK MDIChildWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)\r
-{\r
- static BOOL fLeftButtonDown, fRightButtonDown;\r
- static HBITMAP hBitmap;\r
- static HDC hdcMem;\r
- static INT cxBitmap, cyBitmap, cxClient, cyClient, xMouse, yMouse;\r
- HDC hdc;\r
- PAINTSTRUCT ps;\r
-\r
- switch(msg)\r
- {\r
- case WM_CREATE:\r
- GetLargestDisplayMode(&cxBitmap, &cyBitmap);\r
-\r
- hdc = GetDC(hwnd);\r
- hBitmap = CreateCompatibleBitmap(hdc, cxBitmap, cyBitmap);\r
- hdcMem = CreateCompatibleDC(hdc);\r
- ReleaseDC(hwnd, hdc);\r
-\r
- if (!hBitmap) // no memory for bitmap\r
- {\r
- DeleteDC(hdcMem);\r
- return -1;\r
+ UninitImageEditWindowImpl();\r
}\r
\r
- SelectObject(hdcMem, hBitmap);\r
- PatBlt(hdcMem, 0, 0, cxBitmap, cyBitmap, WHITENESS);\r
-\r
- break;\r
-\r
- case WM_MDIACTIVATE:\r
- {\r
- HMENU hMenu, hFileMenu;\r
- UINT EnableFlag;\r
-\r
- hMenu = GetMenu(hMainWnd);\r
- if(hwnd == (HWND)lParam)\r
- { /* being activated, enable the menus */\r
- EnableFlag = MF_ENABLED;\r
- }\r
- else\r
- {\r
- TCHAR Buf[6];\r
- /* being de-activated, gray the menus */\r
- EnableFlag = MF_GRAYED;\r
-\r
- /* indicate program is ready in the status bar */\r
- LoadString(hInstance, IDS_READY, Buf, sizeof(Buf) / sizeof(TCHAR));\r
- SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)Buf);\r
- }\r
-\r
- EnableMenuItem(hMenu, 1, MF_BYPOSITION | EnableFlag); /* edit */\r
- EnableMenuItem(hMenu, 2, MF_BYPOSITION | EnableFlag); /* image */\r
- EnableMenuItem(hMenu, 3, MF_BYPOSITION | EnableFlag); /* colours */\r
- EnableMenuItem(hMenu, 4, MF_BYPOSITION | EnableFlag); /* window */\r
-\r
- hFileMenu = GetSubMenu(hMenu, 0);\r
- EnableMenuItem(hFileMenu, ID_SAVEAS, MF_BYCOMMAND | EnableFlag);\r
-\r
- EnableMenuItem(hFileMenu, ID_CLOSE, MF_BYCOMMAND | EnableFlag);\r
- EnableMenuItem(hFileMenu, ID_CLOSEALL, MF_BYCOMMAND | EnableFlag);\r
-\r
- SendMessage(hTool, TB_SETSTATE, ID_COPY,\r
- (LPARAM)MAKELONG(TBSTATE_ENABLED, 0));\r
-\r
- DrawMenuBar(hMainWnd);\r
+ UninitMainWindowImpl();\r
}\r
- break;\r
-\r
- case WM_NOTIFY:\r
- {\r
- MSG mymsg;\r
- PeekMessage(&mymsg, NULL, 0, 0, PM_REMOVE);\r
- }\r
- break;\r
-\r
- case WM_MOUSEMOVE:\r
- {\r
- POINT pt;\r
- TCHAR Buf[200];\r
- TCHAR Cur[15];\r
-\r
- pt.x = LOWORD(lParam);\r
- pt.y = HIWORD(lParam);\r
-\r
- /* set cursor location in the status bar */\r
- LoadString(hInstance, IDS_CURPOS, Cur, sizeof(Cur) / sizeof(TCHAR));\r
- _sntprintf(Buf, sizeof(Buf) / sizeof(TCHAR), Cur, pt.x, pt.y);\r
- SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)Buf);\r
-\r
- /* change cursor to a cross */\r
- /*FIXME: can this be forced into the MDI child class? */\r
- SetCursor (LoadCursor (NULL, IDC_CROSS));\r
-\r
- if (!fLeftButtonDown && !fRightButtonDown)\r
- break;\r
-\r
- hdc = GetDC(hwnd);\r
-\r
- SelectObject(hdc,\r
- GetStockObject(fLeftButtonDown ? BLACK_PEN : WHITE_PEN) );\r
\r
- SelectObject(hdcMem,\r
- GetStockObject(fLeftButtonDown ? BLACK_PEN : WHITE_PEN) );\r
-\r
- MoveToEx (hdc, xMouse, yMouse, NULL);\r
- MoveToEx (hdcMem, xMouse, yMouse, NULL);\r
-\r
- xMouse = (short) LOWORD(lParam);\r
- yMouse = (short) HIWORD(lParam);\r
-\r
- LineTo(hdc, xMouse, yMouse);\r
- LineTo(hdcMem, xMouse, yMouse);\r
-\r
- ReleaseDC(hwnd, hdc);\r
- }\r
- break;\r
-\r
- case WM_LBUTTONDOWN:\r
- if (!fRightButtonDown)\r
- SetCapture(hwnd);\r
-\r
- xMouse = LOWORD(lParam);\r
- yMouse = HIWORD(lParam);\r
- fLeftButtonDown = TRUE;\r
- break;\r
-\r
- case WM_LBUTTONUP:\r
- if (fLeftButtonDown)\r
- SetCapture(NULL);\r
-\r
- fLeftButtonDown = FALSE;\r
- break;\r
-\r
- case WM_RBUTTONDOWN:\r
- if (!fLeftButtonDown)\r
- SetCapture(hwnd);\r
-\r
- xMouse = LOWORD(lParam);\r
- yMouse = HIWORD(lParam);\r
- fRightButtonDown = TRUE;\r
- break;\r
-\r
- case WM_RBUTTONUP:\r
- if (fRightButtonDown)\r
- SetCapture(NULL);\r
-\r
- fRightButtonDown = FALSE;\r
- break;\r
-\r
- case WM_PAINT:\r
- hdc = BeginPaint(hwnd, &ps);\r
-\r
- BitBlt(hdc, 0, 0, cxClient, cyClient, hdcMem, 0, 0, SRCCOPY);\r
-\r
- EndPaint(hwnd, &ps);\r
- break;\r
-\r
- case WM_SIZE:\r
-\r
-\r
- return DefMDIChildProc(hwnd, msg, wParam, lParam);\r
-\r
- case WM_DESTROY:\r
- DeleteDC(hdcMem);\r
- DeleteObject(hBitmap);\r
- break;\r
-\r
-\r
- default:\r
- {\r
- TCHAR Buf[6];\r
-\r
- /* indicate program is ready in the status bar */\r
- LoadString(hInstance, IDS_READY, Buf, sizeof(Buf) / sizeof(TCHAR));\r
- SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)Buf);\r
-\r
- return DefMDIChildProc(hwnd, msg, wParam, lParam);\r
- }\r
-\r
- }\r
- return 0;\r
-}\r
-\r
-/*\r
- * Register the MDI child window class\r
- */\r
-BOOL SetUpMDIChildWindowClass(HINSTANCE hInstance)\r
-{\r
- WNDCLASSEX wc;\r
-\r
- wc.cbSize = sizeof(WNDCLASSEX);\r
- wc.style = CS_HREDRAW | CS_VREDRAW;\r
- wc.lpfnWndProc = MDIChildWndProc;\r
- wc.cbClsExtra = 0;\r
- wc.cbWndExtra = 0;\r
- wc.hInstance = hInstance;\r
- wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);\r
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);\r
- wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);\r
- wc.lpszMenuName = NULL;\r
- wc.lpszClassName = ChildClassName;\r
- wc.hIconSm = (HICON)LoadImage(hInstance,\r
- MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, 16, 16, 0);\r
-\r
- if(!RegisterClassEx(&wc))\r
- {\r
- MessageBox(0, _T("Could Not Register Child Window"), _T("Error!"),\r
- MB_ICONEXCLAMATION | MB_OK);\r
- return FALSE;\r
- }\r
- else\r
- return TRUE;\r
-}\r
-\r
-#ifdef _MSC_VER\r
-#pragma warning(disable : 4100)\r
-#endif\r
-int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance,\r
- LPSTR lpCmdLine, int nCmdShow)\r
-{\r
- WNDCLASSEX wc;\r
- MSG Msg;\r
- INITCOMMONCONTROLSEX icex;\r
-\r
- hInstance = hThisInstance;\r
-\r
- icex.dwSize = sizeof(INITCOMMONCONTROLSEX);\r
- icex.dwICC = ICC_BAR_CLASSES;\r
- InitCommonControlsEx(&icex);\r
-\r
- wc.cbSize = sizeof(WNDCLASSEX);\r
- wc.style = 0;\r
- wc.lpfnWndProc = WndProc;\r
- wc.cbClsExtra = 0;\r
- wc.cbWndExtra = 0;\r
- wc.hInstance = hInstance;\r
- wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON));\r
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);\r
- wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);\r
- wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAINMENU);\r
- wc.lpszClassName = AppClassName;\r
- wc.hIconSm = (HICON)LoadImage(hInstance,\r
- MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, 16, 16, 0);\r
-\r
- if(!RegisterClassEx(&wc))\r
- {\r
- MessageBox(NULL, _T("Window Registration Failed!"), _T("Error!"),\r
- MB_ICONEXCLAMATION | MB_OK);\r
- return 0;\r
- }\r
-\r
- if(!SetUpMDIChildWindowClass(hInstance))\r
- return 0;\r
-\r
- hMainWnd = CreateWindowEx(0,\r
- AppClassName,\r
- _T("ImageSoft"),\r
- WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,\r
- CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,\r
- NULL, NULL, hInstance, NULL);\r
-\r
- if(hMainWnd == NULL)\r
- {\r
- MessageBox(NULL, _T("Window Creation Failed!"), _T("Error!"),\r
- MB_ICONEXCLAMATION | MB_OK);\r
- return 0;\r
+ TbdUninitImpl();\r
}\r
\r
- ShowWindow(hMainWnd, nCmdShow);\r
- UpdateWindow(hMainWnd);\r
+ LocalFree((HLOCAL)lpAppName);\r
\r
- while( GetMessage( &Msg, NULL, 0, 0 ) )\r
- {\r
- if (!TranslateMDISysAccel(hMDIClient, &Msg))\r
- {\r
- TranslateMessage(&Msg);\r
- DispatchMessage(&Msg);\r
- }\r
- }\r
- return (int)Msg.wParam;\r
+ return Ret;\r
}\r
+++ /dev/null
-#ifndef __PAINT_H\r
-#define __PAINT_H\r
-\r
-//#define WIN32_LEAN_AND_MEAN\r
-#include <windows.h>\r
-#include <windowsx.h> /* GET_X/Y_LPARAM */\r
-#include <stdio.h>\r
-#include <tchar.h>\r
-#include <commctrl.h>\r
-#include "resource.h"\r
-\r
-#define MAX_KEY_LENGTH 256\r
-#define NUM_BUTTONS 14\r
-\r
-BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);\r
-BOOL CALLBACK ToolDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);\r
-\r
-BOOL ShowHideToolbar(HWND hwnd);\r
-\r
-VOID FileInitialize(HWND hwnd);\r
-VOID DoOpenFile(HWND hwnd);\r
-VOID DoSaveFile(HWND hwnd);\r
-\r
-#endif /* __SERVMAN_H */\r
<?xml version="1.0"?>
<rbuild xmlns:xi="http://www.w3.org/2001/XInclude">
- <module name="imagesoft" type="win32gui" installbase="system32" installname="imagesoft.exe">
- <include base="imagesoft">.</include>
- <define name="UNICODE" />
- <define name="_UNICODE" />
- <define name="__REACTOS__" />
- <define name="__USE_W32API" />
- <define name="_WIN32_IE">0x600</define>
- <define name="_WIN32_WINNT">0x501</define>
- <library>kernel32</library>
- <library>gdi32</library>
- <library>user32</library>
- <library>advapi32</library>
- <library>version</library>
- <library>comctl32</library>
- <library>shell32</library>
- <library>comdlg32</library>
- <compilationunit name="unit.c">
- <file>about.c</file>
- <file>floattoolbar.c</file>
- <file>imagesoft.c</file>
- <file>opensave.c</file>
- </compilationunit>
- <file>imagesoft.rc</file>
- <pch>imagesoft.h</pch>
- </module>
+ <module name="imagesoft" type="win32gui" installbase="system32" installname="imagesoft.exe">
+ <include base="imagesoft">.</include>
+ <define name="UNICODE" />
+ <define name="_UNICODE" />
+ <define name="__USE_W32API" />
+ <define name="_WIN32_IE">0x0600</define>
+ <define name="_WIN32_WINNT">0x0501</define>
+ <library>ntdll</library>
+ <library>kernel32</library>
+ <library>gdi32</library>
+ <library>user32</library>
+ <library>advapi32</library>
+ <library>version</library>
+ <library>comctl32</library>
+ <library>shell32</library>
+ <library>comdlg32</library>
+ <compilationunit name="unit.c">
+ <file>about.c</file>
+ <file>imagesoft.c</file>
+ <file>imgedwnd.c</file>
+ <file>mainwnd.c</file>
+ <file>opensave.c</file>
+ <file>tooldock.c</file>
+ <file>misc.c</file>
+ </compilationunit>
+ <file>imagesoft.rc</file>
+ <pch>precomp.h</pch>
+ </module>
</rbuild>
\r
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\r
\r
+1 24 DISCARDABLE "manifest.xml"\r
+\r
IDI_ICON ICON "res/imagesoft.ico"\r
\r
#include "En.rc"\r
--- /dev/null
+#include <precomp.h>\r
+\r
+static const TCHAR szImageEditWndClass[] = TEXT("ImageSoftEditWndClass");\r
+\r
+#define IMAGE_FRAME_SIZE 1\r
+\r
+static VOID\r
+EditWndUpdateScrollInfo(PEDIT_WND_INFO Info)\r
+{\r
+ SCROLLINFO si;\r
+ RECT rcClient;\r
+\r
+ GetClientRect(Info->hSelf,\r
+ &rcClient);\r
+\r
+ si.cbSize = sizeof(si);\r
+ si.fMask = SIF_PAGE | SIF_RANGE;\r
+ si.nPage = rcClient.right - (2 * IMAGE_FRAME_SIZE);\r
+ si.nMin = 0;\r
+ si.nMax = Info->Width;\r
+\r
+ SetScrollInfo(Info->hSelf,\r
+ SB_HORZ,\r
+ &si,\r
+ TRUE);\r
+\r
+ si.nPage = rcClient.bottom - (2 * IMAGE_FRAME_SIZE);\r
+ si.nMax = Info->Height;\r
+ SetScrollInfo(Info->hSelf,\r
+ SB_VERT,\r
+ &si,\r
+ TRUE);\r
+}\r
+\r
+static BOOL\r
+InitEditWnd(PEDIT_WND_INFO Info)\r
+{\r
+ Info->Zoom = 100;\r
+\r
+ if (Info->OpenInfo != NULL)\r
+ {\r
+ if (Info->OpenInfo->CreateNew)\r
+ {\r
+ Info->Width = Info->OpenInfo->New.Width;\r
+ Info->Height = Info->OpenInfo->New.Height;\r
+ }\r
+ else\r
+ {\r
+ /* Load the image from file */\r
+ }\r
+\r
+ Info->OpenInfo = NULL;\r
+ }\r
+\r
+ EditWndUpdateScrollInfo(Info);\r
+\r
+ /* Add image editor to the list */\r
+ Info->Next = Info->MainWnd->ImageEditors;\r
+ Info->MainWnd->ImageEditors = Info;\r
+\r
+ /* FIXME - if returning FALSE, remove the image editor from the list! */\r
+ return TRUE;\r
+}\r
+\r
+static VOID\r
+DestroyEditWnd(PEDIT_WND_INFO Info)\r
+{\r
+ PEDIT_WND_INFO *PrevEditor;\r
+ PEDIT_WND_INFO Editor;\r
+\r
+ /* FIXME - free resources and run down editor */\r
+\r
+ /* Remove the image editor from the list */\r
+ PrevEditor = &Info->MainWnd->ImageEditors;\r
+ Editor = Info->MainWnd->ImageEditors;\r
+ do\r
+ {\r
+ if (Editor == Info)\r
+ {\r
+ *PrevEditor = Info->Next;\r
+ break;\r
+ }\r
+ PrevEditor = &Editor->Next;\r
+ Editor = Editor->Next;\r
+ } while (Editor != NULL);\r
+}\r
+\r
+static VOID\r
+ImageEditWndRepaint(PEDIT_WND_INFO Info,\r
+ HDC hDC,\r
+ LPPAINTSTRUCT lpps)\r
+{\r
+ /* FIXME */\r
+}\r
+\r
+static LRESULT CALLBACK\r
+ImageEditWndProc(HWND hwnd,\r
+ UINT uMsg,\r
+ WPARAM wParam,\r
+ LPARAM lParam)\r
+{\r
+ PEDIT_WND_INFO Info;\r
+ LRESULT Ret = 0;\r
+\r
+ /* Get the window context */\r
+ Info = (PEDIT_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_ERASEBKGND:\r
+ if (Info->Width != 0 && Info->Height != 0)\r
+ {\r
+ Ret = TRUE;\r
+ }\r
+ break;\r
+\r
+ case WM_PAINT:\r
+ {\r
+ if (Info->Width != 0 && Info->Height != 0)\r
+ {\r
+ PAINTSTRUCT ps;\r
+ HDC hDC;\r
+\r
+ hDC = BeginPaint(hwnd,\r
+ &ps);\r
+ if (hDC != NULL)\r
+ {\r
+ ImageEditWndRepaint(Info,\r
+ hDC,\r
+ &ps);\r
+\r
+ EndPaint(hwnd,\r
+ &ps);\r
+ }\r
+ }\r
+ break;\r
+ }\r
+\r
+ case WM_SIZE:\r
+ {\r
+ EditWndUpdateScrollInfo(Info);\r
+ goto HandleDefaultMessage;\r
+ }\r
+\r
+ case WM_MENUSELECT:\r
+ case WM_ENTERMENULOOP:\r
+ case WM_EXITMENULOOP:\r
+ /* forward these messages to the main window procedure */\r
+ Ret = SendMessage(Info->MainWnd->hSelf,\r
+ uMsg,\r
+ wParam,\r
+ lParam);\r
+ break;\r
+\r
+ case WM_MDIACTIVATE:\r
+ /* Switch the main window context if neccessary */\r
+ MainWndSwitchEditorContext(Info->MainWnd,\r
+ (HWND)wParam,\r
+ (HWND)lParam);\r
+ break;\r
+\r
+ case WM_CREATE:\r
+ {\r
+ Info = (PEDIT_WND_INFO)(((LPMDICREATESTRUCT)((LPCREATESTRUCT)lParam)->lpCreateParams)->lParam);\r
+ Info->hSelf = hwnd;\r
+\r
+ SetWindowLongPtr(hwnd,\r
+ GWLP_USERDATA,\r
+ (LONG_PTR)Info);\r
+\r
+ if (!InitEditWnd(Info))\r
+ {\r
+ Ret = (LRESULT)-1;\r
+ break;\r
+ }\r
+ break;\r
+ }\r
+\r
+ case WM_DESTROY:\r
+ {\r
+ DestroyEditWnd(Info);\r
+\r
+ HeapFree(ProcessHeap,\r
+ 0,\r
+ Info);\r
+ SetWindowLongPtr(hwnd,\r
+ GWLP_USERDATA,\r
+ 0);\r
+ break;\r
+ }\r
+\r
+ default:\r
+HandleDefaultMessage:\r
+ Ret = DefMDIChildProc(hwnd,\r
+ uMsg,\r
+ wParam,\r
+ lParam);\r
+ break;\r
+ }\r
+\r
+ return Ret;\r
+}\r
+\r
+VOID\r
+SetImageEditorEnvironment(PEDIT_WND_INFO Info,\r
+ BOOL Setup)\r
+{\r
+ if (Setup)\r
+ {\r
+ /* FIXME - setup editor environment (e.g. show toolbars, enable menus etc) */\r
+ }\r
+ else\r
+ {\r
+ /* FIXME - cleanup editor environment (e.g. hide toolbars, disable menus etc) */\r
+ }\r
+}\r
+\r
+BOOL\r
+CreateImageEditWindow(struct _MAIN_WND_INFO *MainWnd,\r
+ LPCTSTR lpCaption,\r
+ POPEN_IMAGE_EDIT_INFO OpenInfo)\r
+{\r
+ PEDIT_WND_INFO Info;\r
+ HWND hWndEditor;\r
+\r
+ Info = HeapAlloc(ProcessHeap,\r
+ 0,\r
+ sizeof(EDIT_WND_INFO));\r
+ if (Info != NULL)\r
+ {\r
+ ZeroMemory(Info,\r
+ sizeof(EDIT_WND_INFO));\r
+ Info->MainWnd = MainWnd;\r
+ Info->MdiEditorType = metImageEditor;\r
+ Info->OpenInfo = OpenInfo;\r
+\r
+ hWndEditor = CreateMDIWindow(szImageEditWndClass,\r
+ lpCaption,\r
+ WS_HSCROLL | WS_VSCROLL,\r
+ CW_USEDEFAULT,\r
+ CW_USEDEFAULT,\r
+ CW_USEDEFAULT,\r
+ CW_USEDEFAULT,\r
+ MainWnd->hMdiClient,\r
+ hInstance,\r
+ (LPARAM)Info);\r
+\r
+ if (hWndEditor != NULL)\r
+ {\r
+ return TRUE;\r
+ }\r
+\r
+ HeapFree(ProcessHeap,\r
+ 0,\r
+ Info);\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+BOOL\r
+InitImageEditWindowImpl(VOID)\r
+{\r
+ WNDCLASSEX wc = {0};\r
+\r
+ wc.cbSize = sizeof(WNDCLASSEX);\r
+ wc.style = CS_HREDRAW | CS_VREDRAW;\r
+ wc.lpfnWndProc = ImageEditWndProc;\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.lpszClassName = szImageEditWndClass;\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
+UninitImageEditWindowImpl(VOID)\r
+{\r
+ UnregisterClass(szImageEditWndClass,\r
+ hInstance);\r
+}\r
--- /dev/null
+#include <precomp.h>\r
+\r
+static const TCHAR szMainWndClass[] = TEXT("ImageSoftWndClass");\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_CLOSE, IDS_HINT_SYS_CLOSE},\r
+ {ID_EXIT, IDS_HINT_EXIT},\r
+\r
+ /* Window Menu */\r
+ {ID_WINDOW_NEXT, IDS_HINT_SYS_NEXT}\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_SYS_CLOSE},\r
+ {SC_NEXTWINDOW, IDS_HINT_SYS_NEXT},\r
+};\r
+\r
+/* Standard Toolbar */\r
+#define ID_TOOLBAR_STANDARD 0\r
+static const TCHAR szToolbarStandard[] = TEXT("STANDARD");\r
+static const TBBUTTON StdButtons[] = {\r
+ /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */\r
+ {STD_FILENEW, ID_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON, {0}, 0, 0}, /* new */\r
+ {STD_FILEOPEN, ID_OPEN, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, /* open */\r
+ {STD_FILESAVE, ID_SAVE, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0}, /* save */\r
+\r
+ {10, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, /* separator */\r
+\r
+ {STD_PRINTPRE, ID_PRINTPRE, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* print */\r
+ {STD_PRINT, ID_PRINT, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* print preview */\r
+\r
+ {10, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, /* separator */\r
+\r
+ {STD_CUT, ID_CUT, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* cut */\r
+ {STD_COPY, ID_COPY, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* copy */\r
+ {STD_PASTE, ID_PASTE, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* paste */\r
+\r
+ {10, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, /* separator */\r
+\r
+ {STD_UNDO, ID_UNDO, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* undo */\r
+ {STD_REDOW, ID_REDO, TBSTATE_INDETERMINATE, BTNS_BUTTON, {0}, 0, 0 }, /* redo */\r
+\r
+ {10, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0},\r
+};\r
+\r
+/* Test Toolbar */\r
+#define ID_TOOLBAR_TEST 1\r
+static const TCHAR szToolbarTest[] = TEXT("TEST");\r
+\r
+/* Toolbars table */\r
+static const DOCKBAR MainDockBars[] = {\r
+ {ID_TOOLBAR_STANDARD, szToolbarStandard, IDS_TOOLBAR_STANDARD, TOP_DOCK},\r
+ {ID_TOOLBAR_TEST, szToolbarTest, IDS_TOOLBAR_TEST, TOP_DOCK},\r
+};\r
+\r
+static BOOL CALLBACK\r
+MainWndCreateToolbarClient(struct _TOOLBAR_DOCKS *TbDocks,\r
+ const DOCKBAR *Dockbar,\r
+ PVOID Context,\r
+ HWND hParent,\r
+ HWND *hwnd)\r
+{\r
+ const TBBUTTON *Buttons = NULL;\r
+ UINT NumButtons = 0;\r
+ HWND hWndClient = NULL;\r
+\r
+ UNREFERENCED_PARAMETER(Context);\r
+\r
+ /* Standard toolbar */\r
+ switch (Dockbar->BarId)\r
+ {\r
+ case ID_TOOLBAR_STANDARD:\r
+ {\r
+ Buttons = StdButtons;\r
+ NumButtons = sizeof(StdButtons) / sizeof(StdButtons[0]);\r
+ break;\r
+ }\r
+\r
+ case ID_TOOLBAR_TEST:\r
+ {\r
+ hWndClient = CreateWindowEx(0,\r
+ TEXT("BUTTON"),\r
+ TEXT("Test Button"),\r
+ WS_CHILD | WS_VISIBLE,\r
+ 0,\r
+ 0,\r
+ 150,\r
+ 25,\r
+ hParent,\r
+ NULL,\r
+ hInstance,\r
+ NULL);\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (Buttons != NULL)\r
+ {\r
+ TBADDBITMAP tbab;\r
+\r
+ hWndClient = CreateWindowEx(0,\r
+ TOOLBARCLASSNAME,\r
+ NULL,\r
+ WS_CHILD | WS_CLIPSIBLINGS |\r
+ CCS_NOPARENTALIGN | CCS_NOMOVEY | CCS_NORESIZE | CCS_NODIVIDER |\r
+ TBSTYLE_FLAT | TBSTYLE_TOOLTIPS,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ hParent,\r
+ NULL,\r
+ hInstance,\r
+ NULL);\r
+ if (hWndClient != NULL)\r
+ {\r
+ SendMessage(hWndClient,\r
+ TB_SETEXTENDEDSTYLE,\r
+ 0,\r
+ TBSTYLE_EX_HIDECLIPPEDBUTTONS);\r
+\r
+ /* Send the TB_BUTTONSTRUCTSIZE message, which is required for backward compatibility */\r
+ SendMessage(hWndClient,\r
+ TB_BUTTONSTRUCTSIZE,\r
+ sizeof(Buttons[0]),\r
+ 0);\r
+\r
+ /* Add standard images */\r
+ tbab.hInst = HINST_COMMCTRL;\r
+ tbab.nID = IDB_STD_SMALL_COLOR;\r
+ SendMessage(hWndClient,\r
+ TB_ADDBITMAP,\r
+ (WPARAM)NumButtons,\r
+ (LPARAM)&tbab);\r
+\r
+ /* Add buttons to toolbar */\r
+ SendMessage(hWndClient,\r
+ TB_ADDBUTTONS,\r
+ (WPARAM)NumButtons,\r
+ (LPARAM)Buttons);\r
+ }\r
+ }\r
+\r
+ if (hWndClient != NULL)\r
+ {\r
+ *hwnd = hWndClient;\r
+ return TRUE;\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+static BOOL CALLBACK\r
+MainWndDestroyToolbarClient(struct _TOOLBAR_DOCKS *TbDocks,\r
+ const DOCKBAR *Dockbar,\r
+ PVOID Context,\r
+ HWND hwnd)\r
+{\r
+ UNREFERENCED_PARAMETER(TbDocks);\r
+ UNREFERENCED_PARAMETER(Dockbar);\r
+ UNREFERENCED_PARAMETER(Context);\r
+\r
+ DestroyWindow(hwnd);\r
+ return TRUE;\r
+}\r
+\r
+static BOOL CALLBACK\r
+MainWndToolbarInsertBand(struct _TOOLBAR_DOCKS *TbDocks,\r
+ const DOCKBAR *Dockbar,\r
+ PVOID Context,\r
+ UINT *Index,\r
+ LPREBARBANDINFO rbi)\r
+{\r
+ switch (rbi->wID)\r
+ {\r
+ case ID_TOOLBAR_STANDARD:\r
+ {\r
+ SIZE Size;\r
+\r
+ if (SendMessage(rbi->hwndChild,\r
+ TB_GETMAXSIZE,\r
+ 0,\r
+ (LPARAM)&Size))\r
+ {\r
+ rbi->fStyle |= RBBS_USECHEVRON | RBBS_HIDETITLE;\r
+ rbi->fMask |= RBBIM_SIZE | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE;\r
+ rbi->cx = rbi->cxIdeal = Size.cx;\r
+ rbi->cxMinChild = 0;\r
+ rbi->cyMinChild = Size.cy;\r
+ }\r
+ break;\r
+ }\r
+\r
+ case ID_TOOLBAR_TEST:\r
+ {\r
+ RECT rcBtn;\r
+\r
+ if (GetWindowRect(rbi->hwndChild,\r
+ &rcBtn))\r
+ {\r
+ rbi->fStyle |= RBBS_HIDETITLE;\r
+ rbi->fMask |= RBBIM_SIZE | RBBIM_CHILDSIZE;\r
+ rbi->cx = rcBtn.right - rcBtn.left;\r
+ rbi->cxMinChild = 0;\r
+ rbi->cyMinChild = rcBtn.bottom - rcBtn.top;\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ return TRUE;\r
+}\r
+\r
+static VOID CALLBACK\r
+MainWndToolbarDockBand(struct _TOOLBAR_DOCKS *TbDocks,\r
+ const DOCKBAR *Dockbar,\r
+ PVOID Context,\r
+ DOCK_POSITION DockFrom,\r
+ DOCK_POSITION DockTo,\r
+ LPREBARBANDINFO rbi)\r
+{\r
+ if (rbi->fMask & RBBIM_CHILD && rbi->hwndChild != NULL)\r
+ {\r
+ switch (rbi->wID)\r
+ {\r
+ case ID_TOOLBAR_STANDARD:\r
+ {\r
+ SIZE Size;\r
+ BOOL Vert;\r
+ DWORD dwStyle = SendMessage(rbi->hwndChild,\r
+ TB_GETSTYLE,\r
+ 0,\r
+ 0);\r
+ switch (DockTo)\r
+ {\r
+ case LEFT_DOCK:\r
+ case RIGHT_DOCK:\r
+ dwStyle |= CCS_VERT | TBSTYLE_WRAPABLE;\r
+ Vert = TRUE;\r
+ break;\r
+\r
+ default:\r
+ dwStyle &= ~(CCS_VERT | TBSTYLE_WRAPABLE);\r
+ Vert = FALSE;\r
+ break;\r
+ }\r
+\r
+ SendMessage(rbi->hwndChild,\r
+ TB_SETSTYLE,\r
+ 0,\r
+ (LPARAM)dwStyle);\r
+\r
+ if (SendMessage(rbi->hwndChild,\r
+ TB_GETMAXSIZE,\r
+ 0,\r
+ (LPARAM)&Size))\r
+ {\r
+ rbi->fMask |= RBBIM_SIZE | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE;\r
+ rbi->cx = rbi->cxIdeal = (Vert ? Size.cy : Size.cx);\r
+ rbi->cxMinChild = 0;\r
+ rbi->cyMinChild = (Vert ? Size.cx : Size.cy);\r
+ }\r
+ break;\r
+ }\r
+\r
+ case ID_TOOLBAR_TEST:\r
+ {\r
+ if (DockTo == NO_DOCK)\r
+ {\r
+ rbi->fMask |= RBBIM_SIZE | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE;\r
+ rbi->cx = rbi->cxIdeal = 150;\r
+ rbi->cxMinChild = 0;\r
+ rbi->cyMinChild = 40;\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+static VOID CALLBACK\r
+MainWndToolbarChevronPushed(struct _TOOLBAR_DOCKS *TbDocks,\r
+ const DOCKBAR *Dockbar,\r
+ PVOID Context,\r
+ HWND hwndChild,\r
+ LPNMREBARCHEVRON lpnm)\r
+{\r
+ switch (lpnm->wID)\r
+ {\r
+ case ID_TOOLBAR_STANDARD:\r
+ {\r
+ MapWindowPoints(lpnm->hdr.hwndFrom,\r
+ HWND_DESKTOP,\r
+ (LPPOINT)&lpnm->rc,\r
+ 2);\r
+ /* Create a popup menu for all toolbar icons hidden */\r
+ break;\r
+ }\r
+ }\r
+}\r
+\r
+static const DOCKBAR_ITEM_CALLBACKS MainWndDockBarCallbacks = {\r
+ MainWndCreateToolbarClient,\r
+ MainWndDestroyToolbarClient,\r
+ MainWndToolbarInsertBand,\r
+ MainWndToolbarDockBand,\r
+ MainWndToolbarChevronPushed,\r
+};\r
+\r
+static VOID\r
+CreateToolbars(PMAIN_WND_INFO Info)\r
+{\r
+ UINT i;\r
+\r
+ for (i = 0; i < sizeof(MainDockBars) / sizeof(MainDockBars[0]); i++)\r
+ {\r
+ /* FIXME - lookup whether to display the toolbar */\r
+ TbdAddToolbar(&Info->ToolDocks,\r
+ &MainDockBars[i],\r
+ Info,\r
+ &MainWndDockBarCallbacks);\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
+ INT DocksVisible;\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
+ /* Adjust the client rect if docked toolbars are visible */\r
+ DocksVisible = TbdAdjustUpdateClientRect(&Info->ToolDocks,\r
+ &rcClient);\r
+\r
+ dwp = BeginDeferWindowPos(2 + DocksVisible);\r
+ if (dwp != NULL)\r
+ {\r
+ /* Update the toolbar docks */\r
+ if (DocksVisible != 0)\r
+ {\r
+ dwp = TbdDeferDocks(dwp,\r
+ &Info->ToolDocks);\r
+ if (dwp == NULL)\r
+ return;\r
+ }\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
+\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
+ /* 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
+ TbdInitializeDocks(&Info->ToolDocks,\r
+ Info->hSelf,\r
+ Info,\r
+ MainWndResize);\r
+\r
+ CreateToolbars(Info);\r
+}\r
+\r
+static VOID\r
+MainWndCommand(PMAIN_WND_INFO Info,\r
+ WORD CmdId,\r
+ HWND hControl)\r
+{\r
+ UNREFERENCED_PARAMETER(hControl);\r
+\r
+ switch (CmdId)\r
+ {\r
+ /* File Menu */\r
+ case ID_NEW:\r
+ {\r
+ OPEN_IMAGE_EDIT_INFO OpenInfo;\r
+ LPTSTR lpCaption = NULL;\r
+\r
+ LoadAndFormatString(hInstance,\r
+ IDS_IMAGE_NAME,\r
+ &lpCaption,\r
+ ++Info->ImagesCreated);\r
+\r
+ OpenInfo.CreateNew = TRUE;\r
+ OpenInfo.New.Width = 400;\r
+ OpenInfo.New.Height = 300;\r
+\r
+ CreateImageEditWindow(Info,\r
+ lpCaption,\r
+ &OpenInfo);\r
+\r
+ if (lpCaption != NULL)\r
+ LocalFree((HLOCAL)lpCaption);\r
+ break;\r
+ }\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
+\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_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
+ break;\r
+ }\r
+\r
+ case WM_NOTIFY:\r
+ {\r
+ if (!TbdHandleNotifications(&Info->ToolDocks,\r
+ (LPNMHDR)lParam,\r
+ &Ret))\r
+ {\r
+ /* FIXME - handle other notifications */\r
+ }\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_READY))\r
+ {\r
+ MainWndMenuHint(Info,\r
+ LOWORD(wParam),\r
+ SystemMenuHintTable,\r
+ sizeof(SystemMenuHintTable) / sizeof(SystemMenuHintTable[0]),\r
+ IDS_READY);\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_ACTIVATEAPP:\r
+ {\r
+ //TbdShowFloatingToolbars(&Info->ToolDocks,\r
+ // (BOOL)wParam);\r
+ break;\r
+ }\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
+ break;\r
+ }\r
+\r
+ case WM_DESTROY:\r
+ {\r
+ DestroyMainWnd(Info);\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
+ SetImageEditorEnvironment((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
+ SetImageEditorEnvironment((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
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">\r
+ <assemblyIdentity\r
+ version="1.0.0.0"\r
+ processorArchitecture="X86"\r
+ name="ReactOS.VMware.SVGA.Installer"\r
+ type="win32"\r
+ />\r
+ <description>ReactOS VMware(r) SVGA driver Installer</description>\r
+ <dependency>\r
+ <dependentAssembly>\r
+ <assemblyIdentity\r
+ type="win32"\r
+ name="Microsoft.Windows.Common-Controls"\r
+ version="6.0.0.0"\r
+ processorArchitecture="X86"\r
+ publicKeyToken="6595b64144ccf1df"\r
+ language="*"\r
+ />\r
+ </dependentAssembly>\r
+ </dependency>\r
+</assembly>\r
+\r
+<!-- EOF -->\r
--- /dev/null
+#include <precomp.h>\r
+\r
+static INT\r
+LengthOfStrResource(IN HINSTANCE hInst,\r
+ IN UINT uID)\r
+{\r
+ HRSRC hrSrc;\r
+ HGLOBAL hRes;\r
+ LPWSTR lpName, lpStr;\r
+\r
+ if (hInst == NULL)\r
+ {\r
+ return -1;\r
+ }\r
+\r
+ /* There are always blocks of 16 strings */\r
+ lpName = (LPWSTR)MAKEINTRESOURCE((uID >> 4) + 1);\r
+\r
+ /* Find the string table block */\r
+ if ((hrSrc = FindResourceW(hInst, lpName, (LPWSTR)RT_STRING)) &&\r
+ (hRes = LoadResource(hInst, hrSrc)) &&\r
+ (lpStr = LockResource(hRes)))\r
+ {\r
+ UINT x;\r
+\r
+ /* Find the string we're looking for */\r
+ uID &= 0xF; /* position in the block, same as % 16 */\r
+ for (x = 0; x < uID; x++)\r
+ {\r
+ lpStr += (*lpStr) + 1;\r
+ }\r
+\r
+ /* Found the string */\r
+ return (int)(*lpStr);\r
+ }\r
+ return -1;\r
+}\r
+\r
+INT\r
+AllocAndLoadString(OUT LPTSTR *lpTarget,\r
+ IN HINSTANCE hInst,\r
+ IN UINT uID)\r
+{\r
+ INT ln;\r
+\r
+ ln = LengthOfStrResource(hInst,\r
+ uID);\r
+ if (ln++ > 0)\r
+ {\r
+ (*lpTarget) = (LPWSTR)LocalAlloc(LMEM_FIXED,\r
+ ln * sizeof(TCHAR));\r
+ if ((*lpTarget) != NULL)\r
+ {\r
+ INT Ret;\r
+ if (!(Ret = LoadString(hInst, uID, *lpTarget, ln)))\r
+ {\r
+ LocalFree((HLOCAL)(*lpTarget));\r
+ }\r
+ return Ret;\r
+ }\r
+ }\r
+ return 0;\r
+}\r
+\r
+DWORD\r
+LoadAndFormatString(IN HINSTANCE hInstance,\r
+ IN UINT uID,\r
+ OUT LPTSTR *lpTarget,\r
+ ...)\r
+{\r
+ DWORD Ret = 0;\r
+ LPTSTR lpFormat;\r
+ va_list lArgs;\r
+\r
+ if (AllocAndLoadString(&lpFormat,\r
+ hInstance,\r
+ uID) > 0)\r
+ {\r
+ va_start(lArgs, lpTarget);\r
+ /* let's use FormatMessage to format it because it has the ability to allocate\r
+ memory automatically */\r
+ Ret = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING,\r
+ lpFormat,\r
+ 0,\r
+ 0,\r
+ (LPTSTR)lpTarget,\r
+ 0,\r
+ &lArgs);\r
+ va_end(lArgs);\r
+\r
+ LocalFree((HLOCAL)lpFormat);\r
+ }\r
+\r
+ return Ret;\r
+}\r
+\r
+BOOL\r
+StatusBarLoadAndFormatString(IN HWND hStatusBar,\r
+ IN INT PartId,\r
+ IN HINSTANCE hInstance,\r
+ IN UINT uID,\r
+ ...)\r
+{\r
+ BOOL Ret = FALSE;\r
+ LPTSTR lpFormat, lpStr;\r
+ va_list lArgs;\r
+\r
+ if (AllocAndLoadString(&lpFormat,\r
+ hInstance,\r
+ uID) > 0)\r
+ {\r
+ va_start(lArgs, uID);\r
+ /* let's use FormatMessage to format it because it has the ability to allocate\r
+ memory automatically */\r
+ Ret = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING,\r
+ lpFormat,\r
+ 0,\r
+ 0,\r
+ (LPTSTR)&lpStr,\r
+ 0,\r
+ &lArgs);\r
+ va_end(lArgs);\r
+\r
+ if (lpStr != NULL)\r
+ {\r
+ Ret = (BOOL)SendMessage(hStatusBar,\r
+ SB_SETTEXT,\r
+ (WPARAM)PartId,\r
+ (LPARAM)lpStr);\r
+ LocalFree((HLOCAL)lpStr);\r
+ }\r
+\r
+ LocalFree((HLOCAL)lpFormat);\r
+ }\r
+\r
+ return Ret;\r
+}\r
+\r
+BOOL\r
+StatusBarLoadString(IN HWND hStatusBar,\r
+ IN INT PartId,\r
+ IN HINSTANCE hInstance,\r
+ IN UINT uID)\r
+{\r
+ BOOL Ret = FALSE;\r
+ LPTSTR lpStr;\r
+\r
+ if (AllocAndLoadString(&lpStr,\r
+ hInstance,\r
+ uID) > 0)\r
+ {\r
+ Ret = (BOOL)SendMessage(hStatusBar,\r
+ SB_SETTEXT,\r
+ (WPARAM)PartId,\r
+ (LPARAM)lpStr);\r
+ LocalFree((HLOCAL)lpStr);\r
+ }\r
+\r
+ return Ret;\r
+}\r
-#include "imagesoft.h"\r
+#include <precomp.h>\r
\r
static OPENFILENAME ofn;\r
\r
--- /dev/null
+#ifndef __IMAGESOFT_PRECOMP_H\r
+#define __IMAGESOFT_PRECOMP_H\r
+\r
+//#define WIN32_LEAN_AND_MEAN\r
+#include <windows.h>\r
+#include <windowsx.h> /* GET_X/Y_LPARAM */\r
+#include <stdio.h>\r
+#include <tchar.h>\r
+#include <commctrl.h>\r
+#include "resource.h"\r
+\r
+/* FIXME - add to headers !!! */\r
+#ifndef SB_SIMPLEID\r
+#define SB_SIMPLEID 0xFF\r
+#endif\r
+#ifndef RBBS_USECHEVRON\r
+#define RBBS_USECHEVRON 0x200\r
+#endif\r
+#ifndef RBN_CHEVRONPUSHED\r
+#define RBN_CHEVRONPUSHED (RBN_FIRST - 10)\r
+#endif\r
+ULONG DbgPrint(PCH Format,...);\r
+\r
+#define MAX_KEY_LENGTH 256\r
+#define NUM_BUTTONS 14\r
+\r
+/* generic definitions and forward declarations */\r
+struct _MAIN_WND_INFO;\r
+struct _EDIT_WND_INFO;\r
+\r
+typedef enum _MDI_EDITOR_TYPE {\r
+ metUnknown = 0,\r
+ metImageEditor,\r
+} MDI_EDITOR_TYPE, *PMDI_EDITOR_TYPE;\r
+\r
+/* about.c */\r
+INT_PTR CALLBACK AboutDialogProc(HWND hDlg,\r
+ UINT message,\r
+ WPARAM wParam,\r
+ LPARAM lParam);\r
+\r
+/* imagesoft.c */\r
+extern HINSTANCE hInstance;\r
+extern HANDLE ProcessHeap;\r
+\r
+/* imgedwnd.c */\r
+typedef struct _OPEN_IMAGE_EDIT_INFO\r
+{\r
+ BOOL CreateNew;\r
+ union\r
+ {\r
+ struct\r
+ {\r
+ LONG Width;\r
+ LONG Height;\r
+ } New;\r
+ struct\r
+ {\r
+ LPCTSTR lpFileName;\r
+ } Open;\r
+ };\r
+} OPEN_IMAGE_EDIT_INFO, *POPEN_IMAGE_EDIT_INFO;\r
+\r
+typedef struct _EDIT_WND_INFO\r
+{\r
+ MDI_EDITOR_TYPE MdiEditorType; /* Must be first member! */\r
+\r
+ HWND hSelf;\r
+ struct _MAIN_WND_INFO *MainWnd;\r
+ struct _EDIT_WND_INFO *Next;\r
+ POINT ScrollPos;\r
+ USHORT Zoom;\r
+\r
+ POPEN_IMAGE_EDIT_INFO OpenInfo; /* Only valid during initialization */\r
+\r
+ /* Bitmap size */\r
+ LONG Width;\r
+ LONG Height;\r
+} EDIT_WND_INFO, *PEDIT_WND_INFO;\r
+\r
+BOOL CreateImageEditWindow(struct _MAIN_WND_INFO *MainWnd,\r
+ LPCTSTR lpCaption,\r
+ POPEN_IMAGE_EDIT_INFO OpenInfo);\r
+VOID SetImageEditorEnvironment(PEDIT_WND_INFO Info,\r
+ BOOL Setup);\r
+BOOL InitImageEditWindowImpl(VOID);\r
+VOID UninitImageEditWindowImpl(VOID);\r
+\r
+/* tooldock.c */\r
+\r
+typedef enum\r
+{\r
+ TOP_DOCK = 0,\r
+ LEFT_DOCK,\r
+ RIGHT_DOCK,\r
+ BOTTOM_DOCK,\r
+ NO_DOCK\r
+} DOCK_POSITION;\r
+\r
+typedef struct _DOCKBAR\r
+{\r
+ UINT BarId;\r
+ LPCTSTR lpName;\r
+ UINT DisplayTextId;\r
+ DOCK_POSITION Position;\r
+} DOCKBAR, *PDOCKBAR;\r
+\r
+struct _TOOLBAR_DOCKS;\r
+\r
+typedef BOOL (CALLBACK *PDOCKBAR_CREATECLIENT)(struct _TOOLBAR_DOCKS *TbDocks,\r
+ const DOCKBAR *Dockbar,\r
+ PVOID Context,\r
+ HWND hParent,\r
+ HWND *hwnd);\r
+typedef BOOL (CALLBACK *PDOCKBAR_DESTROYCLIENT)(struct _TOOLBAR_DOCKS *TbDocks,\r
+ const DOCKBAR *Dockbar,\r
+ PVOID Context,\r
+ HWND hwnd);\r
+typedef BOOL (CALLBACK *PDOCKBAR_INSERTBAND)(struct _TOOLBAR_DOCKS *TbDocks,\r
+ const DOCKBAR *Dockbar,\r
+ PVOID Context,\r
+ UINT *Index,\r
+ LPREBARBANDINFO rbi);\r
+typedef VOID (CALLBACK *PDOCKBAR_DOCKBAND)(struct _TOOLBAR_DOCKS *TbDocks,\r
+ const DOCKBAR *Dockbar,\r
+ PVOID Context,\r
+ DOCK_POSITION DockFrom,\r
+ DOCK_POSITION DockTo,\r
+ LPREBARBANDINFO rbi);\r
+typedef VOID (CALLBACK *PDOCKBAR_CHEVRONPUSHED)(struct _TOOLBAR_DOCKS *TbDocks,\r
+ const DOCKBAR *Dockbar,\r
+ PVOID Context,\r
+ HWND hwndChild,\r
+ LPNMREBARCHEVRON lpnm);\r
+\r
+typedef struct _DOCKBAR_ITEM_CALLBACKS\r
+{\r
+ PDOCKBAR_CREATECLIENT CreateClient;\r
+ PDOCKBAR_DESTROYCLIENT DestroyClient;\r
+ PDOCKBAR_INSERTBAND InsertBand;\r
+ PDOCKBAR_DOCKBAND DockBand;\r
+ PDOCKBAR_CHEVRONPUSHED ChevronPushed;\r
+} DOCKBAR_ITEM_CALLBACKS, *PDOCKBAR_ITEM_CALLBACKS;\r
+\r
+typedef struct _DOCKBAR_ITEM\r
+{\r
+ struct _DOCKBAR_ITEM *Next;\r
+ DOCKBAR DockBar;\r
+ PVOID Context;\r
+ HWND hWndTool;\r
+ HWND hWndClient;\r
+ DOCK_POSITION PrevDock;\r
+ UINT PrevBandIndex;\r
+ const DOCKBAR_ITEM_CALLBACKS *Callbacks;\r
+} DOCKBAR_ITEM, *PDOCKBAR_ITEM;\r
+\r
+typedef VOID (CALLBACK *PDOCKBAR_PARENTRESIZE)(PVOID Context,\r
+ WORD cx,\r
+ WORD cy);\r
+\r
+#define DOCKS_COUNT 4\r
+typedef struct _TOOLBAR_DOCKS\r
+{\r
+ HWND hParent;\r
+ PVOID Context;\r
+ HWND hRebar[DOCKS_COUNT];\r
+ RECT rcRebar[DOCKS_COUNT];\r
+ RECT rcClient;\r
+ PDOCKBAR_ITEM Items;\r
+ PDOCKBAR_PARENTRESIZE ParentResize;\r
+ PDOCKBAR_ITEM Dragging;\r
+ UINT DraggingBandId;\r
+ TCHAR szTempText[255];\r
+} TOOLBAR_DOCKS, *PTOOLBAR_DOCKS;\r
+\r
+VOID TbdInitializeDocks(PTOOLBAR_DOCKS TbDocks,\r
+ HWND hWndParent,\r
+ PVOID Context,\r
+ PDOCKBAR_PARENTRESIZE ParentResizeProc);\r
+INT TbdAdjustUpdateClientRect(PTOOLBAR_DOCKS TbDocks,\r
+ PRECT rcClient);\r
+HDWP TbdDeferDocks(HDWP hWinPosInfo,\r
+ PTOOLBAR_DOCKS TbDocks);\r
+BOOL TbdAddToolbar(PTOOLBAR_DOCKS TbDocks,\r
+ const DOCKBAR *Dockbar,\r
+ PVOID Context,\r
+ const DOCKBAR_ITEM_CALLBACKS *DockbarCallbacks);\r
+BOOL TbdHandleNotifications(PTOOLBAR_DOCKS TbDocks,\r
+ LPNMHDR pnmh,\r
+ LRESULT *Result);\r
+VOID TbdShowFloatingToolbars(PTOOLBAR_DOCKS TbDocks,\r
+ BOOL Show);\r
+BOOL TbdInitImpl(VOID);\r
+VOID TbdUninitImpl(VOID);\r
+\r
+/* mainwnd.c */\r
+typedef struct _MENU_HINT\r
+{\r
+ WORD CmdId;\r
+ UINT HintId;\r
+} MENU_HINT, *PMENU_HINT;\r
+\r
+typedef struct _MAIN_WND_INFO\r
+{\r
+ HWND hSelf;\r
+ HWND hMdiClient;\r
+ HWND hStatus;\r
+ int nCmdShow;\r
+\r
+ TOOLBAR_DOCKS ToolDocks;\r
+\r
+ /* Editors */\r
+ PEDIT_WND_INFO ImageEditors;\r
+ UINT ImagesCreated;\r
+\r
+ PVOID ActiveEditor;\r
+\r
+ /* status flags */\r
+ BOOL InMenuLoop : 1;\r
+} MAIN_WND_INFO, *PMAIN_WND_INFO;\r
+\r
+BOOL InitMainWindowImpl(VOID);\r
+VOID UninitMainWindowImpl(VOID);\r
+HWND CreateMainWindow(LPCTSTR lpCaption,\r
+ int nCmdShow);\r
+BOOL MainWndTranslateMDISysAccel(HWND hwnd,\r
+ LPMSG lpMsg);\r
+VOID MainWndSwitchEditorContext(PMAIN_WND_INFO Info,\r
+ HWND hDeactivate,\r
+ HWND hActivate);\r
+MDI_EDITOR_TYPE MainWndGetCurrentEditor(PMAIN_WND_INFO MainWnd,\r
+ PVOID *Info);\r
+\r
+/* misc.c */\r
+INT AllocAndLoadString(OUT LPTSTR *lpTarget,\r
+ IN HINSTANCE hInst,\r
+ IN UINT uID);\r
+\r
+DWORD LoadAndFormatString(IN HINSTANCE hInstance,\r
+ IN UINT uID,\r
+ OUT LPTSTR *lpTarget,\r
+ ...);\r
+\r
+BOOL StatusBarLoadAndFormatString(IN HWND hStatusBar,\r
+ IN INT PartId,\r
+ IN HINSTANCE hInstance,\r
+ IN UINT uID,\r
+ ...);\r
+\r
+BOOL StatusBarLoadString(IN HWND hStatusBar,\r
+ IN INT PartId,\r
+ IN HINSTANCE hInstance,\r
+ IN UINT uID);\r
+\r
+#endif /* __IMAGESOFT_PRECOMP_H */\r
\r
#define ID_REFRESH 3000\r
#define ID_HELP 3001\r
-#define ID_WINDOW_TILE 3002\r
-#define ID_WINDOW_CASCADE 3003\r
+#define ID_WINDOW_TILE_HORZ 3002\r
+#define ID_WINDOW_TILE_VERT 3003\r
+#define ID_WINDOW_CASCADE 3004\r
+#define ID_WINDOW_NEXT 3005\r
+#define ID_WINDOW_ARRANGE 3006\r
\r
/* Menu */\r
#define IDR_MAINMENU 102\r
/* about box info */\r
#define IDD_ABOUTBOX 200\r
#define IDC_LICENSE_EDIT 201\r
-#define IDS_LICENSE 202\r
\r
-#define IDS_CURPOS 550\r
-#define IDS_READY 551\r
+#define IDS_APPNAME 101\r
+#define IDS_LICENSE 102\r
+#define IDS_READY 103\r
+#define IDS_TOOLBAR_STANDARD 201\r
+#define IDS_TOOLBAR_TEST 202\r
+#define IDS_IMAGE_NAME 203\r
+\r
+/* menu hints */\r
+#define IDS_HINT_EXIT 20001\r
+\r
+/* system menu hints */\r
+#define IDS_HINT_SYS_RESTORE 21001\r
+#define IDS_HINT_SYS_MOVE 21002\r
+#define IDS_HINT_SYS_SIZE 21003\r
+#define IDS_HINT_SYS_MINIMIZE 21004\r
+#define IDS_HINT_SYS_MAXIMIZE 21005\r
+#define IDS_HINT_SYS_CLOSE 21006\r
+#define IDS_HINT_SYS_NEXT 21007\r
--- /dev/null
+#include <precomp.h>\r
+\r
+static const TCHAR szToolDockWndClass[] = TEXT("ImageSoftToolDockWndClass");\r
+\r
+typedef struct _TOOLDOCKWND_INIT\r
+{\r
+ PTOOLBAR_DOCKS TbDocks;\r
+ PDOCKBAR_ITEM Item;\r
+} TOOLDOCKWND_INIT, *PTOOLDOCKWND_INIT;\r
+\r
+static UINT\r
+TbdCalculateInsertIndex(PTOOLBAR_DOCKS TbDocks,\r
+ DOCK_POSITION Position,\r
+ POINT pt)\r
+{\r
+ RECT rcRebar;\r
+ UINT Ret = 0;\r
+\r
+ GetWindowRect(TbDocks->hRebar[Position],\r
+ &rcRebar);\r
+\r
+ switch (Position)\r
+ {\r
+ case TOP_DOCK:\r
+ case BOTTOM_DOCK:\r
+ if (pt.y > rcRebar.top + ((rcRebar.bottom - rcRebar.top) / 2))\r
+ Ret = (UINT)-1;\r
+ break;\r
+\r
+ case LEFT_DOCK:\r
+ case RIGHT_DOCK:\r
+ if (pt.x > rcRebar.left + ((rcRebar.right - rcRebar.left) / 2))\r
+ Ret = (UINT)-1;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return Ret;\r
+}\r
+\r
+INT\r
+TbdAdjustUpdateClientRect(PTOOLBAR_DOCKS TbDocks,\r
+ PRECT rcClient)\r
+{\r
+ INT i, DocksVisible = 0;\r
+\r
+ for (i = 0; i < DOCKS_COUNT; i++)\r
+ {\r
+ if (TbDocks->hRebar[i] != NULL)\r
+ {\r
+ DocksVisible++;\r
+ }\r
+ }\r
+\r
+ if (DocksVisible != 0)\r
+ {\r
+ rcClient->top += TbDocks->rcRebar[TOP_DOCK].bottom;\r
+ rcClient->left += TbDocks->rcRebar[LEFT_DOCK].right;\r
+ rcClient->right -= TbDocks->rcRebar[RIGHT_DOCK].right;\r
+ rcClient->bottom -= TbDocks->rcRebar[BOTTOM_DOCK].bottom;\r
+ }\r
+\r
+ TbDocks->rcClient = *rcClient;\r
+\r
+ return DocksVisible;\r
+}\r
+\r
+HDWP\r
+TbdDeferDocks(HDWP hWinPosInfo,\r
+ PTOOLBAR_DOCKS TbDocks)\r
+{\r
+ LONG cx, cy;\r
+ HDWP hRet = hWinPosInfo;\r
+\r
+ cx = TbDocks->rcClient.right - TbDocks->rcClient.left;\r
+ cy = TbDocks->rcClient.bottom - TbDocks->rcClient.top;\r
+\r
+ /* Top dock */\r
+ if (TbDocks->hRebar[TOP_DOCK] != NULL)\r
+ {\r
+ hRet = DeferWindowPos(hRet,\r
+ TbDocks->hRebar[TOP_DOCK],\r
+ NULL,\r
+ TbDocks->rcClient.left - TbDocks->rcRebar[LEFT_DOCK].right,\r
+ TbDocks->rcClient.top - TbDocks->rcRebar[TOP_DOCK].bottom,\r
+ cx + TbDocks->rcRebar[LEFT_DOCK].right + TbDocks->rcRebar[RIGHT_DOCK].right,\r
+ TbDocks->rcRebar[TOP_DOCK].bottom,\r
+ SWP_NOZORDER);\r
+ if (hRet == NULL)\r
+ return NULL;\r
+ }\r
+\r
+ /* Left dock */\r
+ if (TbDocks->hRebar[LEFT_DOCK] != NULL)\r
+ {\r
+ hRet = DeferWindowPos(hRet,\r
+ TbDocks->hRebar[LEFT_DOCK],\r
+ NULL,\r
+ TbDocks->rcClient.left - TbDocks->rcRebar[LEFT_DOCK].right,\r
+ TbDocks->rcClient.top,\r
+ TbDocks->rcRebar[LEFT_DOCK].right,\r
+ cy,\r
+ SWP_NOZORDER);\r
+ if (hRet == NULL)\r
+ return NULL;\r
+ }\r
+\r
+ /* Right dock */\r
+ if (TbDocks->hRebar[RIGHT_DOCK] != NULL)\r
+ {\r
+ hRet = DeferWindowPos(hRet,\r
+ TbDocks->hRebar[RIGHT_DOCK],\r
+ NULL,\r
+ TbDocks->rcClient.right,\r
+ TbDocks->rcClient.top,\r
+ TbDocks->rcRebar[RIGHT_DOCK].right,\r
+ cy,\r
+ SWP_NOZORDER);\r
+ if (hRet == NULL)\r
+ return NULL;\r
+ }\r
+\r
+ /* Bottom dock */\r
+ if (TbDocks->hRebar[BOTTOM_DOCK] != NULL)\r
+ {\r
+ hRet = DeferWindowPos(hRet,\r
+ TbDocks->hRebar[BOTTOM_DOCK],\r
+ NULL,\r
+ TbDocks->rcClient.left - TbDocks->rcRebar[LEFT_DOCK].right,\r
+ TbDocks->rcClient.bottom,\r
+ cx + TbDocks->rcRebar[LEFT_DOCK].right + TbDocks->rcRebar[RIGHT_DOCK].right,\r
+ TbDocks->rcRebar[BOTTOM_DOCK].bottom,\r
+ SWP_NOZORDER);\r
+ if (hRet == NULL)\r
+ return NULL;\r
+ }\r
+\r
+ return hRet;\r
+}\r
+\r
+static PDOCKBAR_ITEM\r
+TbnDockbarItemFromBandId(PTOOLBAR_DOCKS TbDocks,\r
+ DOCK_POSITION Position,\r
+ UINT uBand)\r
+{\r
+ REBARBANDINFO rbi = {0};\r
+\r
+ rbi.cbSize = sizeof(rbi);\r
+ rbi.fMask = RBBIM_LPARAM;\r
+\r
+ if (SendMessage(TbDocks->hRebar[Position],\r
+ RB_GETBANDINFO,\r
+ (WPARAM)uBand,\r
+ (LPARAM)&rbi))\r
+ {\r
+ return (PDOCKBAR_ITEM)rbi.lParam;\r
+ }\r
+\r
+ return NULL;\r
+}\r
+\r
+static VOID\r
+TbnRebarChangeSize(PTOOLBAR_DOCKS TbDocks,\r
+ DOCK_POSITION Position)\r
+{\r
+ LONG cRebar;\r
+\r
+ TbDocks->rcRebar[Position].left = 0;\r
+ TbDocks->rcRebar[Position].top = 0;\r
+\r
+ cRebar = (LONG)SendMessage(TbDocks->hRebar[Position],\r
+ RB_GETBARHEIGHT,\r
+ 0,\r
+ 0);\r
+\r
+ switch (Position)\r
+ {\r
+ case TOP_DOCK:\r
+ case BOTTOM_DOCK:\r
+ TbDocks->rcRebar[Position].bottom = cRebar;\r
+ break;\r
+\r
+ case LEFT_DOCK:\r
+ case RIGHT_DOCK:\r
+ TbDocks->rcRebar[Position].right = cRebar;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
+\r
+ if (TbDocks->ParentResize != NULL)\r
+ {\r
+ RECT rcClient = {0};\r
+\r
+ GetClientRect(TbDocks->hParent,\r
+ &rcClient);\r
+\r
+ TbDocks->ParentResize(TbDocks->Context,\r
+ rcClient.right - rcClient.left,\r
+ rcClient.bottom - rcClient.top);\r
+ }\r
+}\r
+\r
+static VOID\r
+TbnRebarChevronPushed(PTOOLBAR_DOCKS TbDocks,\r
+ DOCK_POSITION Position,\r
+ LPNMREBARCHEVRON lpnm)\r
+{\r
+ PDOCKBAR_ITEM Item;\r
+\r
+ Item = TbnDockbarItemFromBandId(TbDocks,\r
+ Position,\r
+ lpnm->uBand);\r
+\r
+ if (Item != NULL && Item->Callbacks->ChevronPushed)\r
+ {\r
+ Item->Callbacks->ChevronPushed(TbDocks,\r
+ &Item->DockBar,\r
+ Item->Context,\r
+ Item->hWndClient,\r
+ lpnm);\r
+ }\r
+}\r
+\r
+static LRESULT\r
+TbnRebarBeginDrag(PTOOLBAR_DOCKS TbDocks,\r
+ DOCK_POSITION Position,\r
+ LPNMREBAR lpnmrb)\r
+{\r
+ PDOCKBAR_ITEM Item;\r
+\r
+ Item = TbnDockbarItemFromBandId(TbDocks,\r
+ Position,\r
+ lpnmrb->uBand);\r
+\r
+ if (Item != NULL)\r
+ {\r
+ TbDocks->Dragging = Item;\r
+ TbDocks->DraggingBandId = lpnmrb->wID;\r
+ return FALSE;\r
+ }\r
+\r
+ return TRUE;\r
+}\r
+\r
+static VOID\r
+TbnRebarEndDrag(PTOOLBAR_DOCKS TbDocks,\r
+ DOCK_POSITION Position,\r
+ LPNMREBAR lpnmrb)\r
+{\r
+ PDOCKBAR_ITEM Item;\r
+\r
+ Item = TbnDockbarItemFromBandId(TbDocks,\r
+ Position,\r
+ lpnmrb->uBand);\r
+\r
+ if (Item != NULL)\r
+ {\r
+ /* Nothing to do */\r
+ }\r
+}\r
+\r
+BOOL\r
+TbdHandleNotifications(PTOOLBAR_DOCKS TbDocks,\r
+ LPNMHDR pnmh,\r
+ LRESULT *Result)\r
+{\r
+ BOOL Handled = FALSE;\r
+\r
+ if (pnmh->hwndFrom != NULL)\r
+ {\r
+ DOCK_POSITION Position;\r
+\r
+ for (Position = TOP_DOCK; Position < NO_DOCK; Position++)\r
+ {\r
+ if (pnmh->hwndFrom == TbDocks->hRebar[Position])\r
+ {\r
+ switch (pnmh->code)\r
+ {\r
+ case RBN_HEIGHTCHANGE:\r
+ {\r
+ TbnRebarChangeSize(TbDocks,\r
+ Position);\r
+ break;\r
+ }\r
+\r
+ case RBN_BEGINDRAG:\r
+ {\r
+ *Result = TbnRebarBeginDrag(TbDocks,\r
+ Position,\r
+ (LPNMREBAR)pnmh);\r
+ break;\r
+ }\r
+\r
+ case RBN_ENDDRAG:\r
+ {\r
+ TbnRebarEndDrag(TbDocks,\r
+ Position,\r
+ (LPNMREBAR)pnmh);\r
+ break;\r
+ }\r
+\r
+ case RBN_CHEVRONPUSHED:\r
+ {\r
+ TbnRebarChevronPushed(TbDocks,\r
+ Position,\r
+ (LPNMREBARCHEVRON)pnmh);\r
+ break;\r
+ }\r
+ }\r
+\r
+ Handled = TRUE;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ return Handled;\r
+}\r
+\r
+static BOOL\r
+TbdCreateToolbarWnd(PTOOLBAR_DOCKS TbDocks,\r
+ PDOCKBAR_ITEM Item,\r
+ DOCK_POSITION PrevPosition,\r
+ UINT PrevBandIndex,\r
+ LPREBARBANDINFO rbi,\r
+ POINT pt,\r
+ HWND hRebar,\r
+ UINT uBand,\r
+ BOOL Drag)\r
+{\r
+ LPCTSTR lpCaption = NULL;\r
+ TOOLDOCKWND_INIT Init;\r
+ HWND hToolbar;\r
+\r
+ Init.TbDocks = TbDocks;\r
+ Init.Item = Item;\r
+\r
+ if (rbi->fMask & RBBIM_TEXT)\r
+ {\r
+ lpCaption = rbi->lpText;\r
+ }\r
+\r
+ Item->Callbacks->DockBand(TbDocks,\r
+ &Item->DockBar,\r
+ Item->Context,\r
+ PrevPosition,\r
+ NO_DOCK,\r
+ rbi);\r
+\r
+ if (rbi->fMask & RBBIM_CHILD)\r
+ Item->hWndClient = rbi->hwndChild;\r
+ else\r
+ Item->hWndClient = NULL;\r
+\r
+\r
+ if ((rbi->fMask & (RBBIM_CHILDSIZE | RBBIM_SIZE)) == (RBBIM_CHILDSIZE | RBBIM_SIZE))\r
+ {\r
+ RECT rcWnd;\r
+ static const DWORD dwStyle = WS_POPUPWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_DLGFRAME;\r
+ static const DWORD dwExStyle = WS_EX_TOOLWINDOW;\r
+\r
+ rcWnd.left = pt.x - GetSystemMetrics(SM_CXFIXEDFRAME) - (GetSystemMetrics(SM_CYSMCAPTION) / 2);\r
+ rcWnd.top = pt.y + GetSystemMetrics(SM_CYFIXEDFRAME) + (GetSystemMetrics(SM_CYSMCAPTION) / 2);\r
+ rcWnd.right = rcWnd.left + rbi->cx;\r
+ rcWnd.bottom = rcWnd.top + rbi->cyMinChild;\r
+\r
+ if (AdjustWindowRectEx(&rcWnd,\r
+ dwStyle,\r
+ FALSE,\r
+ dwExStyle))\r
+ {\r
+ hToolbar = CreateWindowEx(dwExStyle,\r
+ szToolDockWndClass,\r
+ lpCaption,\r
+ dwStyle,\r
+ rcWnd.left,\r
+ rcWnd.top,\r
+ rcWnd.right - rcWnd.left,\r
+ rcWnd.bottom - rcWnd.top,\r
+ TbDocks->hParent,\r
+ NULL,\r
+ hInstance,\r
+ &Init);\r
+ if (hToolbar != NULL)\r
+ {\r
+ RECT rcClient;\r
+\r
+ if (uBand != (UINT)-1)\r
+ {\r
+ /* delete the band before showing the client window,\r
+ otherwise deleting the band will cause the client\r
+ window to be hidden, regardless of whether the band\r
+ was hidden before being deleted or not */\r
+ SendMessage(hRebar,\r
+ RB_DELETEBAND,\r
+ (WPARAM)uBand,\r
+ 0);\r
+ }\r
+\r
+ if (Item->hWndClient != NULL)\r
+ {\r
+ GetClientRect(hToolbar,\r
+ &rcClient);\r
+\r
+ SetParent(Item->hWndClient,\r
+ hToolbar);\r
+\r
+ SetWindowPos(Item->hWndClient,\r
+ NULL,\r
+ 0,\r
+ 0,\r
+ rcClient.right,\r
+ rcClient.bottom,\r
+ SWP_NOZORDER);\r
+\r
+ SetWindowPos(Item->hWndClient,\r
+ HWND_TOP,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);\r
+ }\r
+\r
+ SetWindowPos(hToolbar,\r
+ HWND_TOP,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);\r
+\r
+ if (Drag)\r
+ {\r
+ SetCursor(LoadCursor(NULL,\r
+ MAKEINTRESOURCE(IDC_ARROW)));\r
+ SendMessage(hToolbar,\r
+ WM_NCLBUTTONDOWN,\r
+ HTCAPTION,\r
+ MAKELPARAM(pt.x,\r
+ pt.y));\r
+ }\r
+\r
+ return TRUE;\r
+ }\r
+ }\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+static BOOL\r
+TdbInsertToolbar(PTOOLBAR_DOCKS TbDocks,\r
+ PDOCKBAR_ITEM Item,\r
+ DOCK_POSITION Position)\r
+{\r
+ LPTSTR lpCaption = NULL;\r
+ REBARBANDINFO rbi = {0};\r
+ BOOL Ret = FALSE;\r
+\r
+ rbi.cbSize = sizeof(rbi);\r
+ rbi.fMask = RBBIM_ID | RBBIM_STYLE | RBBIM_LPARAM;\r
+ rbi.wID = Item->DockBar.BarId;\r
+ rbi.fStyle = RBBS_GRIPPERALWAYS;\r
+ rbi.lParam = (LPARAM)Item;\r
+\r
+ if (Item->DockBar.DisplayTextId != 0)\r
+ {\r
+ if (AllocAndLoadString(&lpCaption,\r
+ hInstance,\r
+ Item->DockBar.DisplayTextId))\r
+ {\r
+ rbi.fMask |= RBBIM_TEXT;\r
+ rbi.lpText = lpCaption;\r
+ }\r
+ }\r
+\r
+ if (Item->hWndClient != NULL)\r
+ {\r
+ rbi.fMask |= RBBIM_CHILD;\r
+ rbi.hwndChild = Item->hWndClient;\r
+ }\r
+\r
+ switch (Item->DockBar.Position)\r
+ {\r
+ case NO_DOCK:\r
+ {\r
+ POINT pt = {0};\r
+\r
+ /* FIXME - calculate size */\r
+ Ret = TbdCreateToolbarWnd(TbDocks,\r
+ Item,\r
+ Item->DockBar.Position,\r
+ (UINT)-1,\r
+ &rbi,\r
+ pt,\r
+ NULL,\r
+ (UINT)-1,\r
+ FALSE);\r
+ break;\r
+ }\r
+\r
+ default:\r
+ {\r
+ UINT Index = -1;\r
+ BOOL AddBand = TRUE;\r
+\r
+ if (Item->Callbacks->InsertBand != NULL)\r
+ {\r
+ AddBand = Item->Callbacks->InsertBand(TbDocks,\r
+ &Item->DockBar,\r
+ Item->Context,\r
+ &Index,\r
+ &rbi);\r
+ }\r
+\r
+ if (AddBand)\r
+ {\r
+ Item->Callbacks->DockBand(TbDocks,\r
+ &Item->DockBar,\r
+ Item->Context,\r
+ NO_DOCK,\r
+ Item->DockBar.Position,\r
+ &rbi);\r
+\r
+ if (rbi.fMask & RBBIM_CHILD)\r
+ Item->hWndClient = rbi.hwndChild;\r
+ else\r
+ Item->hWndClient = NULL;\r
+\r
+ Ret = SendMessage(TbDocks->hRebar[Position],\r
+ RB_INSERTBAND,\r
+ (WPARAM)Index,\r
+ (LPARAM)&rbi) != 0;\r
+ if (Ret)\r
+ {\r
+ Item->PrevDock = Position;\r
+ Item->PrevBandIndex = (UINT)SendMessage(TbDocks->hRebar[Position],\r
+ RB_IDTOINDEX,\r
+ (WPARAM)Item->DockBar.BarId,\r
+ 0);\r
+ }\r
+ }\r
+\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (lpCaption != NULL)\r
+ {\r
+ LocalFree((HLOCAL)lpCaption);\r
+ }\r
+\r
+ return Ret;\r
+}\r
+\r
+BOOL\r
+TbdAddToolbar(PTOOLBAR_DOCKS TbDocks,\r
+ const DOCKBAR *Dockbar,\r
+ PVOID Context,\r
+ const DOCKBAR_ITEM_CALLBACKS *Callbacks)\r
+{\r
+ PDOCKBAR_ITEM Item;\r
+ HWND hRebar;\r
+\r
+ hRebar = TbDocks->hRebar[Dockbar->Position];\r
+ if (hRebar != NULL)\r
+ {\r
+ Item = HeapAlloc(ProcessHeap,\r
+ 0,\r
+ sizeof(DOCKBAR_ITEM));\r
+ if (Item != NULL)\r
+ {\r
+ /* Initialize the item */\r
+ Item->DockBar = *Dockbar;\r
+ Item->Context = Context;\r
+ Item->hWndTool = NULL;\r
+ Item->PrevDock = Dockbar->Position;\r
+\r
+ Item->Callbacks = Callbacks;\r
+\r
+ /* Create the client control */\r
+ if (Callbacks->CreateClient != NULL &&\r
+ !Callbacks->CreateClient(TbDocks,\r
+ &Item->DockBar,\r
+ Context,\r
+ hRebar,\r
+ &Item->hWndClient))\r
+ {\r
+ HeapFree(ProcessHeap,\r
+ 0,\r
+ Item);\r
+\r
+ return FALSE;\r
+ }\r
+\r
+ /* Insert the item into the list */\r
+ Item->Next = TbDocks->Items;\r
+ TbDocks->Items = Item;\r
+\r
+ return TdbInsertToolbar(TbDocks,\r
+ Item,\r
+ Dockbar->Position);\r
+ }\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+#define GWLP_DOCKITEM 0\r
+\r
+static LRESULT CALLBACK\r
+ToolDockWndProc(HWND hwnd,\r
+ UINT uMsg,\r
+ WPARAM wParam,\r
+ LPARAM lParam)\r
+{\r
+ PTOOLBAR_DOCKS TbDocks;\r
+ PDOCKBAR_ITEM Item;\r
+ LRESULT Ret = 0;\r
+\r
+ /* Get the window context */\r
+ TbDocks = (PTOOLBAR_DOCKS)GetWindowLongPtr(hwnd,\r
+ GWLP_USERDATA);\r
+ Item = (PDOCKBAR_ITEM)GetWindowLongPtr(hwnd,\r
+ GWLP_DOCKITEM);\r
+ if ((TbDocks == NULL || Item == NULL) && uMsg != WM_CREATE)\r
+ {\r
+ goto HandleDefaultMessage;\r
+ }\r
+\r
+ switch (uMsg)\r
+ {\r
+ case WM_CREATE:\r
+ {\r
+ TbDocks = ((PTOOLDOCKWND_INIT)(((LPCREATESTRUCT)lParam)->lpCreateParams))->TbDocks;\r
+ Item = ((PTOOLDOCKWND_INIT)(((LPCREATESTRUCT)lParam)->lpCreateParams))->Item;\r
+ Item->hWndTool = hwnd;\r
+\r
+ SetWindowLongPtr(hwnd,\r
+ GWLP_USERDATA,\r
+ (LONG_PTR)TbDocks);\r
+ SetWindowLongPtr(hwnd, \r
+ GWLP_DOCKITEM,\r
+ (LONG_PTR)GWLP_DOCKITEM);\r
+ break;\r
+ }\r
+\r
+ case WM_DESTROY:\r
+ {\r
+ Item->hWndTool = NULL;\r
+\r
+ SetWindowLongPtr(hwnd,\r
+ GWLP_USERDATA,\r
+ 0);\r
+ SetWindowLongPtr(hwnd, \r
+ GWLP_DOCKITEM,\r
+ 0);\r
+ break;\r
+ }\r
+\r
+ default:\r
+ {\r
+HandleDefaultMessage:\r
+ Ret = DefWindowProc(hwnd,\r
+ uMsg,\r
+ wParam,\r
+ lParam);\r
+ break;\r
+ }\r
+ }\r
+\r
+ return Ret;\r
+}\r
+\r
+static LRESULT CALLBACK\r
+RebarSubclassProc(HWND hWnd,\r
+ UINT uMsg,\r
+ WPARAM wParam,\r
+ LPARAM lParam,\r
+ UINT_PTR uIdSubclass,\r
+ DWORD_PTR dwRefData)\r
+{\r
+ LRESULT Ret;\r
+\r
+ Ret = DefSubclassProc(hWnd,\r
+ uMsg,\r
+ wParam,\r
+ lParam);\r
+\r
+ if (uMsg == WM_MOUSEMOVE && (wParam & MK_LBUTTON))\r
+ {\r
+ DOCK_POSITION Position, DragTo = NO_DOCK;\r
+ RECT rcClient;\r
+ POINT pt;\r
+ PTOOLBAR_DOCKS TbDocks = (PTOOLBAR_DOCKS)dwRefData;\r
+ SIZE szTearOff;\r
+\r
+ szTearOff.cx = GetSystemMetrics(SM_CXCURSOR);\r
+ szTearOff.cy = GetSystemMetrics(SM_CYCURSOR);\r
+\r
+ /*\r
+ * Check if we're dragging and if it's time to remove the band\r
+ */\r
+ if (TbDocks->Dragging != NULL && GetCapture() == hWnd)\r
+ {\r
+ GetClientRect(hWnd,\r
+ &rcClient);\r
+ InflateRect(&rcClient,\r
+ szTearOff.cx,\r
+ szTearOff.cy);\r
+\r
+ pt.x = GET_X_LPARAM(lParam);\r
+ pt.y = GET_Y_LPARAM(lParam);\r
+\r
+ if (!PtInRect(&rcClient,\r
+ pt))\r
+ {\r
+ REBARBANDINFO rbi;\r
+ UINT uBand;\r
+ RECT rc;\r
+\r
+ /* Save all rebar band information, don't query RBBIM_HEADERSIZE because it\r
+ seems to cause problems with toolbars*/\r
+ rbi.cbSize = sizeof(rbi);\r
+ rbi.fMask = RBBIM_BACKGROUND | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_COLORS |\r
+ RBBIM_IDEALSIZE | RBBIM_ID | RBBIM_IMAGE | RBBIM_LPARAM | RBBIM_SIZE |\r
+ RBBIM_STYLE | RBBIM_TEXT;\r
+ rbi.lpText = TbDocks->szTempText;\r
+ rbi.cch = sizeof(TbDocks->szTempText);\r
+\r
+ uBand = (UINT)SendMessage(hWnd,\r
+ RB_IDTOINDEX,\r
+ (WPARAM)TbDocks->DraggingBandId,\r
+ 0);\r
+\r
+ if (uBand != (UINT)-1 &&\r
+ SendMessage(hWnd,\r
+ RB_GETBANDINFO,\r
+ (WPARAM)uBand,\r
+ (LPARAM)&rbi))\r
+ {\r
+ MapWindowPoints(hWnd,\r
+ HWND_DESKTOP,\r
+ &pt,\r
+ 1);\r
+\r
+ /* Check if the user is trying to drag it into another dock */\r
+ for (Position = TOP_DOCK; Position < NO_DOCK; Position++)\r
+ {\r
+ if (TbDocks->hRebar[Position] != NULL &&\r
+ TbDocks->hRebar[Position] != hWnd &&\r
+ GetWindowRect(TbDocks->hRebar[Position],\r
+ &rc))\r
+ {\r
+ InflateRect(&rc,\r
+ szTearOff.cx,\r
+ szTearOff.cy);\r
+\r
+ if (PtInRect(&rc,\r
+ pt))\r
+ {\r
+ DragTo = Position;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ /* Get the current dock */\r
+ for (Position = TOP_DOCK; Position < NO_DOCK; Position++)\r
+ {\r
+ if (TbDocks->hRebar[Position] == hWnd)\r
+ {\r
+ break;\r
+ }\r
+ }\r
+\r
+ ReleaseCapture();\r
+\r
+ if (SendMessage(hWnd,\r
+ RB_SHOWBAND,\r
+ (WPARAM)uBand,\r
+ FALSE))\r
+ {\r
+ /* Change the parent to the new rebar control */\r
+ if (TbDocks->Dragging->hWndClient != NULL)\r
+ {\r
+ SetWindowPos(TbDocks->Dragging->hWndClient,\r
+ NULL,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ SWP_HIDEWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER);\r
+\r
+ SetParent(TbDocks->Dragging->hWndClient,\r
+ TbDocks->hRebar[DragTo]);\r
+\r
+ SetWindowPos(TbDocks->Dragging->hWndClient,\r
+ NULL,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ SWP_NOSIZE | SWP_NOZORDER);\r
+ }\r
+\r
+ if (DragTo == NO_DOCK)\r
+ {\r
+ if (!TbdCreateToolbarWnd(TbDocks,\r
+ TbDocks->Dragging,\r
+ Position,\r
+ uBand,\r
+ &rbi,\r
+ pt,\r
+ hWnd,\r
+ uBand,\r
+ TRUE))\r
+ {\r
+ goto MoveFailed;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ BOOL Moved = FALSE;\r
+\r
+ /* Remove the band from the current rebar control */\r
+ if (SendMessage(hWnd,\r
+ RB_DELETEBAND,\r
+ (WPARAM)uBand,\r
+ 0))\r
+ {\r
+ UINT uIndex;\r
+\r
+ /* Calculate where to insert the new bar */\r
+ uIndex = TbdCalculateInsertIndex(TbDocks,\r
+ DragTo,\r
+ pt);\r
+\r
+ SetActiveWindow(TbDocks->hRebar[DragTo]);\r
+\r
+ TbDocks->Dragging->Callbacks->DockBand(TbDocks,\r
+ &TbDocks->Dragging->DockBar,\r
+ TbDocks->Dragging->Context,\r
+ Position,\r
+ DragTo,\r
+ &rbi);\r
+\r
+ if (rbi.fMask & RBBIM_CHILD)\r
+ TbDocks->Dragging->hWndClient = rbi.hwndChild;\r
+ else\r
+ TbDocks->Dragging->hWndClient = NULL;\r
+\r
+ /* Insert the toolbar into the new rebar */\r
+ rbi.fMask |= RBBIM_STYLE;\r
+ rbi.fStyle |= RBBS_HIDDEN;\r
+ if (SendMessage(TbDocks->hRebar[DragTo],\r
+ RB_INSERTBAND,\r
+ (WPARAM)uIndex,\r
+ (LPARAM)&rbi))\r
+ {\r
+ uBand = (UINT)SendMessage(TbDocks->hRebar[DragTo],\r
+ RB_IDTOINDEX,\r
+ (WPARAM)TbDocks->DraggingBandId,\r
+ 0);\r
+\r
+ SendMessage(TbDocks->hRebar[DragTo],\r
+ RB_SHOWBAND,\r
+ (WPARAM)uBand,\r
+ TRUE);\r
+\r
+ /* Simulate a mouse click to continue dragging */\r
+ if (uBand != (UINT)-1 &&\r
+ TbDocks->Dragging->hWndClient != NULL &&\r
+ GetWindowRect(TbDocks->Dragging->hWndClient,\r
+ &rc))\r
+ {\r
+ switch (DragTo)\r
+ {\r
+ case LEFT_DOCK:\r
+ case RIGHT_DOCK:\r
+ pt.x = rc.left + ((rc.right - rc.left) / 2);\r
+ pt.y = rc.top - 1;\r
+ break;\r
+\r
+ default:\r
+ pt.x = rc.left - 1;\r
+ pt.y = rc.top + ((rc.bottom - rc.top) / 2);\r
+ break;\r
+ }\r
+\r
+ MapWindowPoints(HWND_DESKTOP,\r
+ TbDocks->hRebar[DragTo],\r
+ &pt,\r
+ 1);\r
+\r
+ SetCursor(LoadCursor(NULL,\r
+ MAKEINTRESOURCE(IDC_SIZEALL)));\r
+\r
+ SendMessage(TbDocks->hRebar[DragTo],\r
+ WM_LBUTTONDOWN,\r
+ wParam,\r
+ MAKELPARAM(pt.x,\r
+ pt.y));\r
+\r
+ Moved = TRUE;\r
+ }\r
+ }\r
+ }\r
+\r
+ if (!Moved)\r
+ {\r
+MoveFailed:\r
+ TbDocks->Dragging = NULL;\r
+\r
+ SendMessage(hWnd,\r
+ RB_SHOWBAND,\r
+ (WPARAM)uBand,\r
+ TRUE);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ return Ret;\r
+}\r
+\r
+VOID\r
+TbdShowFloatingToolbars(PTOOLBAR_DOCKS TbDocks,\r
+ BOOL Show)\r
+{\r
+ PDOCKBAR_ITEM Item;\r
+\r
+ Item = TbDocks->Items;\r
+ while (Item != NULL)\r
+ {\r
+ if (Item->hWndTool != NULL)\r
+ {\r
+ if ((Show && !IsWindowVisible(Item->hWndTool)) ||\r
+ (!Show && IsWindowVisible(Item->hWndTool)))\r
+ {\r
+ ShowWindow(Item->hWndTool,\r
+ (Show ? SW_SHOW : SW_HIDE));\r
+ }\r
+ }\r
+ Item = Item->Next;\r
+ }\r
+}\r
+\r
+VOID\r
+TbdInitializeDocks(PTOOLBAR_DOCKS TbDocks,\r
+ HWND hWndParent,\r
+ PVOID Context,\r
+ PDOCKBAR_PARENTRESIZE ParentResizeProc)\r
+{\r
+ DWORD rbStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |\r
+ CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_NOMOVEY | CCS_NOMOVEX |\r
+ RBS_VARHEIGHT | RBS_AUTOSIZE;\r
+\r
+ DOCK_POSITION Position;\r
+\r
+ TbDocks->hParent = hWndParent;\r
+ TbDocks->Context = Context;\r
+ TbDocks->ParentResize = ParentResizeProc;\r
+\r
+ for (Position = TOP_DOCK; Position < NO_DOCK; Position++)\r
+ {\r
+ switch (Position)\r
+ {\r
+ case LEFT_DOCK:\r
+ case RIGHT_DOCK:\r
+ rbStyle |= CCS_VERT;\r
+ break;\r
+ default:\r
+ rbStyle &= ~CCS_VERT;\r
+ break;\r
+ }\r
+\r
+ TbDocks->hRebar[Position] = CreateWindowEx(WS_EX_TOOLWINDOW,\r
+ REBARCLASSNAME,\r
+ NULL,\r
+ rbStyle,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ 0,\r
+ TbDocks->hParent,\r
+ NULL,\r
+ hInstance,\r
+ NULL);\r
+\r
+ if (TbDocks->hRebar[Position] != NULL)\r
+ {\r
+ SetWindowSubclass(TbDocks->hRebar[Position],\r
+ RebarSubclassProc,\r
+ 1,\r
+ (DWORD_PTR)TbDocks);\r
+ }\r
+ }\r
+}\r
+\r
+BOOL\r
+TbdInitImpl(VOID)\r
+{\r
+ WNDCLASSEX wc = {0};\r
+\r
+ wc.cbSize = sizeof(WNDCLASSEX);\r
+ wc.style = CS_HREDRAW | CS_VREDRAW;\r
+ wc.lpfnWndProc = ToolDockWndProc;\r
+ wc.cbWndExtra = sizeof(PDOCKBAR_ITEM);\r
+ wc.hInstance = hInstance;\r
+ wc.hCursor = LoadCursor(NULL,\r
+ IDC_ARROW);\r
+ wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);\r
+ wc.lpszClassName = szToolDockWndClass;\r
+\r
+ return RegisterClassEx(&wc) != (ATOM)0;\r
+}\r
+\r
+VOID\r
+TbdUninitImpl(VOID)\r
+{\r
+ UnregisterClass(szToolDockWndClass,\r
+ hInstance);\r
+}\r