📄 she.cpp
字号:
// 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 + -