www.pudn.com > 32位 DIB 图形类.zip > Doc.cpp


#include "stdafx.h" 
#include "app.h" 
#include "Doc.h" 
#include "OneValueDlg.h" 
#include "UserFilterDlg.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
 
 
 
 
 
/////////////////////// Implementation ///////////////////////////////////// 
IMPLEMENT_DYNCREATE(CDibtestDoc, CDocument) 
 
BEGIN_MESSAGE_MAP(CDibtestDoc, CDocument) 
	//{{AFX_MSG_MAP(CDibtestDoc) 
	ON_COMMAND(ID_VIEW_GRAYSCALE, OnViewGrayscale) 
	ON_UPDATE_COMMAND_UI(ID_VIEW_GRAYSCALE, OnUpdateViewGrayscale) 
	ON_COMMAND(ID_ADJUST_RED, OnAdjustRed) 
	ON_UPDATE_COMMAND_UI(ID_ADJUST_RED, OnUpdateAdjustRed) 
	ON_COMMAND(ID_EDIT_REDO, OnEditRedo) 
	ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo) 
	ON_COMMAND(ID_EDIT_UNDO, OnEditUndo) 
	ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo) 
	ON_COMMAND(ID_COLOR_NEGATIVE, OnColorNegative) 
	ON_UPDATE_COMMAND_UI(ID_COLOR_NEGATIVE, OnUpdateColorNegative) 
	ON_COMMAND(ID_EDIT_COPY, OnEditCopy) 
	ON_COMMAND(ID_EDIT_PASTE_SELECTION, OnEditPasteSelection) 
	ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE_SELECTION, OnUpdateEditPasteSelection) 
	ON_COMMAND(ID_CHANNEL_SPLIT, OnChannelSplit) 
	ON_UPDATE_COMMAND_UI(ID_CHANNEL_SPLIT, OnUpdateChannelSplit) 
	ON_COMMAND(ID_ADJUST_GREEN, OnAdjustGreen) 
	ON_UPDATE_COMMAND_UI(ID_ADJUST_GREEN, OnUpdateAdjustGreen) 
	ON_COMMAND(ID_ADJUST_BLUE, OnAdjustBlue) 
	ON_UPDATE_COMMAND_UI(ID_ADJUST_BLUE, OnUpdateAdjustBlue) 
	ON_COMMAND(ID_ADJUST_BRIGHTNESS, OnAdjustBrightness) 
	ON_UPDATE_COMMAND_UI(ID_ADJUST_BRIGHTNESS, OnUpdateAdjustBrightness) 
	ON_COMMAND(ID_IMAGE_FLIP, OnImageFlip) 
	ON_UPDATE_COMMAND_UI(ID_IMAGE_FLIP, OnUpdateImageFlip) 
	ON_COMMAND(ID_FILTER_USERDEFINED, OnFilterUserdefined) 
	ON_UPDATE_COMMAND_UI(ID_FILTER_USERDEFINED, OnUpdateFilterUserdefined) 
	ON_COMMAND(ID_IMAGE_MIRROR, OnImageMirror) 
	ON_UPDATE_COMMAND_UI(ID_IMAGE_MIRROR, OnUpdateImageMirror) 
	ON_COMMAND(ID_ADJUST_GAMMA, OnAdjustGamma) 
	ON_UPDATE_COMMAND_UI(ID_ADJUST_GAMMA, OnUpdateAdjustGamma) 
	ON_COMMAND(ID_ADJUST_CONTRAST, OnAdjustContrast) 
	ON_UPDATE_COMMAND_UI(ID_ADJUST_CONTRAST, OnUpdateAdjustContrast) 
	ON_COMMAND(ID_ADJUST_MIDTONE, OnAdjustMidtone) 
	ON_UPDATE_COMMAND_UI(ID_ADJUST_MIDTONE, OnUpdateAdjustMidtone) 
	ON_UPDATE_COMMAND_UI(ID_FILTER_FIND_EDGES, OnUpdateFilterFindEdges) 
	ON_COMMAND(ID_FILTER_BLUR, OnFilterBlur) 
	ON_UPDATE_COMMAND_UI(ID_FILTER_BLUR, OnUpdateFilterBlur) 
	ON_COMMAND(ID_ADJUST_SATURATION, OnAdjustSaturation) 
	ON_UPDATE_COMMAND_UI(ID_ADJUST_SATURATION, OnUpdateAdjustSaturation) 
	ON_COMMAND(ID_ADJUST_HUE, OnAdjustHue) 
	ON_UPDATE_COMMAND_UI(ID_ADJUST_HUE, OnUpdateAdjustHue) 
	ON_COMMAND(ID_FILTER_FIND_EDGES, OnFilterFindEdges) 
	ON_COMMAND(ID_FILTER_ADD_NOISE, OnFilterAddNoise) 
	ON_UPDATE_COMMAND_UI(ID_FILTER_ADD_NOISE, OnUpdateFilterAddNoise) 
	ON_COMMAND(ID_FILTER_FIND_HORIZONTAL_EDGES, OnFilterFindHorizontalEdges) 
	ON_UPDATE_COMMAND_UI(ID_FILTER_FIND_HORIZONTAL_EDGES, OnUpdateFilterFindHorizontalEdges) 
	ON_COMMAND(ID_FILTER_FIND_VERTICAL_EDGES, OnFilterFindVerticalEdges) 
	ON_UPDATE_COMMAND_UI(ID_FILTER_FIND_VERTICAL_EDGES, OnUpdateFilterFindVerticalEdges) 
	ON_COMMAND(ID_FILTER_MEDIAN, OnFilterMedian) 
	ON_UPDATE_COMMAND_UI(ID_FILTER_MEDIAN, OnUpdateFilterMedian) 
	ON_COMMAND(ID_ADJUST_HIGHLIGHT, OnAdjustHighlight) 
	ON_UPDATE_COMMAND_UI(ID_ADJUST_HIGHLIGHT, OnUpdateAdjustHighlight) 
	ON_COMMAND(ID_ADJUST_SHADOW, OnAdjustShadow) 
	ON_UPDATE_COMMAND_UI(ID_ADJUST_SHADOW, OnUpdateAdjustShadow) 
	ON_COMMAND(ID_FILTER_MEAN, OnFilterMean) 
	ON_UPDATE_COMMAND_UI(ID_FILTER_MEAN, OnUpdateFilterMean) 
	ON_COMMAND(ID_COLORS_INCREASECOLORDEPTH_16MILLIONCOLORS24BIT, OnColorsIncreasecolordepth16millioncolors24bit) 
	ON_UPDATE_COMMAND_UI(ID_COLORS_INCREASECOLORDEPTH_16MILLIONCOLORS24BIT, OnUpdateColorsIncreasecolordepth16millioncolors24bit) 
	ON_COMMAND(ID_COUNT_COLORS, OnCountColors) 
	ON_UPDATE_COMMAND_UI(ID_COUNT_COLORS, OnUpdateCountColors) 
	//}}AFX_MSG_MAP 
  ON_UPDATE_COMMAND_UI_RANGE(ID_EDIT_UNDOSIZE_0, ID_EDIT_UNDOSIZE_4, OnUpdateUndoSize) 
  ON_COMMAND_RANGE(ID_EDIT_UNDOSIZE_0, ID_EDIT_UNDOSIZE_4, OnUndoSize) 
	ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs) 
END_MESSAGE_MAP() 
 
 
CDibtestDoc::CDibtestDoc() 
{ 
  for (int i=0; i<256; i++) 
  { 
    m_RedChannel[i] = 0; 
    m_GreenChannel[i] = 0; 
    m_BlueChannel[i] = 0; 
  }          
   
  m_nMaxRed = -1; 
  m_nMaxGreen = -1; 
  m_nMaxBlue = -1; 
  m_nMaxColor = -1; 
} 
 
 
CDibtestDoc::~CDibtestDoc() 
{ 
} 
 
 
BOOL CDibtestDoc::OnNewDocument() 
{ 
  BOOL bSuccess = CDocument::OnNewDocument(); 
  if (!GetApp()->m_bNewFromPaste) 
    bSuccess = bSuccess && m_Dib.Create(CSize(GetApp()->m_nNewWidth, GetApp()->m_nNewHeight), 24); 
 
  UpdateHistogramData(); 
 
  return bSuccess; 
} 
 
 
BOOL CDibtestDoc::OnOpenDocument(LPCTSTR lpszPathName)  
{ 
  DeleteContents(); 
  CWaitCursor wait; 
  BOOL bSuccess = m_Dib.Load((LPCTSTR)lpszPathName); 
  if (!bSuccess) 
		ReportSaveLoadException(lpszPathName, NULL,	FALSE, AFX_IDP_FAILED_TO_OPEN_DOC); 
	SetPathName(lpszPathName); 
	SetModifiedFlag(FALSE); 
  UpdateHistogramData(); 
	return bSuccess; 
} 
 
 
void CDibtestDoc::DeleteContents()  
{ 
	m_Dib.Destroy(); 
  for (int i=0; i<256; i++) 
  { 
    m_RedChannel[i] = 0; 
    m_GreenChannel[i] = 0; 
    m_BlueChannel[i] = 0; 
  }          
   
  m_nMaxRed = -1; 
  m_nMaxGreen = -1; 
  m_nMaxBlue = -1; 
  m_nMaxColor = -1; 
 
	CDocument::DeleteContents(); 
} 
 
 
#ifdef _DEBUG 
void CDibtestDoc::AssertValid() const 
{ 
	CDocument::AssertValid(); 
} 
 
 
void CDibtestDoc::Dump(CDumpContext& dc) const 
{ 
	CDocument::Dump(dc); 
} 
#endif //_DEBUG 
 
 
void CDibtestDoc::OnViewGrayscale()  
{ 
  CWaitCursor wait; 
  if (m_Dib.Grayscale()) 
  { 
    UpdateHistogramData(); 
    SetModifiedFlag(TRUE); 
    UpdateAllViews(NULL); 
  } 
  else 
    AfxMessageBox(IDS_FAIL_GREYSCALE); 
} 
 
 
void CDibtestDoc::OnUpdateViewGrayscale(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
 
void CDibtestDoc::OnAdjustRed()  
{ 
  COneValueDlg dlg; 
  CString sCaption; 
  sCaption.LoadString(IDS_ADJUST_RED); 
  dlg.m_sCaption = sCaption; 
  CString sPrompt; 
  sPrompt.LoadString(IDS_ADJUST_RED_PERCENT); 
  dlg.m_sPrompt = sPrompt; 
  if (dlg.DoModal() == IDOK) 
  { 
    CWaitCursor wait; 
    if (m_Dib.AdjustRed(dlg.m_nValue)) 
    { 
      UpdateHistogramData(); 
      SetModifiedFlag(TRUE); 
      UpdateAllViews(NULL); 
    } 
    else 
      AfxMessageBox(IDS_FAIL_ADJUST_RED); 
  } 
} 
 
 
void CDibtestDoc::OnUpdateAdjustRed(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
 
void CDibtestDoc::OnEditRedo()  
{ 
  CWaitCursor wait; 
	if (m_Dib.Redo()) 
  { 
    UpdateHistogramData(); 
    UpdateAllViews(NULL); 
  } 
  else 
    AfxMessageBox(IDS_FAIL_REDO); 
} 
 
 
void CDibtestDoc::OnUpdateEditRedo(CCmdUI* pCmdUI)  
{ 
  if (m_Dib.RedoAvailable()) 
  { 
    CString sText; 
    AfxFormatString1(sText, IDS_REDO_DESCRIPTION, m_Dib.RedoDescription()); 
    pCmdUI->SetText(sText); 
    pCmdUI->Enable(TRUE); 
  } 
  else 
  { 
    CString sText; 
    sText.LoadString(IDS_REDO_NORMAL); 
    pCmdUI->SetText(sText); 
  	pCmdUI->Enable(FALSE); 
  } 
} 
 
 
void CDibtestDoc::OnEditUndo()  
{ 
  CWaitCursor wait; 
	if (m_Dib.Undo()) 
  { 
    UpdateHistogramData(); 
    UpdateAllViews(NULL); 
  } 
  else 
    AfxMessageBox(IDS_FAIL_UNDO); 
} 
 
 
void CDibtestDoc::OnUpdateEditUndo(CCmdUI* pCmdUI)  
{ 
  if (m_Dib.UndoAvailable()) 
  { 
    CString sText; 
    AfxFormatString1(sText, IDS_UNDO_DESCRIPTION, m_Dib.UndoDescription()); 
    pCmdUI->SetText(sText); 
    pCmdUI->Enable(TRUE); 
  } 
  else 
  { 
    CString sText; 
    sText.LoadString(IDS_UNDO_NORMAL); 
    pCmdUI->SetText(sText); 
  	pCmdUI->Enable(FALSE); 
  } 
} 
 
 
void CDibtestDoc::OnColorNegative()  
{ 
  CWaitCursor wait; 
  if (m_Dib.Negate()) 
  { 
    UpdateHistogramData(); 
    SetModifiedFlag(TRUE); 
    UpdateAllViews(NULL); 
  } 
  else 
    AfxMessageBox(IDS_FAIL_NEGATIVE); 
} 
 
 
void CDibtestDoc::OnUpdateColorNegative(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
 
void CDibtestDoc::OnEditCopy()  
{ 
  CWaitCursor wait; 
  if (!m_Dib.CopyToClipboard()) 
    AfxMessageBox(IDS_FAIL_COPY); 
} 
 
 
void CDibtestDoc::OnEditPasteSelection()  
{ 
	CWaitCursor wait; 
  m_Dib.SaveState(IDS_DI_UNDO_PASTE); 
  if (m_Dib.PasteFromClipboard()) 
  { 
    UpdateHistogramData(); 
    SetModifiedFlag(TRUE); 
    UpdateAllViews(NULL); 
  } 
  else 
    m_Dib.Undo(); 
} 
 
 
void CDibtestDoc::OnUpdateEditPasteSelection(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.PasteAvailable()); 
} 
 
 
void CDibtestDoc::OnChannelSplit()  
{ 
  CApp* pApp = GetApp(); 
  CDibImage red; 
  CDibImage green; 
  CDibImage blue; 
  CWaitCursor wait; 
  if (m_Dib.SplitChannels(red, green, blue)) 
  { 
    POSITION posTemplate = pApp->GetFirstDocTemplatePosition(); 
    CDocTemplate* pDocTemplate = pApp->GetNextDocTemplate(posTemplate); 
    pApp->m_bNewFromPaste = TRUE; 
 
    CDibtestDoc* pDocument = (CDibtestDoc*) pDocTemplate->OpenDocumentFile(NULL); 
    pDocument->m_Dib = red; 
    pDocument->UpdateHistogramData(); 
    pDocument->SetModifiedFlag(TRUE); 
    CString sSplitCaption; 
    AfxFormatString1(sSplitCaption, IDS_SPLIT_RED_CAPTION, GetTitle()); 
    pDocument->SetTitle(sSplitCaption); 
    pDocument->UpdateAllViews(NULL); 
 
    pDocument = (CDibtestDoc*) pDocTemplate->OpenDocumentFile(NULL); 
    pDocument->m_Dib = green; 
    pDocument->UpdateHistogramData(); 
    pDocument->SetModifiedFlag(TRUE); 
    AfxFormatString1(sSplitCaption, IDS_SPLIT_GREEN_CAPTION, GetTitle()); 
    pDocument->SetTitle(sSplitCaption); 
    pDocument->UpdateAllViews(NULL); 
 
    pDocument = (CDibtestDoc*) pDocTemplate->OpenDocumentFile(NULL); 
    pDocument->m_Dib = blue; 
    pDocument->UpdateHistogramData(); 
    pDocument->SetModifiedFlag(TRUE); 
    AfxFormatString1(sSplitCaption, IDS_SPLIT_BLUE_CAPTION, GetTitle()); 
    pDocument->SetTitle(sSplitCaption); 
    pDocument->UpdateAllViews(NULL); 
 
    pApp->m_bNewFromPaste = FALSE; 
  } 
  else 
    AfxMessageBox(IDS_FAIL_SPLIT); 
} 
 
 
void CDibtestDoc::OnUpdateChannelSplit(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
 
void CDibtestDoc::OnAdjustGreen()  
{ 
  COneValueDlg dlg; 
  CString sCaption; 
  sCaption.LoadString(IDS_ADJUST_GREEN); 
  dlg.m_sCaption = sCaption; 
  CString sPrompt; 
  sPrompt.LoadString(IDS_ADJUST_GREEN_PERCENT); 
  dlg.m_sPrompt = sPrompt; 
  if (dlg.DoModal() == IDOK) 
  { 
    CWaitCursor wait; 
    if (m_Dib.AdjustGreen(dlg.m_nValue)) 
    { 
      UpdateHistogramData(); 
      SetModifiedFlag(TRUE); 
      UpdateAllViews(NULL); 
    } 
    else 
      AfxMessageBox(IDS_FAIL_ADJUST_GREEN); 
  } 
} 
 
 
void CDibtestDoc::OnUpdateAdjustGreen(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
 
void CDibtestDoc::OnAdjustBlue()  
{ 
  COneValueDlg dlg; 
  CString sCaption; 
  sCaption.LoadString(IDS_ADJUST_BLUE); 
  dlg.m_sCaption = sCaption; 
  CString sPrompt; 
  sPrompt.LoadString(IDS_ADJUST_BLUE_PERCENT); 
  dlg.m_sPrompt = sPrompt; 
  if (dlg.DoModal() == IDOK) 
  { 
    CWaitCursor wait; 
    if (m_Dib.AdjustBlue(dlg.m_nValue)) 
    { 
      UpdateHistogramData(); 
      SetModifiedFlag(TRUE); 
      UpdateAllViews(NULL); 
    } 
    else 
      AfxMessageBox(IDS_FAIL_ADJUST_BLUE); 
  } 
} 
 
 
void CDibtestDoc::OnUpdateAdjustBlue(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
 
void CDibtestDoc::OnAdjustBrightness()  
{ 
  COneValueDlg dlg; 
  CString sCaption; 
  sCaption.LoadString(IDS_ADJUST_BRIGHTNESS); 
  dlg.m_sCaption = sCaption; 
  CString sPrompt; 
  sPrompt.LoadString(IDS_ADJUST_BRIGHTNESS_PERCENT); 
  dlg.m_sPrompt = sPrompt; 
  if (dlg.DoModal() == IDOK) 
  { 
    CWaitCursor wait; 
    if (m_Dib.AdjustBrightness(dlg.m_nValue)) 
    { 
      UpdateHistogramData(); 
      SetModifiedFlag(TRUE); 
      UpdateAllViews(NULL); 
    } 
    else 
      AfxMessageBox(IDS_FAIL_ADJUST_BRIGHTNESS); 
  } 
} 
 
 
void CDibtestDoc::OnUpdateAdjustBrightness(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
 
void CDibtestDoc::OnUndoSize(UINT nID)  
{ 
  m_Dib.SetUndoSize(nID - ID_EDIT_UNDOSIZE_0); 
} 
 
 
void CDibtestDoc::OnUpdateUndoSize(CCmdUI* pCmdUI)  
{ 
  pCmdUI->SetCheck((pCmdUI->m_nID - ID_EDIT_UNDOSIZE_0) == (UINT) m_Dib.UndoSize()); 
} 
 
void CDibtestDoc::OnImageFlip()  
{ 
  CWaitCursor wait; 
  if (m_Dib.Flip()) 
  { 
    UpdateHistogramData(); 
    SetModifiedFlag(TRUE); 
    UpdateAllViews(NULL); 
  } 
  else 
    AfxMessageBox(IDS_FAIL_ADJUST_FLIP); 
} 
 
void CDibtestDoc::OnUpdateImageFlip(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable( m_Dib.DataFormatSupported()); 
} 
 
 
void CDibtestDoc::UpdateHistogramData() 
{ 
  m_Dib.GetHistogram(m_RedChannel, 256, m_GreenChannel, 256, m_BlueChannel, 256); 
 
  for (int i=0; i<256; i++) 
  { 
    if (m_RedChannel[i] > m_nMaxRed) 
      m_nMaxRed = m_RedChannel[i]; 
    if (m_GreenChannel[i] > m_nMaxGreen) 
      m_nMaxGreen = m_GreenChannel[i]; 
    if (m_BlueChannel[i] > m_nMaxBlue) 
      m_nMaxBlue = m_BlueChannel[i]; 
 
    if (m_nMaxRed > m_nMaxColor) 
      m_nMaxColor = m_nMaxRed; 
    if (m_nMaxGreen > m_nMaxColor) 
      m_nMaxColor = m_nMaxGreen; 
    if (m_nMaxBlue > m_nMaxColor) 
      m_nMaxColor = m_nMaxBlue; 
  } 
  GetMainFrame()->m_HistogramBar.Invalidate(); 
} 
 
void CDibtestDoc::OnFilterUserdefined()  
{ 
  CUserFilterDlg dlg; 
  if (dlg.DoModal() == IDOK) 
  { 
    CWaitCursor wait; 
    C7By7Filter Filter = dlg.GetUserDefinedFilter(); 
    if (m_Dib.UserDefinedFilter(Filter)) 
    { 
      UpdateHistogramData(); 
      SetModifiedFlag(TRUE); 
      UpdateAllViews(NULL); 
    } 
    else 
      AfxMessageBox(IDS_FAIL_FILTER); 
  } 
} 
 
void CDibtestDoc::OnUpdateFilterUserdefined(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
void CDibtestDoc::OnImageMirror()  
{ 
  CWaitCursor wait; 
  if (m_Dib.Mirror()) 
  { 
    UpdateHistogramData(); 
    SetModifiedFlag(TRUE); 
    UpdateAllViews(NULL); 
  } 
  else 
    AfxMessageBox(IDS_FAIL_ADJUST_MIRROR); 
} 
 
void CDibtestDoc::OnUpdateImageMirror(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable( m_Dib.DataFormatSupported()); 
} 
 
void CDibtestDoc::OnAdjustGamma()  
{ 
  COneValueFloatDlg dlg; 
  CString sCaption; 
  sCaption.LoadString(IDS_ADJUST_GAMMA); 
  dlg.m_sCaption = sCaption; 
  CString sPrompt; 
  sPrompt.LoadString(IDS_ADJUST_GAMMA_VALUE); 
  dlg.m_sPrompt = sPrompt; 
  if (dlg.DoModal() == IDOK) 
  { 
    CWaitCursor wait; 
    if (m_Dib.AdjustGammaCorrection(dlg.m_Value)) 
    { 
      UpdateHistogramData(); 
      SetModifiedFlag(TRUE); 
      UpdateAllViews(NULL); 
    } 
    else 
      AfxMessageBox(IDS_FAIL_ADJUST_GAMMA); 
  } 
} 
 
void CDibtestDoc::OnUpdateAdjustGamma(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
void CDibtestDoc::OnAdjustContrast()  
{ 
  COneValueDlg dlg; 
  CString sCaption; 
  sCaption.LoadString(IDS_ADJUST_CONTRAST); 
  dlg.m_sCaption = sCaption; 
  CString sPrompt; 
  sPrompt.LoadString(IDS_ADJUST_CONTRAST_PERCENT); 
  dlg.m_sPrompt = sPrompt; 
  if (dlg.DoModal() == IDOK) 
  { 
    CWaitCursor wait; 
    if (m_Dib.AdjustContrast(dlg.m_nValue)) 
    { 
      UpdateHistogramData(); 
      SetModifiedFlag(TRUE); 
      UpdateAllViews(NULL); 
    } 
    else 
      AfxMessageBox(IDS_FAIL_ADJUST_CONTRAST); 
  } 
} 
 
void CDibtestDoc::OnUpdateAdjustContrast(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
void CDibtestDoc::OnAdjustMidtone()  
{ 
  COneValueDlg dlg; 
  CString sCaption; 
  sCaption.LoadString(IDS_ADJUST_MIDTONE); 
  dlg.m_sCaption = sCaption; 
  CString sPrompt; 
  sPrompt.LoadString(IDS_ADJUST_MIDTONE_PERCENT); 
  dlg.m_sPrompt = sPrompt; 
  if (dlg.DoModal() == IDOK) 
  { 
    CWaitCursor wait; 
    if (m_Dib.AdjustMidtone(dlg.m_nValue)) 
    { 
      UpdateHistogramData(); 
      SetModifiedFlag(TRUE); 
      UpdateAllViews(NULL); 
    } 
    else 
      AfxMessageBox(IDS_FAIL_ADJUST_MIDTONE); 
  } 
} 
 
void CDibtestDoc::OnUpdateAdjustMidtone(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
void CDibtestDoc::OnFilterFindEdges()  
{ 
  CWaitCursor wait; 
  if (m_Dib.FindEdgesFilter()) 
  { 
    UpdateHistogramData(); 
    SetModifiedFlag(TRUE); 
    UpdateAllViews(NULL); 
  } 
  else 
    AfxMessageBox(IDS_FAIL_FIND_EDGES); 
} 
 
void CDibtestDoc::OnUpdateFilterFindEdges(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
void CDibtestDoc::OnFilterBlur()  
{ 
  CWaitCursor wait; 
  if (m_Dib.BlurFilter()) 
  { 
    UpdateHistogramData(); 
    SetModifiedFlag(TRUE); 
    UpdateAllViews(NULL); 
  } 
  else 
    AfxMessageBox(IDS_FAIL_BLUR); 
} 
 
void CDibtestDoc::OnUpdateFilterBlur(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
void CDibtestDoc::OnAdjustSaturation()  
{ 
  COneValueDlg dlg; 
  CString sCaption; 
  sCaption.LoadString(IDS_ADJUST_SATURATION); 
  dlg.m_sCaption = sCaption; 
  CString sPrompt; 
  sPrompt.LoadString(IDS_ADJUST_SATURATION_PERCENT); 
  dlg.m_sPrompt = sPrompt; 
  if (dlg.DoModal() == IDOK) 
  { 
    CWaitCursor wait; 
    if (m_Dib.AdjustSaturation(dlg.m_nValue)) 
    { 
      UpdateHistogramData(); 
      SetModifiedFlag(TRUE); 
      UpdateAllViews(NULL); 
    } 
    else 
      AfxMessageBox(IDS_FAIL_ADJUST_SATURATION); 
  } 
} 
 
void CDibtestDoc::OnUpdateAdjustSaturation(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
void CDibtestDoc::OnAdjustHue()  
{ 
  COneValueDlg dlg; 
  CString sCaption; 
  sCaption.LoadString(IDS_ADJUST_HUE); 
  dlg.m_sCaption = sCaption; 
  CString sPrompt; 
  sPrompt.LoadString(IDS_ADJUST_HUE_PERCENT); 
  dlg.m_sPrompt = sPrompt; 
  if (dlg.DoModal() == IDOK) 
  { 
    CWaitCursor wait; 
    if (m_Dib.AdjustHue(dlg.m_nValue)) 
    { 
      UpdateHistogramData(); 
      SetModifiedFlag(TRUE); 
      UpdateAllViews(NULL); 
    } 
    else 
      AfxMessageBox(IDS_FAIL_ADJUST_HUE); 
  } 
} 
 
void CDibtestDoc::OnUpdateAdjustHue(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
 
 
void CDibtestDoc::OnFilterAddNoise()  
{ 
  COneValueDlg dlg; 
  CString sCaption; 
  sCaption.LoadString(IDS_ADD_NOISE); 
  dlg.m_sCaption = sCaption; 
  CString sPrompt; 
  sPrompt.LoadString(IDS_ADD_NOISE_PERCENT); 
  dlg.m_sPrompt = sPrompt; 
  if (dlg.DoModal() == IDOK) 
  { 
    CWaitCursor wait; 
    if (m_Dib.AddNoiseFilter(dlg.m_nValue)) 
    { 
      UpdateHistogramData(); 
      SetModifiedFlag(TRUE); 
      UpdateAllViews(NULL); 
    } 
    else 
      AfxMessageBox(IDS_FAIL_NOISE); 
  } 
} 
 
void CDibtestDoc::OnUpdateFilterAddNoise(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
 
 
void CDibtestDoc::OnFilterFindHorizontalEdges()  
{ 
  CWaitCursor wait; 
  if (m_Dib.FindHorizontalEdgesFilter()) 
  { 
    UpdateHistogramData(); 
    SetModifiedFlag(TRUE); 
    UpdateAllViews(NULL); 
  } 
  else 
    AfxMessageBox(IDS_FAIL_FIND_HORIZONTAL_EDGES); 
} 
 
void CDibtestDoc::OnUpdateFilterFindHorizontalEdges(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.FilteringFormatSupported());	 
} 
 
void CDibtestDoc::OnFilterFindVerticalEdges()  
{ 
  CWaitCursor wait; 
  if (m_Dib.FindVerticalEdgesFilter()) 
  { 
    UpdateHistogramData(); 
    SetModifiedFlag(TRUE); 
    UpdateAllViews(NULL); 
  } 
  else 
    AfxMessageBox(IDS_FAIL_FIND_VERTICAL_EDGES); 
} 
 
void CDibtestDoc::OnUpdateFilterFindVerticalEdges(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
void CDibtestDoc::OnFilterMedian()  
{ 
  CWaitCursor wait; 
  if (m_Dib.MedianFilter()) 
  { 
    UpdateHistogramData(); 
    SetModifiedFlag(TRUE); 
    UpdateAllViews(NULL); 
  } 
  else 
    AfxMessageBox(IDS_FAIL_MEDIAN_FILTER); 
} 
 
void CDibtestDoc::OnUpdateFilterMedian(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
void CDibtestDoc::OnAdjustHighlight()  
{ 
  COneValueDlg dlg; 
  CString sCaption; 
  sCaption.LoadString(IDS_ADJUST_HIGHLIGHT); 
  dlg.m_sCaption = sCaption; 
  CString sPrompt; 
  sPrompt.LoadString(IDS_ADJUST_HIGHLIGHT_PERCENT); 
  dlg.m_sPrompt = sPrompt; 
  if (dlg.DoModal() == IDOK) 
  { 
    CWaitCursor wait; 
    if (m_Dib.AdjustHighLight(dlg.m_nValue)) 
    { 
      UpdateHistogramData(); 
      SetModifiedFlag(TRUE); 
      UpdateAllViews(NULL); 
    } 
    else 
      AfxMessageBox(IDS_FAIL_ADJUST_HIGHLIGHT); 
  } 
} 
 
void CDibtestDoc::OnUpdateAdjustHighlight(CCmdUI* pCmdUI)  
{ 
  pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
void CDibtestDoc::OnAdjustShadow()  
{ 
  COneValueDlg dlg; 
  CString sCaption; 
  sCaption.LoadString(IDS_ADJUST_SHADOW); 
  dlg.m_sCaption = sCaption; 
  CString sPrompt; 
  sPrompt.LoadString(IDS_ADJUST_SHADOW_PERCENT); 
  dlg.m_sPrompt = sPrompt; 
  if (dlg.DoModal() == IDOK) 
  { 
    CWaitCursor wait; 
    if (m_Dib.AdjustShadow(dlg.m_nValue)) 
    { 
      UpdateHistogramData(); 
      SetModifiedFlag(TRUE); 
      UpdateAllViews(NULL); 
    } 
    else 
      AfxMessageBox(IDS_FAIL_ADJUST_SHADOW); 
  } 
} 
 
void CDibtestDoc::OnUpdateAdjustShadow(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
void CDibtestDoc::OnFilterMean()  
{ 
  CWaitCursor wait; 
  m_Dib.MeanFilter(); 
  UpdateAllViews(NULL); 
} 
 
void CDibtestDoc::OnUpdateFilterMean(CCmdUI* pCmdUI)  
{ 
  pCmdUI->Enable(m_Dib.FilteringFormatSupported()); 
} 
 
void CDibtestDoc::OnColorsIncreasecolordepth16millioncolors24bit()  
{ 
  CWaitCursor wait; 
  if (m_Dib.ConvertTo24Bits()) 
  { 
    UpdateHistogramData(); 
    SetModifiedFlag(TRUE); 
    UpdateAllViews(NULL); 
  } 
  else 
    AfxMessageBox(IDS_FAIL_CONVERT_TO_24BIT); 
} 
 
void CDibtestDoc::OnUpdateColorsIncreasecolordepth16millioncolors24bit(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable(m_Dib.BitsPerPixel() != 24 && m_Dib.DataFormatSupported());	 
} 
 
void CDibtestDoc::OnCountColors()  
{ 
  CWaitCursor wait; 
  int nColors = m_Dib.ColorsUsed(); 
  CString sColors; 
  sColors.Format(_T("%d"), nColors); 
  CString sMsg; 
  AfxFormatString1(sMsg, IDS_NUM_DIB_COLORS_FOUND, sColors); 
  AfxMessageBox(sMsg); 
} 
 
void CDibtestDoc::OnUpdateCountColors(CCmdUI* pCmdUI)  
{ 
  pCmdUI->Enable(m_Dib.DataFormatSupported());	 
} 
 
BOOL CDibtestDoc::OnSaveDocument(LPCTSTR lpszPathName)  
{ 
	CWaitCursor wait; 
  BOOL bSuccess = m_Dib.Save(lpszPathName); 
  if (!bSuccess) 
		ReportSaveLoadException(lpszPathName, NULL,	FALSE, AFX_IDP_FAILED_TO_SAVE_DOC); 
	SetModifiedFlag(FALSE); 
	return bSuccess; 
} 
 
void CDibtestDoc::OnFileSaveAs()  
{ 
  //Bring up the File save as dialog with the customized filter string 
  CString sFilters; 
#ifndef DIBIMAGE_NO_JPEG 
  sFilters.LoadString(IDS_EXTENSIONS); 
#else 
  sFilters.LoadString(IDS_EXTENSIONS2); 
#endif 
	CFileDialog dlgFile(FALSE, NULL, GetPathName(), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, sFilters, NULL); 
	if (dlgFile.DoModal() == IDOK) 
  { 
    //Do the actual save 
	  CWaitCursor wait; 
    CString sPathName = dlgFile.GetPathName(); 
	  if (m_Dib.Save(sPathName)) 
    { 
	    SetPathName(sPathName, TRUE); 
	    SetModifiedFlag(FALSE); 
    } 
    else 
		  ReportSaveLoadException(sPathName, NULL,	FALSE, AFX_IDP_FAILED_TO_SAVE_DOC); 
  } 
}