--- /dev/null
+IDR_MAINMENU MENU\r
+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 SEPARATOR\r
+ MENUITEM "Save", ID_SAVE, GRAYED\r
+ MENUITEM "Save As", ID_SAVEAS, GRAYED\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "Print Preview", ID_PRINTPRE, GRAYED\r
+ MENUITEM "Print...", ID_PRINT, GRAYED\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "Properties...", ID_PROP, GRAYED\r
+ MENUITEM SEPARATOR\r
+ MENUITEM "E&xit", ID_EXIT\r
+ END\r
+ POPUP "Edit"\r
+ BEGIN\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 SEPARATOR\r
+ MENUITEM "Select All", ID_SELALL, GRAYED\r
+ END\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 SEPARATOR\r
+ MENUITEM "Attributes", -1, GRAYED\r
+ END\r
+ POPUP "Colours"\r
+ BEGIN\r
+ MENUITEM "Edit Colours...", ID_EDITCOLOURS\r
+ END\r
+ POPUP "Window"\r
+ BEGIN\r
+ MENUITEM "Tile", -1\r
+ MENUITEM "Cascade", -1\r
+ END\r
+ POPUP "Help"\r
+ BEGIN\r
+ MENUITEM "About...", ID_ABOUT\r
+ END\r
+END\r
+\r
+IDR_POPUP MENU\r
+BEGIN\r
+ POPUP "popup"\r
+ BEGIN\r
+\r
+ MENUITEM SEPARATOR\r
+\r
+ END\r
+END\r
+\r
+\r
+IDD_ABOUTBOX DIALOGEX 22,16,190,182\r
+CAPTION "About ImageSoft"\r
+FONT 8,"Tahoma",0,0\r
+STYLE WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME\r
+BEGIN\r
+ LTEXT "ImageSoft v0.1\nCopyright (C) 2006\nby Ged Murphy (gedmurphy@gmail.com)", IDC_STATIC, 48, 7, 130, 26\r
+ PUSHBUTTON "Close", IDOK, 75, 162, 44, 15\r
+ ICON IDI_ICON, IDC_STATIC, 10, 10, 7, 30\r
+ EDITTEXT IDC_LICENSE_EDIT, 8, 44, 174, 107, WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | ES_READONLY | ES_MULTILINE\r
+END\r
+\r
+\r
+STRINGTABLE DISCARDABLE\r
+BEGIN\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
+END\r
+\r
+/* Tooltips */\r
+STRINGTABLE DISCARDABLE\r
+BEGIN\r
+ IDS_TOOLTIP_NEW "New"\r
+ IDS_TOOLTIP_OPEN "Open"\r
+ IDS_TOOLTIP_SAVE "Save"\r
+ IDS_TOOLTIP_PRINTPRE "Print preview"\r
+ IDS_TOOLTIP_PRINT "Print"\r
+ IDS_TOOLTIP_CUT "Cut"\r
+ IDS_TOOLTIP_COPY "Copy"\r
+ IDS_TOOLTIP_PASTE "Paste"\r
+ IDS_TOOLTIP_UNDO "Undo"\r
+ IDS_TOOLTIP_REDO "Redo"\r
+END\r
--- /dev/null
+#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
+\r
+HINSTANCE hInstance;\r
+HWND hMainWnd;\r
+HWND hMDIClient;\r
+HWND hStatus;\r
+HWND hTool;\r
+HWND hwndRebar;\r
+HMENU hShortcutMenu;\r
+\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
+{\r
+ MDICREATESTRUCT mcs;\r
+ HWND hChild;\r
+ TCHAR Buf[15];\r
+ static DWORD MDINum = 1;\r
+\r
+ _sntprintf(Buf, sizeof(Buf) / sizeof(TCHAR), _T("Untitled%d"), MDINum);\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 = MDIS_ALLCHILDSTYLES;\r
+\r
+ hChild = (HWND)SendMessage(hMDIClient, WM_MDICREATE, 0, (LONG)&mcs);\r
+ if(!hChild)\r
+ {\r
+ MessageBox(hMDIClient, _T("MDI Child creation failed."), _T("Error!"),\r
+ MB_ICONEXCLAMATION | MB_OK);\r
+ return hChild;\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
+ {\r
+ case WM_CREATE:\r
+ {\r
+ CLIENTCREATESTRUCT ccs;\r
+ TBADDBITMAP tbab;\r
+ INT iImageOffset;\r
+ INT statwidths[] = {300, 450, 550, -1}; /* widths of status bar */\r
+ TCHAR Buf[6];\r
+\r
+ /* Toolbar buttons */\r
+ TBBUTTON tbb [NUM_BUTTONS] =\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
+ /* Note: First item for a seperator is its width in pixels */\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
+\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 custom images */\r
+ tbab.hInst = HINST_COMMCTRL;\r
+ tbab.nID = IDB_STD_SMALL_COLOR;\r
+ iImageOffset = (INT)SendMessage(hTool, TB_ADDBITMAP, NUM_BUTTONS, (LPARAM)&tbab);\r
+ /* tbb[0].iBitmap += iImageOffset; / * properties * /\r
+ tbb[1].iBitmap += iImageOffset; / * refresh * /\r
+ tbb[2].iBitmap += iImageOffset; / * export * /\r
+ tbb[4].iBitmap += iImageOffset; / * create * /\r
+ tbb[6].iBitmap += iImageOffset; / * start * /\r
+ tbb[7].iBitmap += iImageOffset; / * stop * /\r
+ tbb[8].iBitmap += iImageOffset; / * pause * /\r
+ tbb[9].iBitmap += iImageOffset; / * restart * /\r
+ tbb[11].iBitmap += iImageOffset; / * help * /\r
+ tbb[12].iBitmap += iImageOffset; / * exit * /\r
+*/\r
+ /* Add buttons to toolbar */\r
+ SendMessage(hTool, TB_ADDBUTTONS, NUM_BUTTONS, (LPARAM) &tbb);\r
+\r
+ /* Show toolbar */\r
+ ShowWindow(hTool, SW_SHOWNORMAL);\r
+\r
+\r
+\r
+/* ======================== Create Floating Toolbar ============================== */\r
+\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), 4);\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
+ /* 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
+ }\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
+ /* 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
+ SendMessage(hStatus, WM_SIZE, 0, 0);\r
+\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
+ {\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
+ {\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
+ {\r
+ /* close the active child window */\r
+ HWND hChild = (HWND)SendMessage(hMDIClient, WM_MDIGETACTIVE,0,0);\r
+ if(hChild)\r
+ {\r
+ SendMessage(hChild, WM_CLOSE, 0, 0);\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
+ }\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
+/*\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 HDC hdcMem;\r
+ static INT cxClient, cyClient, xMouse, yMouse;\r
+ HDC hdc;\r
+ PAINTSTRUCT ps;\r
+\r
+ switch(msg)\r
+ {\r
+ case WM_CREATE:\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
+ }\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
+ if (!fLeftButtonDown && !fRightButtonDown)\r
+ return 0;\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_COMMAND:\r
+ switch(LOWORD(wParam))\r
+ {\r
+\r
+ }\r
+ break;\r
+\r
+ case WM_SIZE:\r
+ return DefMDIChildProc(hwnd, msg, wParam, lParam);\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
+ }\r
+\r
+ ShowWindow(hMainWnd, nCmdShow);\r
+ UpdateWindow(hMainWnd);\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
+}\r