#include "ImgPF.h" static L_BOOL PaletteDlg_OnCommand (HWND hWnd, L_INT nID, HWND hWndCtl, L_UINT uCodeNotify); static L_BOOL PaletteDlg_OnInitDialog (HWND hWnd, HWND hWndFocus, LPARAM lParam); static L_VOID PaletteDlg_OnTimer (HWND hWnd, L_INT nID); static L_BOOL ClrWnd_OnInitDialog (HWND hWnd, HWND hWndFocus, LPARAM lParam); static L_BOOL ClrWnd_OnPaint (HWND hWnd); static L_BOOL ClrWnd_OnMouseMove (HWND hWnd, L_INT nX, L_INT nY, L_UINT uKeyFlags); static L_BOOL ClrWnd_OnLButtonDown (HWND hWnd, L_BOOL fDoubleClick, L_INT nX, L_INT nY, L_UINT uKeyFlags); static L_BOOL ClrWnd_OnRButtonDown (HWND hWnd, L_BOOL fDoubleClick, L_INT nX, L_INT nY, L_UINT uKeyFlags); L_INT ShowColorDialogExt(HWND hWnd, COLORREF crOldColor, LPCOLORREF crNewColor) { COLORDLGPARAMS DlgParams ; L_INT nRet; memset(&DlgParams, 0, sizeof(COLORDLGPARAMS)); SetCursor(LoadCursor(NULL, IDC_WAIT)); DlgParams.uStructSize = sizeof(COLORDLGPARAMS); DlgParams.crColor = crOldColor; DlgParams.uDlgFlags = 0x0001fffe; DlgParams.uColorSpace = DLG_COLOR_COLORSPACE_SHOW_RGB; nRet = L_DlgColor ( hWnd, &DlgParams ); if (nRet == SUCCESS_DLG_OK) *crNewColor = DlgParams.crColor; return nRet; } L_VOID WriteColorDown(HWND hWnd, COLORREF crColor) { L_TCHAR szText[30]; wsprintf(szText, TEXT("R: %d, G: %d B: %d"), GetRValue(crColor), GetGValue(crColor), GetBValue(crColor)); SetDlgItemText(hWnd, IDC_PAL_CLR_TXT, szText); } LRESULT CALLBACK ClrWndProc(HWND hWnd, L_UINT uMessage, WPARAM wParam, LPARAM lParam) { LPCLRWND pClrWnd = (LPCLRWND)GetWindowLong(hWnd, GWL_USERDATA); WNDPROC oldWndProc = pClrWnd->oldWndProc; LPPALETTEDLG pPaletteDlg = (LPPALETTEDLG)GetWindowLong(GetParent(hWnd), GWL_USERDATA); switch(uMessage) { HANDLE_MSG(hWnd, WM_PAINT, ClrWnd_OnPaint); HANDLE_MSG(hWnd, WM_MOUSEMOVE, ClrWnd_OnMouseMove); HANDLE_MSG(hWnd, WM_LBUTTONDOWN, ClrWnd_OnLButtonDown); HANDLE_MSG(hWnd, WM_INITDIALOG, ClrWnd_OnInitDialog); HANDLE_MSG(hWnd, WM_RBUTTONDOWN, ClrWnd_OnRButtonDown); case WM_LBUTTONDBLCLK: { LPPALETTEDLG pPaletteDlg = (LPPALETTEDLG)GetWindowLong(GetParent(hWnd), GWL_USERDATA); HWND hWndPre = GetDlgItem(GetParent(hWnd), IDC_PAL_0_TXT + pPaletteDlg->uCurrent); LPCLRWND pClrWndP = (LPCLRWND) GetWindowLong(hWndPre, GWL_USERDATA); COLORREF crColor = pClrWnd->crColor; L_INT nRet; nRet = ShowColorDialogExt(hWnd, crColor, &pClrWnd->crColor); if (nRet == SUCCESS_DLG_OK) { InvalidateRect(hWnd, NULL, FALSE); pClrWnd->bData = TRUE; pClrWnd->bActive = TRUE; pClrWndP->bActive = FALSE; pPaletteDlg->uCurrent = GetDlgCtrlID(hWnd) - IDC_PAL_0_TXT; InvalidateRect(hWndPre, NULL, FALSE); InvalidateRect(hWnd, NULL, FALSE); WriteColorDown(GetParent(hWnd), pClrWnd->crColor); } } break; case WM_DESTROY: if (pClrWnd->bData) { pPaletteDlg->pColorArray[pPaletteDlg->uCount] = pClrWnd->crColor; pPaletteDlg->uCount++; } SetWindowLong(hWnd, GWL_WNDPROC, (LONG)oldWndProc); free(pClrWnd); break; } return CallWindowProc (oldWndProc, hWnd, uMessage, wParam, lParam); } static L_BOOL ClrWnd_OnInitDialog (HWND hWnd, HWND hWndFocus, LPARAM lParam) { InvalidateRect(hWnd, NULL, FALSE); return SUCCESS; } static L_BOOL ClrWnd_OnPaint (HWND hWnd) { RECT rcRect; PAINTSTRUCT ps; HDC hDC; LPCLRWND pClrWnd = (LPCLRWND)GetWindowLong(hWnd, GWL_USERDATA); HBRUSH hBrush; GetClientRect(hWnd, &rcRect); hDC = BeginPaint(hWnd, &ps); FillRect(hDC, &rcRect, (HBRUSH)COLOR_WINDOW); if (pClrWnd->bData) { if (pClrWnd->bActive) Rectangle(hDC, rcRect.left + 1, rcRect.left + 1, rcRect.right - 1, rcRect.bottom - 1); hBrush = CreateSolidBrush(pClrWnd->crColor); rcRect.left += 3; rcRect.top += 3; rcRect.right -= 3; rcRect.bottom -= 3; FillRect(hDC, &rcRect, hBrush); DeleteBrush(hBrush); } else { MoveToEx(hDC, 0, 0, NULL); LineTo(hDC, rcRect.right - 1, rcRect.bottom - 1); MoveToEx(hDC, rcRect.right - 1, 0, NULL); LineTo(hDC, 0, rcRect.bottom - 1); } EndPaint(hWnd, &ps); return SUCCESS; } static L_BOOL ClrWnd_OnMouseMove (HWND hWnd, L_INT nX, L_INT nY, L_UINT uKeyFlags) { return TRUE; } static L_BOOL ClrWnd_OnRButtonDown (HWND hWnd, L_BOOL fDoubleClick, L_INT nX, L_INT nY, L_UINT uKeyFlags) { LPCLRWND pClrWnd = (LPCLRWND)GetWindowLong(hWnd, GWL_USERDATA); if (pClrWnd->bData) { pClrWnd->bData = FALSE; pClrWnd->bActive = FALSE; SetDlgItemText(GetParent(hWnd), IDC_PAL_CLR_TXT, TEXT("")); InvalidateRect(hWnd, NULL, FALSE); } return TRUE; } static L_BOOL ClrWnd_OnLButtonDown (HWND hWnd, L_BOOL fDoubleClick, L_INT nX, L_INT nY, L_UINT uKeyFlags) { LPCLRWND pClrWnd = (LPCLRWND)GetWindowLong(hWnd, GWL_USERDATA); if (pClrWnd->bData) { LPPALETTEDLG pPaletteDlg = (LPPALETTEDLG)GetWindowLong(GetParent(hWnd), GWL_USERDATA); HWND hWndPre = GetDlgItem(GetParent(hWnd), IDC_PAL_0_TXT + pPaletteDlg->uCurrent); LPCLRWND pClrWndP = (LPCLRWND) GetWindowLong(hWndPre, GWL_USERDATA); pClrWndP->bActive = FALSE; pClrWnd->bActive = TRUE; pPaletteDlg->uCurrent = GetDlgCtrlID(hWnd) - IDC_PAL_0_TXT; WriteColorDown(GetParent(hWnd), pClrWnd->crColor); InvalidateRect(hWndPre, NULL, FALSE); InvalidateRect(hWnd, NULL, FALSE); } return TRUE; } L_BOOL CALLBACK PaletteDlgProc(HWND hWnd, L_UINT uMessage, WPARAM wParam, LPARAM lParam) { switch(uMessage) { HANDLE_MSG (hWnd, WM_COMMAND, PaletteDlg_OnCommand); HANDLE_MSG (hWnd, WM_INITDIALOG, PaletteDlg_OnInitDialog); HANDLE_MSG (hWnd, WM_TIMER, PaletteDlg_OnTimer); } return FALSE; } static L_BOOL PaletteDlg_OnCommand(HWND hWnd, L_INT nID, HWND hWndCtl, L_UINT uCodeNotify) { switch(nID) { case IDOK: EndDialog(hWnd, TRUE); break; case IDCANCEL: EndDialog(hWnd, FALSE); break; } return TRUE; } static L_BOOL PaletteDlg_OnInitDialog(HWND hWnd, HWND hWndFocus, LPARAM lParam) { LPPALETTEDLG pPaletteDlg = (LPPALETTEDLG)lParam; L_INT nI; pPaletteDlg->uCurrent = 0; for (nI = 0; nI < 32; nI++) { LPCLRWND pClrWnd = (LPCLRWND)malloc(sizeof(CLRWND)); memset(pClrWnd, 0, sizeof(CLRWND)); pClrWnd->bActive = (!nI) ? TRUE : FALSE; if (nI < (L_INT)pPaletteDlg->uCount) { pClrWnd->bData = TRUE; pClrWnd->crColor = pPaletteDlg->pColorArray[nI]; } pClrWnd->oldWndProc = (WNDPROC)GetWindowLong(GetDlgItem(hWnd, IDC_PAL_0_TXT + nI), GWL_WNDPROC); SetWindowLong(GetDlgItem(hWnd, IDC_PAL_0_TXT + nI), GWL_WNDPROC, (LONG)ClrWndProc); SetWindowLong(GetDlgItem(hWnd, IDC_PAL_0_TXT + nI), GWL_USERDATA, (LONG)pClrWnd); } WriteColorDown(hWnd, pPaletteDlg->pColorArray[0]); pPaletteDlg->uCount = 0; SetWindowLong(hWnd, GWL_USERDATA, (LONG)pPaletteDlg); return TRUE; } static L_VOID PaletteDlg_OnTimer(HWND hWnd, L_INT nID) { Dialog_Timer(nID); }