#include "precomp.h" static const TCHAR szFloatWndClass[] = TEXT("ImageSoftFloatWndClass"); #define ID_TIMER1 1 #define ID_TIMER2 2 #define ID_TIMER3 3 TBBUTTON ToolsButtons[] = { /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */ {TBICON_RECTSEL, ID_RECTSEL, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* rectangle select */ {TBICON_MOVESEL, ID_MOVESEL, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* move selected pixels */ {TBICON_LASOO, ID_LASOO, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* lasso select */ {TBICON_MOVE, ID_MOVE, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* move selection */ {TBICON_ECLIPSESEL, ID_ECLIPSESEL, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* elipse select */ {TBICON_ZOOM, ID_ZOOM, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* zoom */ {TBICON_MAGICWAND, ID_MAGICWAND, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* magic wand */ {TBICON_TEXT, ID_TEXT, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* text */ {TBICON_PAINTBRUSH, ID_PAINTBRUSH, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* paintbrush */ {TBICON_ERASER, ID_ERASER, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* eraser */ {TBICON_PENCIL, ID_PENCIL, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* pencil */ {TBICON_COLORPICKER, ID_COLORPICKER, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* color picker */ {TBICON_CLONESTAMP, ID_CLONESTAMP, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* clone stamp */ {TBICON_RECOLORING, ID_RECOLORING, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* recolor */ {TBICON_PAINTBUCKET, ID_PAINTBUCKET, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* paint bucket */ {TBICON_LINE, ID_LINE, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* line */ {TBICON_RECTANGLE, ID_RECTANGLE, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* rectangle */ {TBICON_ROUNDRECT, ID_ROUNDRECT, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* round rectangle */ {TBICON_ECLIPSE, ID_ECLIPSE, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* elipse */ {TBICON_FREEFORM, ID_FREEFORM, TBSTATE_ENABLED, BTNS_BUTTON | TBSTYLE_GROUP | TBSTYLE_CHECK, {0}, 0, 0}, /* free form */ {10, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, }; TBBUTTON HistoryButtons[] = { {TBICON_BACKSM, ID_BACK, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* back */ {TBICON_UNDOSM, ID_UNDO, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* undo */ {TBICON_REDOSM, ID_REDO, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* redo */ {TBICON_FORWARDSM, ID_FORWARD, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* forward */ {TBICON_DELETESM, ID_DELETE, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* delete */ }; BOOL ShowHideWindow(HWND hwnd) { if (IsWindowVisible(hwnd)) return ShowWindow(hwnd, SW_HIDE); else return ShowWindow(hwnd, SW_SHOW); } BOOL FloatToolbarCreateToolsGui(PMAIN_WND_INFO Info) { HWND hTb; HIMAGELIST hImageList; INT NumButtons; NumButtons = sizeof(ToolsButtons) / sizeof(ToolsButtons[0]); hTb = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_WRAPABLE | CCS_NODIVIDER, 0, 0, 32, 200, Info->fltTools->hSelf, NULL, hInstance, NULL); if (hTb != NULL) { SendMessage(hTb, TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_HIDECLIPPEDBUTTONS); SendMessage(hTb, TB_BUTTONSTRUCTSIZE, sizeof(ToolsButtons[0]), 0); SendMessage(hTb, TB_SETBITMAPSIZE, 0, (LPARAM)MAKELONG(16, 16)); hImageList = InitImageList(NumButtons, IDB_TOOLSRECTSEL); ImageList_Destroy((HIMAGELIST)SendMessage(hTb, TB_SETIMAGELIST, 0, (LPARAM)hImageList)); SendMessage(hTb, TB_ADDBUTTONS, NumButtons, (LPARAM)ToolsButtons); SendMessage(hTb, TB_AUTOSIZE, 0, 0); return TRUE; } return FALSE; } VOID FloatWindowPaintColorPicker(HWND hColorPicker) { HDC hdc; RECT rect; InvalidateRect(hColorPicker, NULL, TRUE); UpdateWindow(hColorPicker); hdc = GetDC(hColorPicker); GetClientRect(hColorPicker, &rect); Ellipse(hdc, rect.left, rect.top, rect.right, rect.bottom); ReleaseDC(hColorPicker, hdc); } VOID FloatWindowPaintHueSlider(HWND hHueSlider) { HDC hdc; RECT rect; InvalidateRect(hHueSlider, NULL, TRUE); UpdateWindow(hHueSlider); hdc = GetDC(hHueSlider); GetClientRect(hHueSlider, &rect); Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom); ReleaseDC(hHueSlider, hdc); } BOOL FloatToolbarCreateColorsGui(PMAIN_WND_INFO Info) { HWND hColorPicker; HWND hHueSlider; HWND hMouseButton; HWND hMore; RECT rect; HBITMAP hMoreBitmap; GetClientRect(Info->fltColors->hSelf, &rect); hColorPicker = CreateWindowEx(0, WC_STATIC, NULL, WS_CHILD | WS_VISIBLE | CBS_DROPDOWN, 2, 2, (int) (rect.right * 0.65), rect.bottom - 2, Info->fltColors->hSelf, NULL, hInstance, NULL); if (hColorPicker == NULL) return FALSE; hHueSlider = CreateWindowEx(0, WC_STATIC, NULL, WS_CHILD | WS_VISIBLE | CBS_DROPDOWN, 145, 35, 25, 135, Info->fltColors->hSelf, NULL, hInstance, NULL); if (hHueSlider == NULL) return FALSE; hMouseButton = CreateWindowEx(0, WC_COMBOBOX, NULL, WS_CHILD | WS_VISIBLE | CBS_DROPDOWN, 118, 5, 75, 25, Info->fltColors->hSelf, NULL, hInstance, NULL); if (hMouseButton == NULL) return FALSE; MakeFlatCombo(hMouseButton); /* temp, just testing */ SendMessage(hMouseButton, CB_ADDSTRING, 0, (LPARAM)_T("Primary")); SendMessage(hMouseButton, CB_ADDSTRING, 0, (LPARAM)_T("Secondary")); SendMessage(hMouseButton, CB_SETCURSEL, 0, 0); hMore = CreateWindowEx(WS_EX_STATICEDGE, WC_BUTTON, NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP, rect.right - 15, rect.bottom - 15, 15, 15, Info->fltColors->hSelf, NULL, hInstance, NULL); if (hMore == NULL) return FALSE; hMoreBitmap = (HBITMAP)LoadImage(hInstance, MAKEINTRESOURCE(IDB_COLORSMORE), IMAGE_BITMAP, 12, 11, LR_LOADTRANSPARENT | LR_LOADMAP3DCOLORS); if (hMoreBitmap != NULL) { SendMessage(hMore, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hMoreBitmap); } /* temp functions for playing about with possible layouts */ FloatWindowPaintHueSlider(hHueSlider); FloatWindowPaintColorPicker(hColorPicker); if (hColorPicker != NULL) { HDC hDc = GetDC(hColorPicker); TextOut(hDc, 8, 75, _T("Possible layout?"), 16); ReleaseDC(hColorPicker, hDc); } return TRUE; } BOOL FloatToolbarCreateHistoryGui(PMAIN_WND_INFO Info) { HWND hList; HWND hButtons; HIMAGELIST hImageList; INT NumButtons; hList = CreateWindowEx(0, WC_LISTBOX, NULL, WS_CHILD | WS_VISIBLE | LBS_EXTENDEDSEL, 0, 0, 143, 100, Info->fltHistory->hSelf, NULL, hInstance, NULL); if (hList == NULL) return FALSE; NumButtons = sizeof(HistoryButtons) / sizeof(HistoryButtons[0]); hButtons = CreateWindowEx(0, TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | CCS_BOTTOM | CCS_NODIVIDER, 0, 0, 0, 0, Info->fltHistory->hSelf, NULL, hInstance, NULL); if (hButtons != NULL) { SendMessage(hButtons, TB_BUTTONSTRUCTSIZE, sizeof(ToolsButtons[0]), 0); SendMessage(hButtons, TB_SETBITMAPSIZE, 0, (LPARAM)MAKELONG(10, 10)); hImageList = InitImageList(NumButtons, IDB_HISTBACK); ImageList_Destroy((HIMAGELIST)SendMessage(hButtons, TB_SETIMAGELIST, 0, (LPARAM)hImageList)); SendMessage(hButtons, TB_SETBUTTONSIZE, 0, MAKELONG(18, 16)); SendMessage(hButtons, TB_ADDBUTTONS, NumButtons, (LPARAM)HistoryButtons); return TRUE; } return FALSE; } static VOID DoTimer(PFLT_WND FltInfo, UINT idTimer) { switch (idTimer) { /* timer to check if cursor is in toolbar coords */ case ID_TIMER1: { POINT pt; /* kill timer if toobar is not opaque */ if (FltInfo->bOpaque != TRUE) { KillTimer(FltInfo->hSelf, ID_TIMER1); break; } if (GetCursorPos(&pt)) { RECT rect; if (GetWindowRect(FltInfo->hSelf, &rect)) { if (!PtInRect(&rect, pt)) { KillTimer(FltInfo->hSelf, ID_TIMER1); KillTimer(FltInfo->hSelf, ID_TIMER2); /* timer to fade out toolbar */ SetTimer(FltInfo->hSelf, ID_TIMER3, 50, NULL); } } } } break; /* timer to fade in toolbar */ case ID_TIMER2: { SetLayeredWindowAttributes(FltInfo->hSelf, 0, (255 * FltInfo->Transparancy) / 100, LWA_ALPHA); /* increment transparancy until it is opaque (100) */ FltInfo->Transparancy += 5; if (FltInfo->Transparancy == 100) { SetWindowLongPtr(FltInfo->hSelf, GWL_EXSTYLE, GetWindowLongPtr(FltInfo->hSelf, GWL_EXSTYLE) & ~WS_EX_LAYERED); FltInfo->bOpaque = TRUE; KillTimer(FltInfo->hSelf, ID_TIMER2); } } break; case ID_TIMER3: { LONG Style; Style = GetWindowLongPtr(FltInfo->hSelf, GWL_EXSTYLE); if (Style & ~WS_EX_LAYERED) { SetWindowLongPtr(FltInfo->hSelf, GWL_EXSTYLE, Style | WS_EX_LAYERED); } FltInfo->Transparancy -= 5; if (FltInfo->Transparancy >= 60) { /* set the tranclucency to 60% */ SetLayeredWindowAttributes(FltInfo->hSelf, 0, (255 * FltInfo->Transparancy) / 100, LWA_ALPHA); if (FltInfo->Transparancy == 60) { FltInfo->bOpaque = FALSE; KillTimer(FltInfo->hSelf, ID_TIMER3); } } } break; } } LRESULT CALLBACK FloatToolbarWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { PFLT_WND FltInfo; /* Get the window context */ FltInfo = (PFLT_WND)GetWindowLongPtr(hwnd, GWLP_USERDATA); if (FltInfo == NULL && Message != WM_CREATE) { goto HandleDefaultMessage; } switch(Message) { case WM_CREATE: { FltInfo = (PFLT_WND)(((LPCREATESTRUCT)lParam)->lpCreateParams); /*FIXME: read this from registry */ // FltInfo->bShow = TRUE; SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)FltInfo); FltInfo->bOpaque = FALSE; SetWindowLongPtr(hwnd, GWL_EXSTYLE, GetWindowLongPtr(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); /* set the tranclucency to 60% */ FltInfo->Transparancy = 60; SetLayeredWindowAttributes(hwnd, 0, (255 * FltInfo->Transparancy) / 100, LWA_ALPHA); } break; case WM_TIMER: { DoTimer(FltInfo, wParam); } break; case WM_NCMOUSEMOVE: case WM_MOUSEMOVE: { if (FltInfo->bOpaque == FALSE) { RedrawWindow(hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); FltInfo->bOpaque = TRUE; //MessageBox(NULL, _T("in"), _T("Hit test"), MB_OK | MB_ICONEXCLAMATION); /* timer to check if cursor is in toolbar coords */ SetTimer(hwnd, ID_TIMER1, 200, NULL); /* timer to fade in the toolbars */ SetTimer(hwnd, ID_TIMER2, 50, NULL); } } break; case WM_CLOSE: ShowHideWindow(FltInfo->hSelf); break; case WM_COMMAND: { if (LOWORD(wParam) == IDCANCEL) ShowHideWindow(FltInfo->hSelf); switch(LOWORD(wParam)) { case ID_NEW: MessageBox(hwnd, _T("Kapow!"), _T("Hit test"), MB_OK | MB_ICONEXCLAMATION); break; case ID_CLONESTAMP: case ID_COLORPICKER: case ID_ECLIPSE: case ID_ECLIPSESEL: case ID_ERASER: case ID_FREEFORM: case ID_LASOO: case ID_LINE: case ID_MAGICWAND: case ID_MOVE: case ID_MOVESEL: case ID_PAINTBRUSH: case ID_PAINTBUCKET: case ID_PENCIL: case ID_RECOLORING: case ID_RECTANGLE: case ID_ROUNDRECT: case ID_TEXT: case ID_ZOOM: /*SendMessage(Info->hSelf, LOWORD(wParam), wParam, lParam);*/ break; } } break; case WM_NCACTIVATE: /* FIXME: needs fully implementing */ return DefWindowProc(hwnd, Message, TRUE, lParam); break; case WM_DESTROY: SetWindowLongPtr(hwnd, GWLP_USERDATA, 0); break; default: HandleDefaultMessage: return DefWindowProc(hwnd, Message, wParam, lParam); } return 0; } BOOL InitFloatWndClass(VOID) { WNDCLASSEX wc = {0}; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = FloatToolbarWndProc; wc.hInstance = hInstance; wc.hIcon = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); wc.lpszClassName = szFloatWndClass; wc.hIconSm = NULL; return RegisterClassEx(&wc) != (ATOM)0; } VOID UninitFloatWndImpl(VOID) { UnregisterClass(szFloatWndClass, hInstance); }