⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 she.cpp

📁 又VC++实现的基于TWAIN的扫描仪图像输入处理软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// SHE.cpp : implementation file
//
#include "stdafx.h"
#include "source10.h"
#include "AIEDlg.h"
#include "SHE.h"
#include "Scanner.h"
#include "functions.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern CSource10App theApp;
extern CScanner* pScanner;

extern char InitDir2[100];

int nBitCount;
/////////////////////////////////////////////////////////////////////////////
// CSHE dialog
CSHE::CSHE(CWnd* pParent /*=NULL*/)
	: CDialog(CSHE::IDD, pParent)
{
	int i;
	m_pParent = pParent;
	m_nID = CSHE::IDD;

	m_nGrayTriXPos  = 70;
    m_nBlackTriXPos=GetPrivateProfileInt("pShe","blackPosR",0,InitDir2);;
    m_nWhiteTriXPos=GetPrivateProfileInt("pShe","whitePosR",145,InitDir2);;

	m_bIsBlackTri = FALSE;
	m_bIsGrayTri  = FALSE;
	m_bIsWhiteTri = FALSE;

	m_hBlackTri = LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_BLACKTRI) );
	m_hGrayTri  = LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_GRAYTRI) );
	m_hWhiteTri = LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_WHITETRI) );

	//{{AFX_DATA_INIT(CSHE)
	  m_nShade=GetPrivateProfileInt("pShe","shadeM",0,InitDir2);
	  m_nHighLight=GetPrivateProfileInt("pShe","highM",255,InitDir2);
      
	  int channel;
	  pScanner->m_nColor=GetPrivateProfileInt("color num","color",16777216,InitDir2); 
	  if(pScanner->m_nColor==16777216)
	  {
	   m_sChannel = _T("主通道");
      }
	 else
	 {
      channel=GetPrivateProfileInt("xianzhen","channel",42,InitDir2);
      if(channel==44)//红色通道
	   {
          m_sChannel=_T("红通道");
       }
	   if(channel==42)//绿色通道
	   {
         m_sChannel=_T("绿通道");
       }
	   if(channel==41)//蓝色通道
	   {
   		m_sChannel=_T("蓝通道");
	   }
	
    }
   	  m_nOutHighLight = 255;
	  m_nOutShade = 0;
	//}}AFX_DATA_INIT

    for(i=0;i<256;i++)
	    m_nIndex[i] =0;
	    m_nMaxCount=1; 

    HANDLE hDIB0 = pScanner->GetHandleofPreviewBMP();
	
	LPSTR    lpDIBHdr;            // Pointer to BITMAPINFOHEADER
	LPSTR    lpDIB0Bits;           // Pointer to original DIB bits
  
	if (hDIB0 == NULL)
	{
       for(i=0;i<256;i++)
		m_nIndex[i] = 0;
	    m_nMaxCount=1;
	}
	else
	{
	
	  lpDIBHdr  = (LPSTR) ::GlobalLock((HGLOBAL) hDIB0);
	  lpDIB0Bits = ::FindDIBBits(lpDIBHdr);


	  int cxDIB = (int) ::DIBWidth(lpDIBHdr);         // Size of DIB - x
	  int cyDIB = (int) ::DIBHeight(lpDIBHdr);  
      int nTemp;

   if(pScanner->m_nColor==16777216)
   {
	   nBitCount=cxDIB*cyDIB*3;

	   for(i=0;i<nBitCount;i++)
	   {
		  nTemp=(int)(*(unsigned char*)(lpDIB0Bits)*0.2+*(unsigned char*)(lpDIB0Bits+1)*0.21+*(unsigned char*)(lpDIB0Bits+2)*0.59);  
		  if(nTemp>255)
		  {
			nTemp=255;
		  }
		  if(nTemp<0)
		  {
			nTemp=0;
		  }
		  m_nIndex[nTemp]=m_nIndex[nTemp]+1; 
     
           i++;
		   i++;
         lpDIB0Bits++;
		 lpDIB0Bits++;
         lpDIB0Bits++;
	   }
   }
   else
   {
       nBitCount=cxDIB*cyDIB;
	   for(i=0;i<nBitCount;i++)
	   {
		  nTemp=*(unsigned char*)(lpDIB0Bits);
		  if(nTemp>255)
		  {
			nTemp=255;
		  }
		  if(nTemp<0)
		  {
			nTemp=0;
		  }
		  m_nIndex[nTemp]=m_nIndex[nTemp]+1; 
     
		   lpDIB0Bits++;
	   }
       
   }
     m_nMaxCount=1;
      
	 ::GlobalUnlock((HGLOBAL) hDIB0);
      for(i=0;i<256;i++)
	  {
		 if(m_nMaxCount<m_nIndex[i])
		  m_nMaxCount = m_nIndex[i];
	  } 
	}
  	
	return;
}


void CSHE::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSHE)
	DDX_Control(pDX, IDC_CHANNEL, m_ctrlChannel);
	DDX_Text(pDX, IDC_HIGHLIGHT, m_nHighLight);
	DDX_Text(pDX, IDC_SHADE, m_nShade);
	DDX_CBString(pDX, IDC_CHANNEL, m_sChannel);
	DDX_Text(pDX, IDC_OUT_HIGHLIGHT, m_nOutHighLight);
	DDX_Text(pDX, IDC_OUT_SHADE, m_nOutShade);
	//}}AFX_DATA_MAP
}

BOOL CSHE::Create(void)
{
	return CDialog::Create(m_nID,m_pParent);
}


BEGIN_MESSAGE_MAP(CSHE, CDialog)
	//{{AFX_MSG_MAP(CSHE)
	ON_WM_PAINT()
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONUP()
	ON_CBN_SELCHANGE(IDC_CHANNEL, OnSelchangeChannel)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSHE message handlers

void CSHE::OnPaint() 
{
	int i;
	CRect rect;
	CPaintDC dc(this); // device context for painting

	CPen newPen( PS_DOT, 1, RGB(240,240,240));//;RGB(255,0,0)	 
    //产生硬笔
	CPen MasterPen( PS_SOLID, 1, RGB(0,0,0));
	CPen RedPen( PS_SOLID, 1, RGB(255,0,0));
	CPen GreenPen( PS_SOLID, 1, RGB(0,255,0));
	CPen BluePen( PS_SOLID, 1, RGB(0,0,255));
	CPen* oldPen;

    oldPen=dc.SelectObject( &newPen );
 
	//Update the preview picture.
	GetDlgItem(IDC_STATIC_HISTOGRAM)->GetClientRect(rect);
	GetDlgItem(IDC_STATIC_HISTOGRAM)->ClientToScreen(rect);
	ScreenToClient(rect);

    UpdateData(TRUE);
    if(m_sChannel=="主通道")
	{
		dc.SelectObject( &MasterPen );
	}
	else
	{
	  if(m_sChannel=="红通道")
	  {
		dc.SelectObject( &RedPen );
	  }
	  else
	   {
		 if(m_sChannel=="绿通道")
		 {
		 	dc.SelectObject( &GreenPen );
		 }
		 else
		 {
			 dc.SelectObject( &BluePen );
		 }
	  } 
	}
	
 	dc.DrawIcon(m_nBlackTriXPos,rect.bottom-5,m_hBlackTri);
	dc.DrawIcon(m_nGrayTriXPos, rect.bottom-5,m_hGrayTri);
	dc.DrawIcon(m_nWhiteTriXPos,rect.bottom-5,m_hWhiteTri);

	for(i=0;i<256;i++)
	{
		dc.MoveTo( rect.left+i*(rect.right-rect.left)/256, rect.bottom);
		dc.LineTo( rect.left+i*(rect.right-rect.left)/256,
				   rect.bottom-m_nIndex[i]*(rect.bottom-rect.top)/m_nMaxCount );

	}
	
	dc.MoveTo( rect.right-2, rect.bottom);
	dc.LineTo( rect.right-2,rect.bottom-m_nIndex[255]*(rect.bottom-rect.top)/m_nMaxCount );
	dc.MoveTo( rect.right-3, rect.bottom);
	dc.LineTo( rect.right-3,rect.bottom-m_nIndex[255]*(rect.bottom-rect.top)/m_nMaxCount );
	dc.SelectObject( oldPen );
}

////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
BOOL CSHE::OnInitDialog() 
{
    pScanner->m_nColor=GetPrivateProfileInt("color num","color",16777216,InitDir2); 
    if(pScanner->m_nColor==256||pScanner->m_nColor==2)
	{
	  //通道选择窗口无效
      ::EnableWindow(::GetDlgItem(this->m_hWnd,IDC_CHANNEL),FALSE); 
	}

    CDialog::OnInitDialog();
    return TRUE;
}

///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
void CSHE::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CRect rect;

	GetDlgItem(IDC_STATIC_HISTOGRAM)->GetClientRect(rect);
	GetDlgItem(IDC_STATIC_HISTOGRAM)->ClientToScreen(rect);
	ScreenToClient(rect);

	if( (point.y>rect.bottom)&&(point.y<(rect.bottom+10)) )
	{	
		//The user choose the black triangle
		if(( point.x>m_nBlackTriXPos+10)&&(point.x<m_nBlackTriXPos+20) )
		{
			m_bIsBlackTri = TRUE;
		}
		else
		{
			//The user choose the gray triangle
			if(( point.x>m_nGrayTriXPos+10)&&(point.x<m_nGrayTriXPos+20) )
			{
				m_bIsGrayTri = TRUE;
			}
			else
			{
				//The user choose the white triangle
				if(( point.x>m_nWhiteTriXPos+10)&&(point.x<m_nWhiteTriXPos+20) )
				{
					m_bIsWhiteTri = TRUE;
				}
			}
		}
		
	}//if( (point.y>105)&&(point.y<115) )
	CDialog::OnLButtonDown(nFlags, point);
}

void CSHE::OnMouseMove(UINT nFlags, CPoint point) 
{
	CRect rect;
	CRect rect2;
	
	GetDlgItem(IDC_STATIC_HISTOGRAM)->GetClientRect(rect);
	GetDlgItem(IDC_STATIC_HISTOGRAM)->ClientToScreen(rect);
	ScreenToClient(rect);

	if( m_bIsBlackTri || m_bIsGrayTri || m_bIsWhiteTri) 	
	{
		if( m_bIsBlackTri )
		{
			m_nBlackTriXPos = point.x-rect.left;
			if(m_nBlackTriXPos<0)	  
				m_nBlackTriXPos = 0;
			if(m_nBlackTriXPos>(rect.right-rect.left))	  //145 is the Width of the histogram frame.
				m_nBlackTriXPos = rect.right-rect.left;
	
			m_nShade = m_nBlackTriXPos*256/(rect.right-rect.left);

			UpdateData(FALSE);
		}

		if( m_bIsWhiteTri )
		{
	 		m_nWhiteTriXPos = point.x-rect.left;
			if(m_nWhiteTriXPos<0)	  
					m_nWhiteTriXPos = 0;
			if(m_nWhiteTriXPos>(rect.right-rect.left))	  //145 is the Width of the histogram frame.
				m_nWhiteTriXPos = (rect.right-rect.left);
				
			m_nHighLight =m_nWhiteTriXPos*256/(rect.right-rect.left);
			UpdateData(FALSE);
		}

		rect2.top	= rect.bottom+5;
		rect2.left	= rect.left-10;
		rect2.bottom = rect.bottom+20;
		rect2.right	= rect.right+10;
		InvalidateRect( &rect2, TRUE );
	}

    //相关计算
	int nSum  = 0;
	int nTemp = 0;
	int i;
	if((point.x>=rect.left&&point.x<=rect.right&&point.y>=rect.top&&point.y<=rect.bottom)
		|| m_bIsBlackTri || m_bIsGrayTri || m_bIsWhiteTri )
	{
		SetDlgItemInt(IDC_INPUT,(point.x-rect.left)*256/(rect.right-rect.left));
	
		for(i=0;i<256;i++)
			nSum += m_nIndex[i];
		for(i=0;i<(point.x-rect.left)*256/(rect.right-rect.left);i++)
			nTemp += m_nIndex[i];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -