MENUITEM SEPARATOR\r
MENUITEM "Select All", ID_SELALL, GRAYED\r
END\r
+ POPUP "View"\r
+ BEGIN\r
+ MENUITEM "Tools", ID_TOOLS, CHECKED\r
+ MENUITEM "Status Bar", ID_STATUSBAR, CHECKED\r
+ END\r
POPUP "Image"\r
BEGIN\r
MENUITEM "Crop", -1, GRAYED\r
CAPTION "About ImageSoft"\r
FONT 8,"Tahoma",0,0\r
STYLE WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME\r
+//EXSTYLE WS_EX_LAYERED\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
EDITTEXT IDC_LICENSE_EDIT, 8, 44, 174, 107, WS_VISIBLE | WS_VSCROLL | WS_TABSTOP | ES_READONLY | ES_MULTILINE\r
END\r
\r
+/* floating toolbar */\r
+IDD_TOOLBAR DIALOGEX 1, 19, 32, 112\r
+STYLE WS_POPUP | WS_SYSMENU | WS_CAPTION | WS_VISIBLE\r
+EXSTYLE WS_EX_TOOLWINDOW\r
+CAPTION "Tools"\r
+FONT 8, "MS Sans Serif"\r
+BEGIN\r
+\r
+ PUSHBUTTON "1", IDC_PRESS,0,0,16,16\r
+ PUSHBUTTON "2", IDC_PRESS,16,0,16,16\r
+ PUSHBUTTON "3", IDC_PRESS,0,16,16,16\r
+ PUSHBUTTON "4", IDC_PRESS,16,16,16,16\r
+ PUSHBUTTON "5", IDC_PRESS,0,32,16,16\r
+ PUSHBUTTON "6", IDC_PRESS,16,32,16,16\r
+ PUSHBUTTON "7", IDC_PRESS,0,48,16,16\r
+ PUSHBUTTON "8", IDC_PRESS,16,48,16,16\r
+ PUSHBUTTON "9", IDC_PRESS,0,64,16,16\r
+ PUSHBUTTON "10", IDC_PRESS,16,64,16,16\r
+\r
+END\r
+\r
\r
STRINGTABLE DISCARDABLE\r
BEGIN\r
HWND hMDIClient;\r
HWND hStatus;\r
HWND hTool;\r
-HWND hwndRebar;\r
+HWND hFloatTool;\r
HMENU hShortcutMenu;\r
\r
+WORD cxClient;\r
+WORD cyClient;\r
\r
/*\r
* Initialize the structure and send a message to the MDI\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
\r
+ style = 0;//MDIS_ALLCHILDSTYLES & ~WS_BORDER;\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
+ mcs.style = style; //MDIS_ALLCHILDSTYLES | WS_MAXIMIZE;\r
\r
- hChild = (HWND)SendMessage(hMDIClient, WM_MDICREATE, 0, (LONG)&mcs);\r
+ hChild = (HWND)SendMessage(hMDIClient, WM_MDICREATE, 0, (LPARAM)&mcs);\r
if(!hChild)\r
{\r
MessageBox(hMDIClient, _T("MDI Child creation failed."), _T("Error!"),\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
- /* Toolbar buttons */\r
- TBBUTTON tbb [NUM_BUTTONS] =\r
- { /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */\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
- /* 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
\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
/* 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
+ /* Add standard 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
+ SendMessage(hTool, TB_ADDBITMAP, NUM_BUTTONS, (LPARAM)&tbab);\r
+\r
/* Add buttons to toolbar */\r
- SendMessage(hTool, TB_ADDBUTTONS, NUM_BUTTONS, (LPARAM) &tbb);\r
+ SendMessage(hTool, TB_ADDBUTTONS, NUM_BUTTONS, (LPARAM) &StdButtons);\r
\r
/* Show toolbar */\r
- ShowWindow(hTool, SW_SHOWNORMAL);\r
+ ShowWindow(hTool, SW_SHOW);\r
\r
\r
\r
/* ======================== Create Floating Toolbar ============================== */\r
\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
/* ======================= Create MDI Client ============================= */\r
\r
/* Find window menu where children will be listed */\r
- ccs.hWindowMenu = GetSubMenu(GetMenu(hwnd), 4);\r
+ ccs.hWindowMenu = GetSubMenu(GetMenu(hwnd), 5);\r
ccs.idFirstChild = ID_MDI_FIRSTCHILD;\r
\r
hMDIClient = CreateWindowEx(WS_EX_CLIENTEDGE,\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
/* 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
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
/* 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
}\r
}\r
break;\r
-\r
+/*\r
case WM_CONTEXTMENU:\r
{\r
int xPos, yPos;\r
xPos, yPos, hwnd, NULL);\r
}\r
break;\r
-\r
+*/\r
case WM_COMMAND:\r
\r
switch(LOWORD(wParam))\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
\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 cxClient, cyClient, xMouse, yMouse;\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
+ }\r
+\r
+ SelectObject(hdcMem, hBitmap);\r
+ PatBlt(hdcMem, 0, 0, cxBitmap, cyBitmap, WHITENESS);\r
+\r
break;\r
\r
case WM_MDIACTIVATE:\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
_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
- return 0;\r
+ break;\r
\r
hdc = GetDC(hwnd);\r
\r
EndPaint(hwnd, &ps);\r
break;\r
\r
- case WM_COMMAND:\r
- switch(LOWORD(wParam))\r
- {\r
+ case WM_SIZE:\r
\r
- }\r
- break;\r
\r
- case WM_SIZE:\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