#include "ImgPF.h" static L_BOOL SelDlg_OnInitDialog (HWND hWnd, HWND hWndFocus, LPARAM lParam); static L_BOOL SelDlg_OnHScroll (HWND hWnd, HWND hWndCtl, L_UINT nCode, L_INT nPos); static L_BOOL SelDlg_OnCommand (HWND hWnd, L_INT nID, HWND hWndCtl, L_UINT nCodeNoitfy); static L_VOID SelDlg_OnTimer (HWND hWnd, L_INT nID); static L_VOID SelDlg_OnPaint (HWND hWnd); static L_VOID L_ApplyFilter (HWND hWnd); L_BOOL CALLBACK SelDlgProc (HWND hWnd, L_UINT uMessage, WPARAM wParam, LPARAM lParam) { switch (uMessage) { HANDLE_MSG (hWnd, WM_INITDIALOG, SelDlg_OnInitDialog); HANDLE_MSG (hWnd, WM_COMMAND , SelDlg_OnCommand); HANDLE_MSG (hWnd, WM_HSCROLL , SelDlg_OnHScroll); HANDLE_MSG (hWnd, WM_PAINT , SelDlg_OnPaint); HANDLE_MSG (hWnd, WM_TIMER , SelDlg_OnTimer); case WM_USER_UPDATEVIEW: StatusProc.ProgressValue = 100; L_ApplyFilter(hWnd); break; } return FALSE; } L_BOOL SelDlg_OnInitDialog (HWND hWnd, HWND hWndFocus, LPARAM lParam) { LPSELDLGDATA pSelDlgData; pCHILDDATA pData; HWND hWndParent; RECT rcRgn; L_INT nRangeMax [] = { 7, 7, 0}; L_INT nRangeMin [] = { 0, 0, 0}; L_INT nLineSize [] = { 1, 1, 1}; L_INT nPageSize [] = { 2, 2, 0}; L_INT nPosInit [] = { 0, 7, 0}; L_INT nSlider; hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient, SendMessage); pData = LOCKCHILDDATA (hWndParent); pSelDlgData = (LPSELDLGDATA)lParam; MoveDialogToMiddle(hWnd); SetWindowLong (hWnd, GWL_USERDATA, (LONG)pSelDlgData); //MEMDISK...// MemorizeAndCopyBitmap (hWndParent, &pSelDlgData->LeadBitmap); L_GetBitmapRgnBounds(&pSelDlgData->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_SEL_PROG); nRangeMax[0] = nRangeMax[1] = pSelDlgData->LeadBitmap.BitsPerPixel - 1; nRangeMax[2] = (L_UINT) (pow(2, pSelDlgData->LeadBitmap.BitsPerPixel)); nPosInit[1] = pSelDlgData->LeadBitmap.BitsPerPixel - 1; nPageSize[2] = 2 * (nRangeMax[2] / 255); pSelDlgData->nSlideNum = 3; pSelDlgData->nSldBaseID = IDC_SEL_STA_SLD; pSelDlgData->nEdtBaseID = IDC_SEL_STA_EDT; pSelDlgData->uMaskStartPos = nPosInit[0]; pSelDlgData->uMaskLength = nPosInit[1]; pSelDlgData->uThreshold = nPosInit[2]; pSelDlgData->crColor = RGB(0, 0, 255); pSelDlgData->uFlag = TRUE; SetDlgItemInt (hWnd, IDC_SEL_STA_STA, nRangeMax[0], FALSE); SetDlgItemInt (hWnd, IDC_SEL_LEN_STA, nRangeMax[1], FALSE); SetDlgItemInt (hWnd, IDC_SEL_THR_STA, nRangeMax[2], FALSE); for (nSlider = 0; nSlider < pSelDlgData->nSlideNum; nSlider++) { Trackbar_SetTheRange(GetDlgItem(hWnd, pSelDlgData->nSldBaseID + nSlider), TRUE, nRangeMin[nSlider], nRangeMax[nSlider]); SetNumericEditBox (GetDlgItem(hWnd, pSelDlgData->nEdtBaseID + nSlider), nRangeMin[nSlider], nRangeMax[nSlider], nLineSize[nSlider], 0, FALSE); SetDlgItemInt (hWnd, pSelDlgData->nEdtBaseID + nSlider, nPosInit[nSlider], FALSE); Trackbar_SetLineSize(GetDlgItem(hWnd, pSelDlgData->nSldBaseID + nSlider), nLineSize[nSlider]); Trackbar_SetPageSize(GetDlgItem(hWnd, pSelDlgData->nSldBaseID + nSlider), nPageSize[nSlider]); } Button_SetCheck(GetDlgItem(hWnd, IDC_SEL_COM_CHK), TRUE); pData->uTimerID = SetTimer(hWnd, 1, 100, NULL); ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); L_ApplyFilter(hWnd); return TRUE; } L_VOID SelDlg_OnTimer(HWND hWnd, L_INT nID) { Dialog_Timer(nID); } static L_VOID SelDlg_OnPaint (HWND hWnd) { PAINTSTRUCT ps; HDC hDC; RECT rcRgn; HBRUSH hBrush; LPSELDLGDATA pSelDlgData; pSelDlgData = (LPSELDLGDATA)GetWindowLong(hWnd, GWL_USERDATA); hDC = BeginPaint(GetDlgItem(hWnd, IDC_SEL_CLR_STA), &ps); GetClientRect(GetDlgItem(hWnd, IDC_SEL_CLR_STA), &rcRgn); hBrush = CreateSolidBrush(pSelDlgData->crColor); FillRect(hDC, &rcRgn, hBrush); DeleteBrush(hBrush); EndPaint(GetDlgItem(hWnd, IDC_SEL_CLR_STA), &ps); } L_BOOL SelDlg_OnHScroll (HWND hWnd, HWND hWndCtl, L_UINT nCode, L_INT nPos) { LPSELDLGDATA pSelDlgData; pCHILDDATA pData; L_UINT uNewPos; L_UINT uIndex; L_UINT uOtherSldrPos; L_INT nCtrlID; HWND hWndParent; hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient,SendMessage); pData = LOCKCHILDDATA (hWndParent); pSelDlgData = (LPSELDLGDATA) GetWindowLong(hWnd, GWL_USERDATA); uNewPos = Trackbar_GetPos (hWndCtl); nCtrlID = GetWindowLong (hWndCtl, GWL_ID); uIndex = nCtrlID - pSelDlgData->nSldBaseID; if (hWndCtl == GetDlgItem(hWnd, IDC_SEL_LEN_SLD)) { uOtherSldrPos = Trackbar_GetPos (GetDlgItem(hWnd, IDC_SEL_STA_SLD)); if (uNewPos < uOtherSldrPos) { Trackbar_SetPos (hWndCtl, TRUE, uOtherSldrPos); return TRUE; } } else if (hWndCtl == GetDlgItem(hWnd, IDC_SEL_STA_SLD)) { uOtherSldrPos = Trackbar_GetPos (GetDlgItem(hWnd, IDC_SEL_LEN_SLD)); if (uNewPos > uOtherSldrPos) { Trackbar_SetPos (hWndCtl, TRUE, uOtherSldrPos); return TRUE; } } SetDlgItemInt (hWnd, (uIndex + pSelDlgData->nEdtBaseID), uNewPos, FALSE); return TRUE; } L_BOOL SelDlg_OnCommand (HWND hWnd, L_INT nID, HWND hWndCtl, L_UINT nCodeNotify) { LPSELDLGDATA pSelDlgData; HWND hWndParent; L_INT nValue; pCHILDDATA pData; L_INT nIndex; hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient, SendMessage); pData = LOCKCHILDDATA (hWndParent); pSelDlgData = (LPSELDLGDATA) GetWindowLong(hWnd, GWL_USERDATA); if (nID >= pSelDlgData->nEdtBaseID && nID < pSelDlgData->nEdtBaseID + pSelDlgData->nSlideNum) { if (nCodeNotify == EN_CHANGE) { nIndex = nID - pSelDlgData->nEdtBaseID; nValue = GetDlgItemInt(hWnd, nID, NULL, TRUE); Trackbar_SetPos(GetDlgItem(hWnd, nID + pSelDlgData->nSlideNum), TRUE, nValue); switch (nIndex) { case 0: if (pSelDlgData->uMaskStartPos == (L_UINT)nValue) return FALSE; pSelDlgData->uMaskStartPos = nValue; break; case 1: if (pSelDlgData->uMaskLength == (L_UINT)nValue) return FALSE; pSelDlgData->uMaskLength = nValue; break; case 2: if (pSelDlgData->uThreshold == (L_UINT)nValue) return FALSE; pSelDlgData->uThreshold = nValue; break; } if (nIndex != 2) { nValue = (L_UINT)pow(2, max(pSelDlgData->uMaskLength , pSelDlgData->uMaskStartPos) - min(pSelDlgData->uMaskLength , pSelDlgData->uMaskStartPos) + 1); SetDlgItemInt (hWnd, IDC_SEL_THR_STA, nValue, FALSE); Trackbar_SetTheRange (GetDlgItem(hWnd, IDC_SEL_THR_SLD), TRUE, 0, nValue); nValue = Trackbar_GetPos (GetDlgItem(hWnd, IDC_SEL_THR_SLD)); if (nValue != (L_INT)pSelDlgData->uThreshold) { pSelDlgData->uThreshold = nValue; SetDlgItemInt (hWnd, IDC_SEL_THR_EDT, nValue, FALSE); } } 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_SEL_COM_CHK: pSelDlgData->uFlag = Button_GetCheck(hWndCtl); L_ApplyFilter(hWnd); break; case IDC_SEL_CLR_BTN: pSelDlgData->crColor = ShowColorDialog(hWnd, pSelDlgData->crColor); InvalidateRect(hWnd, NULL, FALSE); L_ApplyFilter(hWnd); break; } return TRUE; } static L_VOID L_ApplyFilter(HWND hWnd) { BITMAPHANDLE TempBitmap; LPSELDLGDATA pSelDlgData; pCHILDDATA pData; L_INT nRet = 0; HWND hWndParent; if ( 100 != StatusProc.ProgressValue ) { StatusProc.bKillProgress = TRUE ; return ; } pSelDlgData = (LPSELDLGDATA) GetWindowLong(hWnd, GWL_USERDATA); hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient, SendMessage); pData = LOCKCHILDDATA (hWndParent); nRet = L_SelectBitmapData (&TempBitmap, &pSelDlgData->LeadBitmap, pSelDlgData->crColor, pSelDlgData->uMaskStartPos, pSelDlgData->uMaskLength, pSelDlgData->uThreshold, pSelDlgData->uFlag); if(nRet == SUCCESS) { FreeMemorizedBitmap (hWndParent); 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; } } }