www.pudn.com > dibimage.zip > histogram.cpp


#include "stdafx.h" 
#include "app.h" 
#include "histogram.h" 
#include "doc.h" 
#include "view.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
CHistogramPalette::CHistogramPalette() 
{   
  m_bShowRed = TRUE; 
  m_bShowGreen = TRUE; 
  m_bShowBlue = TRUE; 
} 
 
CHistogramPalette::~CHistogramPalette() 
{ 
} 
 
 
BEGIN_MESSAGE_MAP(CHistogramPalette, CDialogBar) 
	//{{AFX_MSG_MAP(CHistogramPalette) 
	ON_WM_PAINT() 
	ON_BN_CLICKED(IDC_RED, OnRed) 
	ON_BN_CLICKED(IDC_GREEN, OnGreen) 
	ON_BN_CLICKED(IDC_BLUE, OnBlue) 
	ON_WM_CREATE() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
 
void CHistogramPalette::OnPaint()  
{ 
	CPaintDC dc(this); // device context for painting 
 
  CDibtestView* pView = (CDibtestView*) GetMainFrame()->GetActiveFrame()->GetActiveView(); 
 
  if (pView) 
  { 
    CDibtestDoc* pDoc = pView->GetDocument(); 
    CRect rect; 
    GetClientRect(rect); 
    int nMaxHeight = rect.Height() - 40; 
 
    //draw the chart axis 
    CPen BlackPen(PS_SOLID, 1, RGB(0, 0, 0)); 
    CPen* pOldPen = dc.SelectObject(&BlackPen); 
    dc.MoveTo(9, rect.bottom - 29 - nMaxHeight); 
    dc.LineTo(9, rect.bottom - 29); 
    dc.LineTo(266, rect.bottom - 29); 
    dc.SelectObject(pOldPen); 
 
    BOOL bShowMoreThan1Graph = (m_bShowRed && m_bShowGreen) || (m_bShowRed && m_bShowBlue) || (m_bShowBlue && m_bShowGreen); 
 
    //Do the red histogram 
    if (m_bShowRed) 
    { 
      int m_nMaxColor = pDoc->m_nMaxRed; 
      if (bShowMoreThan1Graph) 
        m_nMaxColor = pDoc->m_nMaxColor; 
 
      CPen RedPen(PS_SOLID, 1, RGB(255, 0, 0)); 
      pOldPen = dc.SelectObject(&RedPen); 
      int y = rect.bottom - 30; 
      if (m_nMaxColor) 
        y -= pDoc->m_RedChannel[0]*nMaxHeight/m_nMaxColor; 
      dc.MoveTo(10, y); 
      for (int i=1; i<256; i++) 
      { 
        y = rect.bottom - 30; 
        if (m_nMaxColor) 
          y -= pDoc->m_RedChannel[i]*nMaxHeight/m_nMaxColor; 
         dc.LineTo(i+10, y); 
      } 
      dc.SelectObject(pOldPen); 
    } 
 
    //Do the green histogram 
    if (m_bShowGreen) 
    { 
      int m_nMaxColor = pDoc->m_nMaxGreen; 
      if (bShowMoreThan1Graph) 
        m_nMaxColor = pDoc->m_nMaxColor; 
 
      CPen GreenPen(PS_SOLID, 1, RGB(0, 255, 0)); 
      pOldPen = dc.SelectObject(&GreenPen); 
      int y = rect.bottom - 30; 
      if (m_nMaxColor) 
        y -= pDoc->m_GreenChannel[0]*nMaxHeight/m_nMaxColor; 
      dc.MoveTo(10, y); 
      for (int i=1; i<256; i++) 
      { 
        y = rect.bottom - 30; 
        if (m_nMaxColor) 
          y -= pDoc->m_GreenChannel[i]*nMaxHeight/m_nMaxColor; 
         dc.LineTo(i+10, y); 
      } 
      dc.SelectObject(pOldPen); 
    } 
 
 
    //Do the blue histogram 
    if (m_bShowBlue) 
    { 
      int m_nMaxColor = pDoc->m_nMaxBlue; 
      if (bShowMoreThan1Graph) 
        m_nMaxColor = pDoc->m_nMaxColor; 
 
      CPen BluePen(PS_SOLID, 1, RGB(0, 0, 255)); 
      pOldPen = dc.SelectObject(&BluePen); 
      int y = rect.bottom - 30; 
      if (m_nMaxColor) 
        y -= pDoc->m_BlueChannel[0]*nMaxHeight/m_nMaxColor; 
      dc.MoveTo(10, y); 
      for (int i=1; i<256; i++) 
      { 
        y = rect.bottom - 30; 
        if (m_nMaxColor) 
          y -= pDoc->m_BlueChannel[i]*nMaxHeight/m_nMaxColor; 
         dc.LineTo(i+10, y); 
      } 
      dc.SelectObject(pOldPen); 
    } 
  } 
} 
 
 
void CHistogramPalette::OnRed()  
{ 
  CButton* pRed = (CButton*) GetDlgItem(IDC_RED); 
  ASSERT(pRed); 
 
  if (pRed->GetCheck() == 1) 
    m_bShowRed = TRUE; 
  else 
    m_bShowRed = FALSE; 
 
  Invalidate(); 
} 
 
 
void CHistogramPalette::OnGreen()  
{ 
  CButton* pGreen = (CButton*) GetDlgItem(IDC_GREEN); 
  ASSERT(pGreen); 
 
  if (pGreen->GetCheck() == 1) 
    m_bShowGreen = TRUE; 
  else 
    m_bShowGreen = FALSE; 
 
  Invalidate(); 
} 
 
 
void CHistogramPalette::OnBlue()  
{ 
  CButton* pBlue = (CButton*) GetDlgItem(IDC_BLUE); 
  ASSERT(pBlue); 
 
  if (pBlue->GetCheck() == 1) 
    m_bShowBlue = TRUE; 
  else 
    m_bShowBlue = FALSE; 
 
  Invalidate(); 
} 
 
 
void CHistogramPalette::SetChecks() 
{ 
  CButton* pRed = (CButton*) GetDlgItem(IDC_RED); 
  ASSERT(pRed); 
  pRed->SetCheck(1); 
 
  CButton* pGreen = (CButton*) GetDlgItem(IDC_GREEN); 
  ASSERT(pGreen); 
  pGreen->SetCheck(1); 
 
  CButton* pBlue = (CButton*) GetDlgItem(IDC_BLUE); 
  ASSERT(pBlue); 
  pBlue->SetCheck(1); 
} 
 
 
BOOL CHistogramPalette::Create(CWnd* pParentWnd, LPCTSTR lpszTemplateName, UINT nStyle, UINT nID) 
{ 
  BOOL bSuccess = CDialogBar::Create(pParentWnd, lpszTemplateName, nStyle, nID); 
  SetChecks(); 
  return bSuccess; 
} 
 
 
BOOL CHistogramPalette::Create(CWnd* pParentWnd, UINT nIDTemplate, UINT nStyle, UINT nID) 
{ 
  BOOL bSuccess = CDialogBar::Create(pParentWnd, nIDTemplate, nStyle, nID); 
  SetChecks(); 
  return bSuccess; 
}