#include "ImgPF.h" static L_BOOL ShiDlg_OnInitDialog (HWND hWnd, HWND hWndFocus, LPARAM lParam); static L_BOOL ShiDlg_OnHScroll (HWND hWnd, HWND hWndCtl, L_UINT nCode, L_INT nPos); static L_BOOL ShiDlg_OnCommand (HWND hWnd, L_INT nID, HWND hWndCtl, L_UINT uCodeNotify); static L_VOID ShiDlg_OnTimer (HWND hWnd, L_INT nID); static L_VOID L_ApplyFilter (HWND hWnd); L_BOOL CALLBACK ShiDlgProc (HWND hWnd, L_UINT uMessage, WPARAM wParam, LPARAM lParam) { switch (uMessage) { HANDLE_MSG (hWnd, WM_INITDIALOG, ShiDlg_OnInitDialog); HANDLE_MSG (hWnd, WM_COMMAND , ShiDlg_OnCommand); HANDLE_MSG (hWnd, WM_HSCROLL , ShiDlg_OnHScroll); HANDLE_MSG (hWnd, WM_TIMER , ShiDlg_OnTimer); case WM_USER_UPDATEVIEW: StatusProc.ProgressValue = 100; L_ApplyFilter(hWnd); break; } return FALSE; } L_BOOL ShiDlg_OnInitDialog (HWND hWnd, HWND hWndFocus, LPARAM lParam) { LPSHIDLGDATA pShiDlgData; pCHILDDATA pData; HWND hWndParent; RECT rcRgn; L_INT nSlider; L_INT nRangeMax [] = { 0, 0, 15}; // Should be 7, 11 or 15 for the first element L_INT nRangeMin [] = { 0, 0, 0}; L_INT nLineSize [] = { 1, 1, 1}; L_INT nPageSize [] = { 2, 2, 2}; L_INT nInitPos[] = { 0, 7, 0}; hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient, SendMessage); pData = LOCKCHILDDATA (hWndParent); pShiDlgData = (LPSHIDLGDATA)lParam; MoveDialogToMiddle(hWnd); SetWindowLong (hWnd, GWL_USERDATA, (LONG)pShiDlgData); //MEMDISK...// MemorizeAndCopyBitmap (hWndParent, &pShiDlgData->LeadBitmap); L_GetBitmapRgnBounds(&pShiDlgData->LeadBitmap, NULL, &rcRgn); StatusProc.bProgress = TRUE; StatusProc.bInvalidate = FALSE; StatusProc.bEnd = FALSE; StatusProc.DlgWnd = hWnd; StatusProc.ProgressValue = 100; StatusProc.bKillProgress = FALSE; StatusProc.ProgWnd = GetDlgItem(hWnd, IDC_SHI_PROG); nRangeMax[0] = nRangeMax[1] = pShiDlgData->LeadBitmap.BitsPerPixel - 1; nRangeMax[2] = 7; SetDlgItemInt (hWnd, IDC_SHI_STA_STA, nRangeMax[0], FALSE); SetDlgItemInt (hWnd, IDC_SHI_LEN_STA, nRangeMax[1], FALSE); SetDlgItemInt (hWnd, IDC_SHI_DST_STA, nRangeMax[2], FALSE); pShiDlgData->nSlideNum = 3; pShiDlgData->nSldBaseID = IDC_SHI_STA_SLD; pShiDlgData->nEdtBaseID = IDC_SHI_STA_EDT; pShiDlgData->uDstStartPos = 0; pShiDlgData->uMaskLength = nRangeMax[1]; pShiDlgData->uMaskStartPos = 0; pShiDlgData->uDstBitsPerPixel = 8; Button_SetCheck(GetDlgItem(hWnd, IDC_SHI_DST_8), BST_CHECKED); for (nSlider = 0; nSlider < pShiDlgData->nSlideNum; nSlider++) { Trackbar_SetTheRange(GetDlgItem(hWnd, pShiDlgData->nSldBaseID + nSlider), TRUE, nRangeMin[nSlider], (nSlider == 2) ? 7 : nRangeMax[nSlider]); Trackbar_SetLineSize(GetDlgItem(hWnd, pShiDlgData->nSldBaseID + nSlider), nLineSize[nSlider]); Trackbar_SetPageSize(GetDlgItem(hWnd, pShiDlgData->nSldBaseID + nSlider), nPageSize[nSlider]); SetNumericEditBox (GetDlgItem(hWnd, (pShiDlgData->nEdtBaseID + nSlider)), nRangeMin[nSlider], nRangeMax[nSlider], nLineSize[nSlider], 0, FALSE); SetDlgItemInt (hWnd, pShiDlgData->nEdtBaseID + nSlider, nInitPos[nSlider], FALSE); } pData->uTimerID = SetTimer(hWnd, 1, 100, NULL); return TRUE; } static L_VOID ShiDlg_OnTimer (HWND hWnd, L_INT nID) { Dialog_Timer(nID); } L_BOOL ShiDlg_OnCommand (HWND hWnd, L_INT nID, HWND hWndCtl, L_UINT uCodeNotify) { LPSHIDLGDATA pShiDlgData; HWND hWndParent; L_INT nRet; pCHILDDATA pData; L_INT nRangeMax [] = { 7, 8, 7}; L_INT nRangeMin [] = { 0, 1, 0}; L_INT nIndex; hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient, SendMessage); pData = LOCKCHILDDATA (hWndParent); pShiDlgData = (LPSHIDLGDATA) GetWindowLong(hWnd, GWL_USERDATA); nRangeMax[0] = nRangeMax[2] = pShiDlgData->LeadBitmap.BitsPerPixel - 1; nRangeMax[1] = pShiDlgData->LeadBitmap.BitsPerPixel; if (nID >= pShiDlgData->nEdtBaseID && nID < pShiDlgData->nEdtBaseID + pShiDlgData->nSlideNum) { nIndex = nID - pShiDlgData->nEdtBaseID; if (uCodeNotify == EN_CHANGE) { nRet = GetDlgItemInt(hWnd, nID, NULL, TRUE); Trackbar_SetPos(GetDlgItem(hWnd, nID + pShiDlgData->nSlideNum), TRUE, nRet); switch (nIndex) { case 0: if (pShiDlgData->uMaskStartPos == (L_UINT)nRet) return FALSE; pShiDlgData->uMaskStartPos = nRet; break; case 1: if (pShiDlgData->uMaskLength == (L_UINT)nRet) return FALSE; pShiDlgData->uMaskLength = nRet; break; case 2: if (pShiDlgData->uDstStartPos == (L_UINT)nRet) return FALSE; pShiDlgData->uDstStartPos = nRet; break; } 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_SHI_DST_8: if (pShiDlgData->uDstBitsPerPixel == 8) return FALSE; pShiDlgData->uDstBitsPerPixel = 8; Trackbar_SetRange (GetDlgItem(hWnd, IDC_SHI_DST_SLD), TRUE, 0, pShiDlgData->uDstBitsPerPixel - 1); SetDlgItemInt(hWnd, IDC_SHI_DST_EDT, 0, FALSE); SetDlgItemInt(hWnd, IDC_SHI_DST_STA, pShiDlgData->uDstBitsPerPixel - 1, FALSE); L_ApplyFilter(hWnd); break; case IDC_SHI_DST_12: if (pShiDlgData->uDstBitsPerPixel == 12) return FALSE; pShiDlgData->uDstBitsPerPixel = 12; Trackbar_SetRange (GetDlgItem(hWnd, IDC_SHI_DST_SLD), TRUE, 0, pShiDlgData->uDstBitsPerPixel - 1); SetDlgItemInt(hWnd, IDC_SHI_DST_EDT, 0, FALSE); SetDlgItemInt(hWnd, IDC_SHI_DST_STA, pShiDlgData->uDstBitsPerPixel - 1, FALSE); L_ApplyFilter(hWnd); break; case IDC_SHI_DST_16: if (pShiDlgData->uDstBitsPerPixel == 16) return FALSE; pShiDlgData->uDstBitsPerPixel = 16; Trackbar_SetRange (GetDlgItem(hWnd, IDC_SHI_DST_SLD), TRUE, 0, pShiDlgData->uDstBitsPerPixel - 1); SetDlgItemInt(hWnd, IDC_SHI_DST_EDT, 0, FALSE); SetDlgItemInt(hWnd, IDC_SHI_DST_STA, pShiDlgData->uDstBitsPerPixel - 1, FALSE); L_ApplyFilter(hWnd); break; } return TRUE; } L_BOOL ShiDlg_OnHScroll (HWND hWnd, HWND hWndCtl, L_UINT nCode, L_INT nPos) { LPSHIDLGDATA pShiDlgData; pCHILDDATA pData; L_UINT uNewPos; L_UINT uOtherSldrPos; L_UINT uIndex; L_INT nCtrlID; HWND hWndParent; hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient,SendMessage); pData = LOCKCHILDDATA (hWndParent); pShiDlgData = (LPSHIDLGDATA) GetWindowLong(hWnd, GWL_USERDATA); uNewPos = Trackbar_GetPos (hWndCtl); nCtrlID = GetWindowLong (hWndCtl, GWL_ID); uIndex = nCtrlID - pShiDlgData->nSldBaseID; if (hWndCtl == GetDlgItem(hWnd, IDC_SHI_LEN_SLD)) { uOtherSldrPos = Trackbar_GetPos (GetDlgItem(hWnd, IDC_SHI_STA_SLD)); if (uNewPos < uOtherSldrPos) { Trackbar_SetPos (hWndCtl, TRUE, uOtherSldrPos); return TRUE; } } else if (hWndCtl == GetDlgItem(hWnd, IDC_SHI_STA_SLD)) { uOtherSldrPos = Trackbar_GetPos (GetDlgItem(hWnd, IDC_SHI_LEN_SLD)); if (uNewPos > uOtherSldrPos) { Trackbar_SetPos (hWndCtl, TRUE, uOtherSldrPos); return TRUE; } } SetDlgItemInt (hWnd, (nCtrlID - pShiDlgData->nSlideNum), uNewPos, FALSE); return TRUE; } static L_VOID L_ApplyFilter(HWND hWnd) { pCHILDDATA pData; L_INT nRet = 0; HWND hWndParent; LPSHIDLGDATA pShiDlgData; BITMAPHANDLE TempBitmap; if ( 100 != StatusProc.ProgressValue ) { StatusProc.bKillProgress = TRUE ; return ; } pShiDlgData = (LPSHIDLGDATA)GetWindowLong(hWnd, GWL_USERDATA); hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient, SendMessage); pData = LOCKCHILDDATA(hWndParent); FreeMemorizedBitmap (hWndParent); //MEMDISK// L_CopyBitmap(&pData->LeadBitmap, &pShiDlgData->LeadBitmap, sizeof(BITMAPHANDLE)); nRet = L_ShiftBitmapData(&TempBitmap, &pData->LeadBitmap, pShiDlgData->uMaskStartPos, pShiDlgData->uMaskLength, pShiDlgData->uDstStartPos, pShiDlgData->uDstBitsPerPixel); if(nRet == SUCCESS) { L_FreeBitmap (&pData->LeadBitmap); L_CopyBitmapHandle (&pData->LeadBitmap, &TempBitmap, sizeof(BITMAPHANDLE)); InvalidateRect(hWndParent, NULL, FALSE); StatusProc.ProgressValue = 100; Progress_SetPos(StatusProc.ProgWnd , 0); if(StatusProc.bEnd) { StatusProc.bProgress = FALSE; StatusProc.bKillProgress = TRUE ; } } }