/*[]=====================================================================[]*/ /*[] LeadTools Run Time Library - Version 14 []*/ /*[] []*/ /*[] []*/ /*[] Copyright (c) 1991-2004 LEAD Technologies, Inc. []*/ /*[] All Rights Reserved. []*/ /*[]=====================================================================[]*/ #include "ImgPF.h" static L_BOOL SelectiveColorDialog_OnInitDialog (HWND hWnd, HWND hWndFocus, LPARAM lParam); static L_BOOL SelectiveColorDialog_OnHScroll (HWND hWnd, HWND hWndCtl, L_UINT nCode, L_INT nPos); static L_BOOL SelectiveColorDialog_OnCommand (HWND hWnd, L_INT nID, HWND hWndCtl, L_UINT codeNotify); static L_BOOL SelectiveColorDialog_OnClose (HWND hWnd); static L_VOID L_ApplyFilter (HWND hWnd); static L_VOID SelectiveColorDialog_OnTimer (HWND hWnd, L_INT nID); L_BOOL CALLBACK SelectiveColorDlgProc (HWND hWnd, L_UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { HANDLE_MSG (hWnd, WM_INITDIALOG, SelectiveColorDialog_OnInitDialog); HANDLE_MSG (hWnd, WM_COMMAND , SelectiveColorDialog_OnCommand); HANDLE_MSG (hWnd, WM_CLOSE , SelectiveColorDialog_OnClose); HANDLE_MSG (hWnd, WM_HSCROLL , SelectiveColorDialog_OnHScroll); HANDLE_MSG (hWnd, WM_TIMER, SelectiveColorDialog_OnTimer); case WM_USER_UPDATEVIEW: StatusProc.ProgressValue = 100; L_ApplyFilter (hWnd); break; } return FALSE; } static L_BOOL SelectiveColorDialog_OnInitDialog (HWND hWnd, HWND hWndFocus, LPARAM lParam) { LPSCLRDLGDATA pSClrDlgData; pCHILDDATA pData; L_UINT uItems; L_INT nRangeMax [] = { 100, 100, 100, 100}; L_INT nRangeMin [] = {-100, -100, -100, -100}; L_INT nLineSize [] = { 1, 1, 1, 1}; L_INT nPageSize [] = { 5, 5, 5, 5}; L_INT nPosInit [] = { 0, 0, 0, 0}; HWND hWndParent; HWND hCmboCtrl; HWND hEditBox; HWND hSldr; RECT rcRgn; hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient,SendMessage); pData = LOCKCHILDDATA (hWndParent); pSClrDlgData = (LPSCLRDLGDATA) lParam; MoveDialogToMiddle(hWnd); memset(pSClrDlgData, 0, sizeof(SCLRDLGDATA)); pSClrDlgData->bIsRelative = TRUE; SetWindowLong(hWnd, GWL_USERDATA, (LONG) pSClrDlgData); //MEMDISK...// MemorizeAndCopyBitmap (hWndParent, &pSClrDlgData->Bitmap); L_GetBitmapRgnBounds(&pSClrDlgData->Bitmap, NULL, &rcRgn); StatusProc.bProgress = TRUE; StatusProc.bInvalidate = FALSE; StatusProc.bEnd = FALSE; StatusProc.DlgWnd = hWnd; StatusProc.ProgressValue = 100; StatusProc.ProgWnd = GetDlgItem(hWnd, IDC_SCL_PROG); StatusProc.bKillProgress = TRUE; Progress_SetRange(StatusProc.ProgWnd, 0, 100); Progress_SetPos (StatusProc.ProgWnd, 0); UpdateWindow(hWnd); // Notice that in Trackbar_SetRange(), if ranges are very huge like // 65535, then this macro will not work. You must use // SendMessage(hwnd, TBM_SETRANGEMIN, redraw, minRange) and // SendMessage(hwnd, TBM_SETRANGEMAX, redraw, maxRange). pSClrDlgData->nSlideNum = 4; pSClrDlgData->nEdtBaseID = IDC_SCL_CYN_EDT; pSClrDlgData->nSldBaseID = IDC_SCL_CYN_SLD; pSClrDlgData->clrs.uStructSize = sizeof(SELCLR); hCmboCtrl = GetDlgItem (hWnd, IDC_SCL_CLR_COM); ComboBox_AddString (hCmboCtrl, TEXT("Reds")); ComboBox_AddString (hCmboCtrl, TEXT("Yellows")); ComboBox_AddString (hCmboCtrl, TEXT("Greens")); ComboBox_AddString (hCmboCtrl, TEXT("Cyans")); ComboBox_AddString (hCmboCtrl, TEXT("Blues")); ComboBox_AddString (hCmboCtrl, TEXT("Magentas")); ComboBox_AddString (hCmboCtrl, TEXT("Whites")); ComboBox_AddString (hCmboCtrl, TEXT("Nuterals")); ComboBox_AddString (hCmboCtrl, TEXT("Blacks")); ComboBox_SetCurSel (hCmboCtrl, 0); for (uItems = 0; (L_INT)uItems < pSClrDlgData->nSlideNum; uItems++) { hSldr = GetDlgItem(hWnd, pSClrDlgData->nSldBaseID + uItems); hEditBox = GetDlgItem(hWnd, pSClrDlgData->nEdtBaseID + uItems); Trackbar_SetRange (hSldr, TRUE, nRangeMin[uItems], nRangeMax[uItems]); Trackbar_SetPos (hSldr, TRUE, nPosInit[uItems]); Trackbar_SetLineSize (hSldr, nLineSize[uItems]); Trackbar_SetPageSize (hSldr, nPageSize[uItems]); SetNumericEditBox(GetDlgItem(hWnd, pSClrDlgData->nEdtBaseID + uItems), nRangeMin[uItems], nRangeMax[uItems], 1, 0, FALSE); SetDlgItemInt(hWnd, pSClrDlgData->nEdtBaseID + uItems, 0, TRUE); } pSClrDlgData->bDoProcess = TRUE; CheckDlgButton (hWnd, IDC_SCL_REL_RAD, BST_CHECKED); pData->uTimerID = SetTimer(hWnd, 1, 100, NULL); return TRUE; } static L_VOID SelectiveColorDialog_OnTimer (HWND hWnd, L_INT nID) { Dialog_Timer(nID); } static L_BOOL SelectiveColorDialog_OnCommand (HWND hWnd, L_INT nID, HWND hWndCtl, L_UINT codeNotify) { L_INT nRangeMax [] = { 100, 100, 100, 100}; L_INT nRangeMin [] = {-100, -100, -100, -100}; TCHAR buff[20] =TEXT("\0"); pCHILDDATA pData; L_UINT iIndex; L_INT iEditBoxValue, iCmboColor; HWND hWndParent; LPSCLRDLGDATA pSClrDlgData; hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient,SendMessage); pData = LOCKCHILDDATA (hWndParent); pSClrDlgData = (LPSCLRDLGDATA) GetWindowLong(hWnd, GWL_USERDATA); if (nID >= pSClrDlgData->nEdtBaseID && nID < pSClrDlgData->nEdtBaseID + pSClrDlgData->nSlideNum) { if (codeNotify == EN_CHANGE) { // When edit box is changed, then place new edit value in the associated structure, // move sliders, and ApplyFilter. iCmboColor = ComboBox_GetCurSel (GetDlgItem(hWnd, IDC_SCL_CLR_COM)); GetDlgItemText(hWnd, nID, buff, 20); iEditBoxValue = (L_INT)_ttoi(buff); Trackbar_SetPos (GetDlgItem(hWnd, nID + pSClrDlgData->nSlideNum), TRUE, iEditBoxValue); // make sure that the edit box value is within range iIndex = nID - pSClrDlgData->nEdtBaseID; iEditBoxValue = min(nRangeMax[iIndex], max(nRangeMin[iIndex], iEditBoxValue)); // First: Update the structure switch (iIndex) { case 0: if (pSClrDlgData->clrs.selClrs[iCmboColor].cCyan == (L_CHAR) iEditBoxValue) return TRUE; pSClrDlgData->clrs.selClrs[iCmboColor].cCyan = (L_CHAR) iEditBoxValue; break; case 1: if(pSClrDlgData->clrs.selClrs[iCmboColor].cMagenta == (L_CHAR) iEditBoxValue) return TRUE; pSClrDlgData->clrs.selClrs[iCmboColor].cMagenta = (L_CHAR) iEditBoxValue; break; case 2: if(pSClrDlgData->clrs.selClrs[iCmboColor].cYellow == (L_CHAR) iEditBoxValue) return TRUE; pSClrDlgData->clrs.selClrs[iCmboColor].cYellow = (L_CHAR) iEditBoxValue; break; case 3: if (pSClrDlgData->clrs.selClrs[iCmboColor].cBlack == (L_CHAR) iEditBoxValue) return TRUE; pSClrDlgData->clrs.selClrs[iCmboColor].cBlack = (L_CHAR) iEditBoxValue; break; } // Second: Move the slider. // Notice that this method will not call SelectiveColorDialog_OnHScroll(); // Third: Apply filter unless it is told not to process if (pSClrDlgData->bDoProcess) L_ApplyFilter (hWnd); } } switch (nID) { case IDCANCEL: StatusProc.bProgress = FALSE; StatusProc.bKillProgress = TRUE ; StatusProc.ProgressValue = 100 ; EndDialog(hWnd, FALSE); break; case IDOK: ShowStatusWindow(FALSE); StatusProc.bStillWork = TRUE; StatusProc.bInvalidate = TRUE; StatusProc.bEnd = TRUE; EndDialog(hWnd, TRUE); break; case IDC_SCL_RST_BTN: // Reset the dialog to zeros for (iIndex = 0; iIndex < 10; iIndex++) { pSClrDlgData->clrs.selClrs[iIndex].cCyan = 0; pSClrDlgData->clrs.selClrs[iIndex].cMagenta = 0; pSClrDlgData->clrs.selClrs[iIndex].cYellow = 0; pSClrDlgData->clrs.selClrs[iIndex].cBlack = 0; } // No need to ApplyFilter for all changing edit boxes. // Call ApplyFilter when changing the last edit box only pSClrDlgData->bDoProcess = FALSE; for (iIndex = 0; iIndex < (L_UINT)pSClrDlgData->nSlideNum; iIndex++) { SetDlgItemInt (hWnd, pSClrDlgData->nEdtBaseID + iIndex, 0 , TRUE); } L_ApplyFilter (hWnd); pSClrDlgData->bDoProcess = TRUE; break; case IDC_SCL_CLR_COM: if (codeNotify == CBN_SELCHANGE) { // When changing combo box then change all edit boxes. // Be sure not to Apply filter when changing edit boxes. pSClrDlgData->bDoProcess = FALSE; iCmboColor = ComboBox_GetCurSel (GetDlgItem(hWnd, IDC_SCL_CLR_COM)); SetDlgItemInt (hWnd, IDC_SCL_CYN_EDT, (L_UINT) pSClrDlgData->clrs.selClrs[iCmboColor].cCyan , TRUE); SetDlgItemInt (hWnd, IDC_SCL_MAG_EDT, (L_UINT) pSClrDlgData->clrs.selClrs[iCmboColor].cMagenta, TRUE); SetDlgItemInt (hWnd, IDC_SCL_YLO_EDT, (L_UINT) pSClrDlgData->clrs.selClrs[iCmboColor].cYellow , TRUE); SetDlgItemInt (hWnd, IDC_SCL_BLK_EDT, (L_UINT) pSClrDlgData->clrs.selClrs[iCmboColor].cBlack , TRUE); pSClrDlgData->bDoProcess = TRUE; InvalidateRect(hWndCtl, NULL, FALSE); } break; case IDC_SCL_REL_RAD: case IDC_SCL_ABS_RAD: // This is for future usage if (codeNotify == BN_CLICKED) { pSClrDlgData->bIsRelative = !(nID-IDC_SCL_REL_RAD); if (!pSClrDlgData->bDoProcess) L_ApplyFilter (hWnd); } break; } return TRUE; } static L_BOOL SelectiveColorDialog_OnClose (HWND hWnd) { SendMessage (hWnd, IDCANCEL, 0, 0); return TRUE; } static L_BOOL SelectiveColorDialog_OnHScroll (HWND hWnd, HWND hWndCtl, L_UINT nCode, L_INT nPos) { LPSCLRDLGDATA pSClrDlgData; L_INT nNewPosition; L_INT nCtrlID; pSClrDlgData = (LPSCLRDLGDATA) GetWindowLong(hWnd, GWL_USERDATA); // When a slider change, then change its associated edit box. nCtrlID = GetWindowLong (hWndCtl, GWL_ID); nNewPosition = (L_INT)Trackbar_GetPos(hWndCtl); // Update the Edit Box and notify it that the slider caused the edit to change SetDlgItemInt (hWnd, nCtrlID - pSClrDlgData->nSlideNum, nNewPosition, TRUE); return TRUE; } static L_VOID L_ApplyFilter (HWND hWnd) { LPSCLRDLGDATA pSClrDlgData; pCHILDDATA pData; L_INT nRet = 0; HWND hWndParent; L_CHAR pOutputStr[200] ="\0"; if ( 100 != StatusProc.ProgressValue ) { StatusProc.bKillProgress = TRUE ; return ; } pSClrDlgData = (LPSCLRDLGDATA) GetWindowLong(hWnd,GWL_USERDATA); hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient,SendMessage); pData = LOCKCHILDDATA (hWndParent); FreeMemorizedBitmap (hWndParent); //MEMDISK// L_CopyBitmap(&pData->LeadBitmap, &pSClrDlgData->Bitmap, sizeof(BITMAPHANDLE)); nRet = L_SelectiveColorBitmap(&pData->LeadBitmap, &pSClrDlgData->clrs); //bug if(nRet == SUCCESS) { InvalidateRect(hWndParent, NULL, FALSE); StatusProc.ProgressValue = 100; Progress_SetPos(StatusProc.ProgWnd , 0); if(StatusProc.bEnd) { StatusProc.bProgress = FALSE; StatusProc.bKillProgress = TRUE ; } } }