#include "ImgPF.h" static L_BOOL RadDlg_OnInitDialog (HWND hWnd, HWND hWndFocus, LPARAM lParam); static L_BOOL RadDlg_OnHScroll (HWND hWnd, HWND hWndCtl, L_UINT nCode, L_INT nPos); static L_VOID RadDlg_OnCommand (HWND hWnd, L_INT nID, HWND hWndCtl, L_UINT nCodeNotify); static L_VOID RadDlg_OnTimer (HWND hWnd, L_INT nID); static L_VOID L_ApplyFilter (HWND hWnd); L_BOOL CALLBACK RadDlgProc (HWND hWnd, L_UINT uMessage, WPARAM wParam, LPARAM lParam) { switch (uMessage) { HANDLE_MSG (hWnd, WM_INITDIALOG, RadDlg_OnInitDialog); HANDLE_MSG (hWnd, WM_COMMAND , RadDlg_OnCommand); HANDLE_MSG (hWnd, WM_HSCROLL , RadDlg_OnHScroll); HANDLE_MSG (hWnd, WM_TIMER , RadDlg_OnTimer); case WM_USER_UPDATEVIEW: StatusProc.ProgressValue = 100; L_ApplyFilter(hWnd); break; } return FALSE; } L_BOOL RadDlg_OnInitDialog (HWND hWnd, HWND hWndFocus, LPARAM lParam) { LPRADDLGDATA pRadDlgData; pCHILDDATA pData; HWND hWndParent; HWND hSlider; HWND hEdt; RECT rcRgn; L_INT nIndex; L_UINT uMaxLevels; L_INT nRangeMax [] = {10000, 0, 2000, 0, 2000}; L_INT nRangeMin [] = { 0, 1, 0, 1, 0}; L_INT nLineSize [] = { 100, 1, 1, 1, 1}; L_INT nPageSize [] = { 500, 1, 100, 1, 100}; L_INT nPosInit[] = { 1500, 3, 170, 5, 140}; L_BOOL bIsDouble[] = {TRUE, FALSE, TRUE, FALSE, TRUE}; L_TCHAR szBuff[20] = TEXT("\0"); HWND hFrame; hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient, SendMessage); pData = LOCKCHILDDATA (hWndParent); pRadDlgData = (LPRADDLGDATA)lParam; MoveDialogToMiddle(hWnd); SetWindowLong(hWnd, GWL_USERDATA, (LONG)pRadDlgData); MemorizeAndCopyBitmap(hWndParent, &pRadDlgData->LeadBitmap); //MEMDISK...// L_GetBitmapRgnBounds(&pRadDlgData->LeadBitmap, NULL, &rcRgn); uMaxLevels = max(pRadDlgData->LeadBitmap.Width, pRadDlgData->LeadBitmap.Height); nRangeMax[1] = nRangeMax[3] = (L_UINT) ceil(log(uMaxLevels) / log(2)); hFrame = GetDlgItem(hWnd, IDC_RAD_EEF); BringWindowToTop(GetDlgItem(hWnd, IDC_RAD_LAT_CHK)); BringWindowToTop(GetDlgItem(hWnd, IDC_RAD_EDG_CHK)); StatusProc.bProgress = TRUE; StatusProc.bInvalidate = FALSE; StatusProc.bEnd = FALSE; StatusProc.DlgWnd = hWnd; StatusProc.ProgressValue = 100; StatusProc.bKillProgress = FALSE; StatusProc.ProgWnd = GetDlgItem(hWnd, IDC_RAD_PROG); Progress_SetRange(StatusProc.ProgWnd, 0, 100); Progress_SetPos (StatusProc.ProgWnd, 0); pRadDlgData->nSlideNum = 5; pRadDlgData->nRadioNum = 4; pRadDlgData->nSldBaseID = IDC_RAD_ENH_SLD; pRadDlgData->nEdtBaseID = IDC_RAD_ENH_EDT; pRadDlgData->nRadBaseID = IDC_RAD_GAU_RAD; pRadDlgData->uContrastE = nPosInit[0]; pRadDlgData->uEdgeLevel = nPosInit[1]; pRadDlgData->uEdgeCoeff = nPosInit[2]; pRadDlgData->uLatitudeLevel = nPosInit[3]; pRadDlgData->uLatitudeCoeff = nPosInit[4]; pRadDlgData->bEdgeCoeff = FALSE; pRadDlgData->bLatitudeCoeff = FALSE; pRadDlgData->bEdgeLevel = FALSE; pRadDlgData->bLatitudeLevel = FALSE; pRadDlgData->uFlags = MSE_GAUSSIAN; for (nIndex = 0; nIndex < pRadDlgData->nSlideNum; nIndex++) { hSlider = GetDlgItem(hWnd, pRadDlgData->nSldBaseID + nIndex); Trackbar_SetRange(hSlider, TRUE, nRangeMin[nIndex], nRangeMax[nIndex]); Trackbar_SetPos(hSlider, TRUE, nPosInit[nIndex]); Trackbar_SetLineSize(hSlider, nLineSize[nIndex]); Trackbar_SetPageSize(hSlider, nPageSize[nIndex]); hEdt = GetDlgItem(hWnd, pRadDlgData->nEdtBaseID + nIndex); if (bIsDouble[nIndex]) { SetNumericEditBox(hEdt, nRangeMin[nIndex] / 100.0, nRangeMax[nIndex] / 100.0, 0.01, 2, TRUE); ConvertFloatToString(nPosInit[nIndex], szBuff, 2); SetWindowText(hEdt, szBuff); } else { SetNumericEditBox(hEdt, nRangeMin[nIndex], nRangeMax[nIndex], 1, 0, FALSE); SetDlgItemInt(hWnd, pRadDlgData->nEdtBaseID + nIndex, nPosInit[nIndex], TRUE); } } for (nIndex = 0; nIndex < 4; nIndex ++) { EnableWindow(GetDlgItem(hWnd, IDC_RAD_AEL_EDT + nIndex), FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RAD_AEL_SLD + nIndex), FALSE); EnableWindow(GetDlgItem(hWnd, IDC_RAD_AEL_CHK + nIndex), FALSE); } Button_SetCheck(GetDlgItem(hWnd, IDC_RAD_GAU_RAD), TRUE); UpdateWindow(hWnd); ShowWindow (hWnd, SW_SHOW); InvalidateRect(hWnd, NULL, FALSE); pData->uTimerID = SetTimer(hWnd, 1, 100, NULL); L_ApplyFilter(hWnd); return TRUE; } static L_VOID RadDlg_OnTimer (HWND hWnd, L_INT nID) { Dialog_Timer(nID); } L_BOOL RadDlg_OnHScroll (HWND hWnd, HWND hWndCtl, L_UINT nCode, L_INT nPos) { LPRADDLGDATA pRadDlgData = (LPRADDLGDATA) GetWindowLong(hWnd, GWL_USERDATA); TCHAR szBuff[20] = TEXT("\0"); L_BOOL bIsDouble[] = {TRUE, FALSE, TRUE, FALSE, TRUE}; if (!bIsDouble[GetDlgCtrlID(hWndCtl) - pRadDlgData->nSldBaseID]) SetDlgItemInt(hWnd, GetDlgCtrlID(hWndCtl) - pRadDlgData->nSlideNum, Trackbar_GetPos(hWndCtl), FALSE); else { ConvertFloatToString(Trackbar_GetPos(hWndCtl), szBuff, 2); SetDlgItemText(hWnd, GetDlgCtrlID(hWndCtl) - pRadDlgData->nSlideNum, szBuff); } return TRUE; } L_VOID RadDlg_OnCommand (HWND hWnd, L_INT nID, HWND hWndCtl, L_UINT nCodeNotify) { LPRADDLGDATA pRadDlgData; HWND hWndParent; pCHILDDATA pData; L_TCHAR szBuff[100] = TEXT("\0"); L_INT nValue; L_INT nIndex; L_BOOL bCheck; L_BOOL bCheck1; hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient, SendMessage); pData = LOCKCHILDDATA (hWndParent); pRadDlgData = (LPRADDLGDATA) GetWindowLong(hWnd, GWL_USERDATA); 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_RAD_ENH_EDT: case IDC_RAD_AEC_EDT: case IDC_RAD_ALC_EDT: if (nCodeNotify == EN_CHANGE) { L_CHAR szTemp [20] = "\0"; GetDlgItemTextA(hWnd, nID, szTemp, 20); nValue = (L_INT)(atof(szTemp) * 100); nIndex = nID - pRadDlgData->nEdtBaseID; Trackbar_SetPos(GetDlgItem(hWnd, nIndex + pRadDlgData->nSldBaseID), TRUE, nValue); switch(nIndex) { case 0: if (pRadDlgData->uContrastE == (L_UINT)nValue) return; pRadDlgData->uContrastE = nValue; break; case 2: if (pRadDlgData->uEdgeCoeff == (L_UINT)nValue) return; pRadDlgData->uEdgeCoeff = nValue; break; case 4: if (pRadDlgData->uLatitudeCoeff == (L_UINT)nValue) return; pRadDlgData->uLatitudeCoeff = nValue; break; } L_ApplyFilter(hWnd); } break; case IDC_RAD_AEL_EDT: case IDC_RAD_ALL_EDT: if (nCodeNotify == EN_CHANGE) { nValue = (L_INT)GetDlgItemInt(hWnd, nID, NULL, TRUE); nIndex = nID - pRadDlgData->nEdtBaseID; Trackbar_SetPos(GetDlgItem(hWnd, nIndex + pRadDlgData->nSldBaseID), TRUE, nValue); switch(nIndex) { case 1: if (pRadDlgData->uEdgeLevel == (L_UINT)nValue) return; pRadDlgData->uEdgeLevel = nValue; break; case 3: if (pRadDlgData->uLatitudeLevel == (L_UINT)nValue) return; pRadDlgData->uLatitudeLevel = nValue; break; } L_ApplyFilter(hWnd); } break; case IDC_RAD_EDG_CHK: pRadDlgData->uFlags ^= MSE_EDGEENH; bCheck = Button_GetCheck(hWndCtl); bCheck1 = Button_GetCheck(GetDlgItem(hWnd, IDC_RAD_AEL_CHK)); EnableWindow(GetDlgItem(hWnd, IDC_RAD_AEL_CHK), bCheck); EnableWindow(GetDlgItem(hWnd, IDC_RAD_AEL_EDT), bCheck && bCheck1); EnableWindow(GetDlgItem(hWnd, IDC_RAD_AEL_SLD), bCheck && bCheck1); bCheck1 = Button_GetCheck(GetDlgItem(hWnd, IDC_RAD_AEC_CHK)); EnableWindow(GetDlgItem(hWnd, IDC_RAD_AEC_CHK), bCheck); EnableWindow(GetDlgItem(hWnd, IDC_RAD_AEC_EDT), bCheck && bCheck1); EnableWindow(GetDlgItem(hWnd, IDC_RAD_AEC_SLD), bCheck && bCheck1); L_ApplyFilter (hWnd); break; case IDC_RAD_LAT_CHK: pRadDlgData->uFlags ^= MSE_LATRED; bCheck = Button_GetCheck(hWndCtl); bCheck1 = Button_GetCheck(GetDlgItem(hWnd, IDC_RAD_ALL_CHK)); EnableWindow(GetDlgItem(hWnd, IDC_RAD_ALL_CHK), bCheck); EnableWindow(GetDlgItem(hWnd, IDC_RAD_ALL_EDT), bCheck && bCheck1); EnableWindow(GetDlgItem(hWnd, IDC_RAD_ALL_SLD), bCheck && bCheck1); bCheck1 = Button_GetCheck(GetDlgItem(hWnd, IDC_RAD_ALC_CHK)); EnableWindow(GetDlgItem(hWnd, IDC_RAD_ALC_CHK), bCheck); EnableWindow(GetDlgItem(hWnd, IDC_RAD_ALC_EDT), bCheck && bCheck1); EnableWindow(GetDlgItem(hWnd, IDC_RAD_ALC_SLD), bCheck && bCheck1); L_ApplyFilter (hWnd); break; case IDC_RAD_AEL_CHK: case IDC_RAD_AEC_CHK: case IDC_RAD_ALL_CHK: case IDC_RAD_ALC_CHK: bCheck = Button_GetCheck(hWndCtl); EnableWindow(GetDlgItem(hWnd, nID - pRadDlgData->nSlideNum), bCheck); EnableWindow(GetDlgItem(hWnd, nID - pRadDlgData->nSlideNum * 2), bCheck); switch (nID) { case IDC_RAD_AEL_CHK: pRadDlgData->bEdgeLevel = bCheck; break; case IDC_RAD_AEC_CHK: pRadDlgData->bEdgeCoeff = bCheck; break; case IDC_RAD_ALL_CHK: pRadDlgData->bLatitudeLevel = bCheck; break; case IDC_RAD_ALC_CHK: pRadDlgData->bLatitudeCoeff = bCheck; break; } L_ApplyFilter (hWnd); break; case IDC_RAD_NOR_RAD: if ((pRadDlgData->uFlags & MSE_NORMAL) == MSE_NORMAL) break; pRadDlgData->uFlags = (~((L_UINT) 0x0003) & pRadDlgData->uFlags) | MSE_NORMAL; L_ApplyFilter(hWnd); break; case IDC_RAD_RES_RAD: if ((pRadDlgData->uFlags & MSE_NORMAL) == MSE_RESAMPLE) break; pRadDlgData->uFlags = (~((L_UINT) 0x0003) & pRadDlgData->uFlags) | MSE_RESAMPLE; L_ApplyFilter(hWnd); break; case IDC_RAD_BIC_RAD: if ((pRadDlgData->uFlags & MSE_NORMAL) == MSE_BICUBIC) break; pRadDlgData->uFlags = (~((L_UINT) 0x0003) & pRadDlgData->uFlags) | MSE_BICUBIC; L_ApplyFilter(hWnd); break; case IDC_RAD_GAU_RAD: if ((pRadDlgData->uFlags & MSE_NORMAL) == MSE_GAUSSIAN) break; pRadDlgData->uFlags = (~((L_UINT) 0x0003) & pRadDlgData->uFlags) | MSE_GAUSSIAN; L_ApplyFilter(hWnd); break; } UNLOCKCHILDDATA (hWndParent); } static L_VOID L_ApplyFilter(HWND hWnd) { LPRADDLGDATA pRadDlgData; pCHILDDATA pData; L_INT nRet = 0; HWND hWndParent; if ( 100 != StatusProc.ProgressValue ) { StatusProc.bKillProgress = TRUE ; return ; } pRadDlgData = (LPRADDLGDATA) GetWindowLong(hWnd, GWL_USERDATA); hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient, SendMessage); pData = LOCKCHILDDATA (hWndParent); FreeMemorizedBitmap (hWndParent); //MEMDISK...// L_CopyBitmap(&pData->LeadBitmap, &pRadDlgData->LeadBitmap, sizeof(BITMAPHANDLE)); nRet = L_MultiScaleEnhancementBitmap(&pData->LeadBitmap, pRadDlgData->uContrastE, pRadDlgData->bEdgeLevel ? pRadDlgData->uEdgeLevel : MSE_DEFAULT, pRadDlgData->bEdgeCoeff ? pRadDlgData->uEdgeCoeff : MSE_DEFAULT, pRadDlgData->bLatitudeLevel ? pRadDlgData->uLatitudeLevel : MSE_DEFAULT, pRadDlgData->bLatitudeCoeff ? pRadDlgData->uLatitudeCoeff : MSE_DEFAULT, pRadDlgData->uFlags); if(nRet == SUCCESS) { InvalidateRect(hWndParent, NULL, FALSE); StatusProc.ProgressValue = 100; Progress_SetPos(StatusProc.ProgWnd , 0); if(StatusProc.bEnd) { StatusProc.bProgress = FALSE; StatusProc.bKillProgress = TRUE ; } } }