#include "ImgPF.h" static L_BOOL GryDlg_OnInitDialog (HWND hWnd, HWND hWndFocus, LPARAM lParam); static L_BOOL GryDlg_OnHScroll (HWND hWnd, HWND hWndCtl, L_UINT nCode, L_INT nPos); static L_BOOL GryDlg_OnVScroll (HWND hWnd, HWND hWndCtl, L_UINT nCode, L_INT nPos); static L_BOOL GryDlg_OnCommand (HWND hWnd, L_INT nID, HWND hWndCtl, L_UINT uCodeNotify); static L_BOOL GryDlg_OnPaint (HWND hWnd); static L_VOID GryDlg_OnTimer (HWND hWnd, L_INT nID); static L_VOID L_ApplyFilter (HWND hWnd); L_BOOL CALLBACK GryDlgProc (HWND hWnd, L_UINT uMessage, WPARAM wParam, LPARAM lParam) { switch (uMessage) { HANDLE_MSG (hWnd, WM_INITDIALOG, GryDlg_OnInitDialog); HANDLE_MSG (hWnd, WM_COMMAND , GryDlg_OnCommand); HANDLE_MSG (hWnd, WM_HSCROLL , GryDlg_OnHScroll); HANDLE_MSG (hWnd, WM_VSCROLL , GryDlg_OnVScroll); HANDLE_MSG (hWnd, WM_PAINT , GryDlg_OnPaint); HANDLE_MSG (hWnd, WM_TIMER , GryDlg_OnTimer); case WM_USER_UPDATEVIEW: StatusProc.ProgressValue = 100; L_ApplyFilter(hWnd); break; } return FALSE; } L_BOOL GryDlg_OnInitDialog (HWND hWnd, HWND hWndFocus, LPARAM lParam) { LPGRYDLGDATA pGryDlgData; pCHILDDATA pData; HWND hWndParent; HWND hSlider; L_INT nIndex; L_INT nRangeMax; L_INT nRangeMin = 0; L_INT nLineSize; L_INT nPageSize; L_INT nPosInit[16]; L_INT nPosInitIncrement; L_INT nFirstPos; L_INT nInitClrs[16][3] = {{0, 0, 0}, { 0, 0, 127}, { 0, 0, 255}, { 0, 127, 0}, { 0, 255, 0}, { 0, 255, 127}, {0, 255, 255}, {127, 0, 0}, {255, 0, 0}, {255, 0, 127}, {255, 0, 255}, {255, 127, 0}, {255, 255, 0}, {127, 255, 255}, {255, 255, 255}, {127, 127, 127}}; hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient, SendMessage); pData = LOCKCHILDDATA (hWndParent); pGryDlgData = (LPGRYDLGDATA)lParam; SetWindowLong (hWnd, GWL_USERDATA, (LONG)pGryDlgData); //MEMDISK...// MemorizeAndCopyBitmap (hWndParent, &pGryDlgData->LeadBitmap); MoveDialogToMiddle(hWnd); StatusProc.bProgress = TRUE; StatusProc.bInvalidate = FALSE; StatusProc.bEnd = FALSE; StatusProc.DlgWnd = hWnd; StatusProc.ProgressValue = 100; StatusProc.bKillProgress = FALSE; StatusProc.ProgWnd = GetDlgItem(hWnd, IDC_GRY_PROG); pGryDlgData->nSlideNum = 4; pGryDlgData->nSldBaseID = IDC_GRY_1_SLD; pGryDlgData->nEdtBaseID = IDC_GRY_1_EDT; pGryDlgData->nTxtBaseID = IDC_GRY_1_TXT; pGryDlgData->nBtnBaseID = IDC_GRY_1_BTN; pGryDlgData->nNumBaseID = IDC_GRY_ST_TXT; nRangeMax = (L_INT) pow(2, pData->LeadBitmap.BitsPerPixel) - 1; nPageSize = 2 * ((nRangeMax + 1) / 255); nLineSize = 1; nPosInitIncrement = (L_INT) pow(2, pData->LeadBitmap.BitsPerPixel - 4); nFirstPos = nPosInitIncrement - 1; pGryDlgData->GryClr[0].uStructSize = sizeof(GRAYCOLOR); for (nIndex = 0; nIndex < 16; nIndex++) { pGryDlgData->GryClr[nIndex].uThreshold = nPosInit[nIndex] = nFirstPos; pGryDlgData->GryClr[nIndex].crColor.rgbRed = (BYTE)(nInitClrs[nIndex][0]); pGryDlgData->GryClr[nIndex].crColor.rgbGreen = (BYTE)(nInitClrs[nIndex][1]); pGryDlgData->GryClr[nIndex].crColor.rgbBlue = (BYTE)(nInitClrs[nIndex][2]); nFirstPos += nPosInitIncrement; } for (nIndex = 0; nIndex < pGryDlgData->nSlideNum; nIndex++) { hSlider = GetDlgItem(hWnd, pGryDlgData->nSldBaseID + nIndex); Trackbar_SetTheRange(hSlider, TRUE, nRangeMin, nRangeMax); Trackbar_SetLineSize(hSlider, nLineSize); Trackbar_SetPageSize(hSlider, nPageSize); SetDlgItemInt (hWnd, nIndex + pGryDlgData->nEdtBaseID, nPosInit[nIndex], FALSE); SetNumericEditBox (GetDlgItem(hWnd, nIndex + pGryDlgData->nEdtBaseID), nRangeMin, nRangeMax, 1, 0, FALSE); } Trackbar_SetTheRange(GetDlgItem(hWnd, IDC_GRY_SCR_SLD), TRUE, 0, 12); Trackbar_SetPos (GetDlgItem(hWnd, IDC_GRY_SCR_SLD), TRUE, 0); SetDlgItemInt (hWnd, IDC_GRY_SCR_EDT, 0, FALSE); SetNumericEditBox (GetDlgItem(hWnd, IDC_GRY_SCR_EDT), 0, 12, 1, 0, FALSE); pData->uTimerID = SetTimer(hWnd, 1, 100, NULL); ShowWindow(hWnd, SW_SHOW); UpdateWindow(hWnd); L_ApplyFilter(hWnd); return TRUE; } static L_BOOL GryDlg_OnPaint (HWND hWnd) { LPGRYDLGDATA pGryDlgData = (LPGRYDLGDATA) GetWindowLong(hWnd, GWL_USERDATA); L_INT nI; HDC hDC; PAINTSTRUCT ps; RECT rcRgn; COLORREF crColor = RGB(0, 0, 0); HBRUSH hBrush; for (nI = 0; nI < pGryDlgData->nSlideNum; nI++) { crColor = RGB(pGryDlgData->GryClr[pGryDlgData->nVScrollPos + nI].crColor.rgbRed, pGryDlgData->GryClr[pGryDlgData->nVScrollPos + nI].crColor.rgbGreen, pGryDlgData->GryClr[pGryDlgData->nVScrollPos + nI].crColor.rgbBlue); hDC = BeginPaint(GetDlgItem(hWnd, pGryDlgData->nTxtBaseID + nI), &ps); GetClientRect(GetDlgItem(hWnd, pGryDlgData->nTxtBaseID + nI), &rcRgn); hBrush = CreateSolidBrush(crColor); FillRect(hDC, &rcRgn, hBrush); DeleteBrush(hBrush); EndPaint(GetDlgItem(hWnd, pGryDlgData->nTxtBaseID + nI), &ps); } return TRUE; } L_VOID GryDlg_OnTimer(HWND hWnd, L_INT nID) { Dialog_Timer(nID); } L_BOOL GryDlg_OnHScroll (HWND hWnd, HWND hWndCtl, L_UINT nCode, L_INT nPos) { LPGRYDLGDATA pGryDlgData = (LPGRYDLGDATA) GetWindowLong(hWnd, GWL_USERDATA); SetDlgItemInt (hWnd, GetDlgCtrlID(hWndCtl) - pGryDlgData->nSlideNum, Trackbar_GetPos(hWndCtl), FALSE); return TRUE; } L_BOOL GryDlg_OnVScroll (HWND hWnd, HWND hWndCtl, L_UINT nCode, L_INT nPos) { SetDlgItemInt (hWnd, IDC_GRY_SCR_EDT, Trackbar_GetPos(hWndCtl), FALSE); return TRUE; } L_BOOL GryDlg_OnCommand (HWND hWnd, L_INT nID, HWND hWndCtl, L_UINT uCodeNotify) { HWND hWndParent; pCHILDDATA pData; LPGRYDLGDATA pGryDlgData; L_INT nIndex; L_INT nValue; COLORREF rcOldColor = RGB(0, 0, 0), rcNewColor; hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient, SendMessage); pData = LOCKCHILDDATA (hWndParent); pGryDlgData = (LPGRYDLGDATA) 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_GRY_SCR_EDT: nValue = GetDlgItemInt(hWnd, nID, NULL, TRUE); Trackbar_SetPos(GetDlgItem(hWnd, IDC_GRY_SCR_SLD), TRUE, nValue); if (nValue == pGryDlgData->nVScrollPos) return FALSE; pGryDlgData->nVScrollPos = nValue; for (nIndex = 0; nIndex < pGryDlgData->nSlideNum; nIndex++) { SetDlgItemInt(hWnd, pGryDlgData->nEdtBaseID + nIndex, pGryDlgData->GryClr[nIndex + pGryDlgData->nVScrollPos].uThreshold, TRUE); SetDlgItemInt(hWnd, pGryDlgData->nNumBaseID + nIndex, 1 + nIndex + pGryDlgData->nVScrollPos, FALSE); } InvalidateRect(hWnd, NULL, FALSE); break; case IDC_GRY_AUT_BTN: pGryDlgData->bIsAuto = !pGryDlgData->bIsAuto; for (nIndex = 0; nIndex < 22; nIndex++) EnableWindow(GetDlgItem(hWnd, pGryDlgData->nEdtBaseID + nIndex), !pGryDlgData->bIsAuto); SetWindowText (hWndCtl, pGryDlgData->bIsAuto ? TEXT("Manual") : TEXT("Auto")); InvalidateRect(hWnd, NULL, FALSE); L_ApplyFilter (hWnd); break; } if (nID >= pGryDlgData->nEdtBaseID && nID < pGryDlgData->nEdtBaseID + pGryDlgData->nSlideNum) { nValue = GetDlgItemInt(hWnd, nID, NULL, TRUE); nIndex = nID - pGryDlgData->nEdtBaseID + pGryDlgData->nVScrollPos; Trackbar_SetPos(GetDlgItem(hWnd, pGryDlgData->nSldBaseID + nIndex - pGryDlgData->nVScrollPos), TRUE, nValue); if (nValue == (L_INT)pGryDlgData->GryClr[nIndex].uThreshold) return FALSE; pGryDlgData->GryClr[nIndex].uThreshold = nValue; L_ApplyFilter(hWnd); } if (nID >= pGryDlgData->nBtnBaseID && nID < pGryDlgData->nBtnBaseID + pGryDlgData->nSlideNum) { nIndex = nID - pGryDlgData->nBtnBaseID + pGryDlgData->nVScrollPos; rcOldColor = RGB(pGryDlgData->GryClr[nIndex].crColor.rgbRed, pGryDlgData->GryClr[nIndex].crColor.rgbGreen, pGryDlgData->GryClr[nIndex].crColor.rgbBlue); rcNewColor = ShowColorDialog(hWnd, rcOldColor); if (rcNewColor == rcOldColor) return FALSE; pGryDlgData->GryClr[nIndex].crColor.rgbBlue = GetBValue(rcNewColor); pGryDlgData->GryClr[nIndex].crColor.rgbGreen = GetGValue(rcNewColor); pGryDlgData->GryClr[nIndex].crColor.rgbRed = GetRValue(rcNewColor); InvalidateRect(hWnd, NULL, FALSE); L_ApplyFilter(hWnd); } return TRUE; } static L_VOID L_ApplyFilter(HWND hWnd) { BITMAPHANDLE OutBitmap; LPGRYDLGDATA pGryDlgData; pCHILDDATA pData; L_INT nRet = 0; HWND hWndParent; if ( 100 != StatusProc.ProgressValue ) { StatusProc.bKillProgress = TRUE; return ; } pGryDlgData = (LPGRYDLGDATA) GetWindowLong(hWnd, GWL_USERDATA); hWndParent = FORWARD_WM_MDIGETACTIVE(hWndClient, SendMessage); pData = LOCKCHILDDATA (hWndParent); //MEMDISK... FreeMemorizedBitmap (hWndParent); L_CopyBitmap(&pData->LeadBitmap, &pGryDlgData->LeadBitmap, sizeof(BITMAPHANDLE)); nRet = L_ColorizeGrayBitmap(&OutBitmap, &pGryDlgData->LeadBitmap, pGryDlgData->bIsAuto ? NULL : pGryDlgData->GryClr, 16); if(nRet == SUCCESS) { FreeMemorizedBitmap (hWndParent); L_CopyBitmapHandle (&pData->LeadBitmap, &OutBitmap, sizeof(BITMAPHANDLE)); InvalidateRect(hWndParent, NULL, FALSE); StatusProc.ProgressValue = 100; Progress_SetPos(StatusProc.ProgWnd , 0); if(StatusProc.bEnd) { StatusProc.bProgress = FALSE; StatusProc.bKillProgress = TRUE ; } } }