BOOL CHistogramDlg::OnCommand( WPARAM wParam, LPARAM lParam ) { int id = LOWORD(wParam); //unpack the message WORD codeNotify = HIWORD(wParam); HWND hControl = (HWND) lParam; int i, val; switch (id) { case IDC_CHANNELS: i=ChannelsCombo_Handle(id, codeNotify); if (!i) break; m_wChannel = i; set_histo_channel(); break; case IDC_HISTOGRAM: // value changed if (WITHIN(codeNotify, HTN_CHANGED_FIRST, HTN_CHANGED_LAST)) i = codeNotify-HTN_CHANGED_FIRST; else if (WITHIN(codeNotify, HTN_CHANGING_FIRST, HTN_CHANGING_LAST)) i = codeNotify-HTN_CHANGING_FIRST; else if (codeNotify = HTN_BROWSE) { val = Histo_GetBrowse(hControl); histo_browse(val); break; } else break; val = Histo_GetMark(hControl, i); histo_browse(val); histo_change_mark(i, val); break; case IDC_TAGS: // value changed if (WITHIN(codeNotify, TN_CHANGED_FIRST, TN_CHANGED_LAST)) i = codeNotify-TN_CHANGED_FIRST; else if (WITHIN(codeNotify, TN_CHANGING_FIRST, TN_CHANGING_LAST)) i = codeNotify-TN_CHANGING_FIRST; else break; val = Tag_GetMark(hControl, i); histo_browse(val); histo_change_mark(i, val); break; default: break; } return CWnd::OnCommand(wParam, lParam); }
// Coordinates the tag control and the histo control for the // histogram dialog. // Updates readouts for H,M&S void CHistogramDlg::histo_change_mark(int nMark, int val) { HWND hHisto, hTag; int i; int Marks[HISTOMARKS]; HWND hDlg = GetSafeHwnd(); hHisto = ::GetDlgItem(hDlg, IDC_HISTOGRAM); // get the marks for (i=0;i<HISTOMARKS;i++) Marks[i] = Histo_GetMark(hHisto, i); // set value and adjust others if (nMark == 0) { Marks[0] = val; if (Marks[1] < Marks[0]) Marks[1] = Marks[0]; } else if (nMark == 1) { Marks[1] = val; if (Marks[1] < Marks[0]) Marks[0] = Marks[1]; } // update anything that needs it hTag = ::GetDlgItem(hDlg, IDC_TAGS); for (i=0;i<HISTOMARKS;i++) { if (Marks[i] != Histo_GetMark(hHisto,i)) Histo_SetMark(hHisto,i, Marks[i], NO); if (Marks[i] != Tag_GetMark(hTag,i)) Tag_SetMark(hTag,i, Marks[i], NO); } // set HMS readouts histo_set_HMSvalues(); }
// Sets the HMS readouts for the histo dialog based on the histogram control! void CHistogramDlg::histo_set_HMSvalues() { HWND hHisto; LPDWORD lpHisto; BOOL bInv; LONG lTotal; int iHisto; int i,j, start, end; int marks[HISTOMARKS]; LONG sums[HISTOMARKS+1]; double percents[HISTOMARKS+1]; LONG sum; int add; char szDouble[30]; HWND hDlg = GetSafeHwnd(); lpHisto = get_histo(m_lpHistos, m_wChannel, &bInv, &iHisto); if (!lpHisto) return; lTotal = m_lTotals[iHisto]; hHisto = ::GetDlgItem(hDlg, IDC_HISTOGRAM); // get the marks for (i=0;i<HISTOMARKS;i++) { marks[i] = Histo_GetMark(hHisto, i); } // get the three sums end = bInv ? 255:0; add = bInv ? -1:1; for (i=0;i<=HISTOMARKS;i++) { start = end; if (i >= HISTOMARKS) end = bInv ? 0:255; else end = bInv ? (255-marks[i]):marks[i]; sum = 0L; for (j=start;j*add<end*add;j += add) sum += lpHisto[j]; sums[i] = sum; } // scale if needed if (lTotal > 0x100000) { lTotal >>= 8L; for (i=0;i<=HISTOMARKS;i++) sums[i] >>= 8L; }
//************************************************************************ // change_mark // PARAMETERS: // int nMark- which mark (0 for highlights etc) // int val- New value. // int inval- the 'readout' value of the given mark (INT_MAX for none) // Currently used only for midtone // DESCRIPTION: // Sets the mark, updates other marks to keep them valid. // Sets and redraws all appropriate controls. // Updates the map. //************************************************************************ void CToneBalanceDlg::change_mark(LPQUARTERSTRUCT lpData, int nMark, int val, int inval) //************************************************************************ { HWND hHisto, hTag; int i; BOOL Bool; int Marks[3]; HWND hDlg = GetSafeHwnd(); // set value and adjust others Marks[0] = lpData->iShadow; Marks[2] = lpData->iHighlight; if (m_bUseMidPer) Marks[1] = Marks[0] + (LONG)lpData->MidtonePer*(Marks[2]-Marks[0])/255; else Marks[1] = lpData->iMidtone; if (nMark == 0) { Marks[0] = lpData->iShadow = val; if (Marks[2] < Marks[0]) Marks[2] = Marks[0]; if (m_bUseMidPer) Marks[1] = Marks[0] + (LONG)lpData->MidtonePer*(Marks[2]-Marks[0])/255; else if (Marks[1] < Marks[0]) Marks[1] = Marks[0]; } else if (nMark == 2) { Marks[2] = lpData->iHighlight = val; if (Marks[0] > Marks[2]) Marks[0] = Marks[2]; if (m_bUseMidPer) Marks[1] = Marks[0] + (LONG)lpData->MidtonePer*(Marks[2]-Marks[0])/255; else if (Marks[1] > Marks[2]) Marks[1] = Marks[2]; } else if (nMark == 1) { Marks[1] = lpData->iMidtone = Bound(val, Marks[0], Marks[2]); if (Marks[2]-Marks[0]) lpData->MidtonePer = (lpData->iMidtone - Marks[0])*255L/(Marks[2]-Marks[0]); } else return; // update anything that needs it // spins i = GetDlgItemSpin(hDlg, IDC_QUART1_VALUE, &Bool, NO); i = FROM_DISPLAY(i); if (!Bool || i != Marks[0]) InitDlgItemSpin(hDlg, IDC_QUART1_VALUE, TO_DISPLAY(Marks[0]), NO, 0, MAX_SPIN ); if (inval != INT_MAX && nMark==1) { } else { // update percent if (m_bUseMidPer) { i = GetDlgItemSpin(hDlg, IDC_QUART2_VALUE, &Bool, NO); if (!Bool || (i*255L/100) != lpData->MidtonePer) InitDlgItemSpin(hDlg, IDC_QUART2_VALUE, lpData->MidtonePer*100L/255, NO, 0, MAX_SPIN ); } else { i = GetDlgItemSpin(hDlg, IDC_QUART2_VALUE, &Bool, NO); i = FROM_DISPLAY(i); if (!Bool || i != Marks[1]) InitDlgItemSpin(hDlg, IDC_QUART2_VALUE, TO_DISPLAY(Marks[1]), NO, 0, MAX_SPIN ); } } i = GetDlgItemSpin(hDlg, IDC_QUART3_VALUE, &Bool, NO); i = FROM_DISPLAY(i); if (!Bool || i != Marks[2]) InitDlgItemSpin(hDlg, IDC_QUART3_VALUE, TO_DISPLAY(Marks[2]), NO, 0, MAX_SPIN ); // histogram hHisto = ::GetDlgItem(hDlg, IDC_HISTOGRAM); hTag = ::GetDlgItem(hDlg, IDC_TAGS); for (i=0;i<3;i++) { if (Marks[i] != Histo_GetMark(hHisto,i)) Histo_SetMark(hHisto,i, Marks[i], NO); if (Marks[i] != Tag_GetMark(hTag,i)) Tag_SetMark(hTag,i, Marks[i], NO); } lpData->lpMap->Pnt[0].x = Marks[0]; lpData->lpMap->Pnt[1].x = Marks[1]; lpData->lpMap->Pnt[2].x = Marks[2]; }
BOOL CToneBalanceDlg::OnCommand( WPARAM wParam, LPARAM lParam ) { int id = LOWORD(wParam); //unpack the message WORD codeNotify = HIWORD(wParam); HWND hControl = (HWND) lParam; HWND hDlg = GetSafeHwnd(); int i, val; BOOL Bool; HWND hActiveWnd; LPIMAGE lpImage = NULL; lpImage = GetImage(); switch (id) { case IDC_CHANNELS: i=ChannelsCombo_Handle(id, codeNotify); if (!i) break; m_lpData->wChannel = i; set_quarter_channel(m_lpData->wChannel); break; case IDC_QUART1_PROBE: case IDC_QUART2_PROBE: case IDC_QUART3_PROBE: if (!Probe_Begin(codeNotify)) break; CheckDlgButton(id, YES ); m_lpData->iProbe = id-IDC_QUART1_PROBE; if (m_lpData->iProbe == 0) m_lpData->OriginalValue = m_lpData->iShadow; else if (m_lpData->iProbe == 1) m_lpData->OriginalValue = m_lpData->iMidtone; else m_lpData->OriginalValue = m_lpData->iHighlight; // unpreview UnAutoPreview(); break; case IDC_QUART1_VALUE: case IDC_QUART2_VALUE: case IDC_QUART3_VALUE: if ( ::GetFocus() != ::GetDlgItem( hDlg, id ) ) break; if ( codeNotify != EN_CHANGE) break; val = GetDlgItemSpin(hDlg, id, &Bool, NO); if (!Bool) break; // convert to 'real' location if (id == IDC_QUART2_VALUE && m_bUseMidPer) i = m_lpData->iShadow + (LONG)val*(m_lpData->iHighlight-m_lpData->iShadow)/100; else i = FROM_DISPLAY(val); if (id != IDC_QUART2_VALUE) val = INT_MAX; change_mark(m_lpData, id-IDC_QUART1_VALUE, i, val); AutoPreview(m_lpData->lpMap, m_bAutoPreview, NO); break; case IDC_MINHIGHLIGHT: if ( ::GetFocus() != ::GetDlgItem( hDlg, id ) ) break; if ( codeNotify != EN_CHANGE) break; i = GetDlgItemSpin(hDlg, id, &Bool, NO); if (!Bool) break; i = FROM_DISPLAY(i); m_lpData->lpMap->Pnt[2].y = i; m_lpData->lpMap->Pnt[1].y = (m_lpData->lpMap->Pnt[2].y+m_lpData->lpMap->Pnt[0].y)/2; AutoPreview(m_lpData->lpMap,m_bAutoPreview, YES); break; case IDC_MAXSHADOW: if ( ::GetFocus() != ::GetDlgItem( hDlg, id ) ) break; if ( codeNotify != EN_CHANGE) break; i = GetDlgItemSpin(hDlg, id, &Bool, NO); if (!Bool) break; i = FROM_DISPLAY(i); m_lpData->lpMap->Pnt[0].y = i; m_lpData->lpMap->Pnt[1].y = (m_lpData->lpMap->Pnt[2].y+m_lpData->lpMap->Pnt[0].y)/2; AutoPreview(m_lpData->lpMap, m_bAutoPreview, YES); break; case IDC_HISTOGRAM: // value changed if (WITHIN(codeNotify, HTN_CHANGED_FIRST, HTN_CHANGED_LAST)) { i = codeNotify-HTN_CHANGED_FIRST; Bool = TRUE; } else if (WITHIN(codeNotify, HTN_CHANGING_FIRST, HTN_CHANGING_LAST)) { i = codeNotify-HTN_CHANGING_FIRST; Bool = FALSE; } else break; val = Histo_GetMark(hControl, i); change_mark(m_lpData, i, val, INT_MAX); AutoPreview(m_lpData->lpMap, m_bAutoPreview, Bool); break; case IDC_TAGS: // value changed if (WITHIN(codeNotify, TN_CHANGED_FIRST, TN_CHANGED_LAST)) { i = codeNotify-TN_CHANGED_FIRST; Bool = TRUE; } else if (WITHIN(codeNotify, TN_CHANGING_FIRST, TN_CHANGING_LAST)) { i = codeNotify-TN_CHANGING_FIRST; Bool = FALSE; } else break; val = Tag_GetMark(hControl, i); change_mark(m_lpData, i, val, INT_MAX); AutoPreview(m_lpData->lpMap, m_bAutoPreview, Bool); break; // case IDC_PREVIEW: // AutoPreview_Button(m_lpData->lpMap); // break; // case IDC_QUART_DEFAULTS: // // setup channel with sacrifice defaults // set_sacrifice(m_lpData, m_lpData->wChannel); // // setup the actual histogram and controls // set_quarter_channel(m_lpData->wChannel); // AutoPreview(m_lpData->lpMap, m_bAutoPreview, YES); // break; default: break; } return CWnd::OnCommand(wParam, lParam); }