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

📄 dlgguesswidth.cpp

📁 这是一款蛮COOL的图像处理系统
💻 CPP
字号:
// DlgGuessWidth.cpp : implementation file
//

#include "stdafx.h"
#include "QuickImage.h"
#include "DlgGuessWidth.h"

#include "guesswidth.h"
#include <math.h>

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

/////////////////////////////////////////////////////////////////////////////
// CDlgGuessWidth dialog


CDlgGuessWidth::CDlgGuessWidth(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgGuessWidth::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgGuessWidth)
	m_iDepth = 0;
	m_iHeight = 0;
	m_iWidth = 0;
	m_iHeaderSize = 0;
	//}}AFX_DATA_INIT
	m_dCorr=-1.0;
}


void CDlgGuessWidth::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgGuessWidth)
	DDX_Radio(pDX, IDC_8BITS, m_iDepth);
	DDX_Text(pDX, IDC_EDIT_HEIGHT, m_iHeight);
	DDX_Text(pDX, IDC_EDIT_WIDTH, m_iWidth);
	DDX_Text(pDX, IDC_EDIT_HEADER_SIZE, m_iHeaderSize);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgGuessWidth, CDialog)
	//{{AFX_MSG_MAP(CDlgGuessWidth)
	ON_EN_KILLFOCUS(IDC_EDIT_WIDTH, OnKillfocusEditWidth)
	ON_EN_SETFOCUS(IDC_EDIT_WIDTH, OnSetfocusEditWidth)
	ON_EN_KILLFOCUS(IDC_EDIT_HEIGHT, OnKillfocusEditHeight)
	ON_EN_SETFOCUS(IDC_EDIT_HEIGHT, OnSetfocusEditHeight)
	ON_EN_KILLFOCUS(IDC_EDIT_HEADER_SIZE, OnKillfocusEditHeaderSize)
	ON_EN_SETFOCUS(IDC_EDIT_HEADER_SIZE, OnSetfocusEditHeaderSize)
	ON_BN_CLICKED(IDC_GUESS, OnGuess)
	ON_BN_CLICKED(IDC_SWAP, OnSwap)
	ON_WM_CTLCOLOR()
	//}}AFX_MSG_MAP
	ON_COMMAND_RANGE(IDC_8BITS, IDC_64BITS, OnChannels)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgGuessWidth message handlers

void CDlgGuessWidth::OnKillfocusEditWidth() 
{
	UpdateData(TRUE);
	UINT iByte;
	if(m_iDepth == 4)
	{
		iByte = 8;
	}
	else
	{
		iByte = (UINT)(1 + m_iDepth);
	}

	if(m_iWidth != 0)
	{
		m_iHeight = (FILELENGTH - m_iHeaderSize)/iByte/m_iWidth;
	}
	UpdateData(FALSE);	
}

void CDlgGuessWidth::OnSetfocusEditWidth() 
{
	CEdit *pEdit=(CEdit*)GetDlgItem(IDC_EDIT_WIDTH);
	ASSERT(IsWindow(pEdit->m_hWnd));
//	ASSERT_KINDOF(CEdit,pEdit);
	pEdit->SetSel(0,-1);
}

void CDlgGuessWidth::OnKillfocusEditHeight() 
{
}

void CDlgGuessWidth::OnSetfocusEditHeight() 
{
	CEdit *pEdit=(CEdit*)GetDlgItem(IDC_EDIT_HEIGHT);
	ASSERT(IsWindow(pEdit->m_hWnd));
//	ASSERT_KINDOF(CEdit,pEdit);
	pEdit->SetSel(0,-1);
}

void CDlgGuessWidth::OnKillfocusEditHeaderSize() 
{
	UpdateData(TRUE);

	if(m_iHeaderSize > FILELENGTH)
	{
		MessageBox("ERROR: Header size must smaller then the file size!",
			NULL,MB_OK | MB_ICONERROR);

		m_iHeaderSize = FILELENGTH;
		UpdateData(FALSE);
		
		CWnd *pWnd = GetDlgItem(IDC_EDIT_HEADER_SIZE);
		ASSERT(IsWindow(pWnd->m_hWnd));
		pWnd->SetFocus();
	}
	else
	{
		UINT iByte;
		if(m_iDepth == 4)
		{
			iByte = 8;
		}
		else
		{
			iByte = (UINT)(1 + m_iDepth);
		}
		if(m_iWidth != 0)
		{
			m_iHeight = (FILELENGTH - m_iHeaderSize)/iByte/m_iWidth;
		}
		UpdateData(FALSE);	
	}
}

void CDlgGuessWidth::OnSetfocusEditHeaderSize() 
{
	CEdit *pEdit=(CEdit*)GetDlgItem(IDC_EDIT_HEADER_SIZE);
	ASSERT(IsWindow(pEdit->m_hWnd));
//	ASSERT_KINDOF(CEdit,pEdit);
	pEdit->SetSel(0,-1);
}

void CDlgGuessWidth::OnGuess() 
{
	UpdateData(TRUE);
	CGuessWidth guess;
	AfxGetApp()->BeginWaitCursor();
	
	short iByte;
	if(m_iDepth == 4)
	{
		iByte = 8;
	}
	else
	{
		iByte = (UINT)(1 + m_iDepth);
	}

	m_dCorr = guess.WidthDetect(m_iWidth, m_iHeight, PATHNAME, iByte, m_iHeaderSize);
	AfxGetApp()->EndWaitCursor();
	UpdateData(FALSE);
	
}

void CDlgGuessWidth::OnSwap() 
{
	UpdateData(TRUE);
	DWORD iTemp = m_iWidth;
	m_iWidth = m_iHeight;
	m_iHeight = iTemp;
	UpdateData(FALSE);
}

void CDlgGuessWidth::OnOK() 
{
	UpdateData(TRUE);

	UINT iByte;
	if(m_iDepth == 4)
	{
		iByte = 8;
	}
	else
	{
		iByte = (UINT)(1 + m_iDepth);
	}

	DWORD iTotalSize = m_iWidth*m_iHeight*iByte + m_iHeaderSize;
	if(iTotalSize > FILELENGTH)
	{
		MessageBox("ERROR: Given size is larger then the file size!",
			NULL,MB_OK | MB_ICONERROR);
		
		CWnd *pWnd = GetDlgItem(IDC_EDIT_HEIGHT);
		ASSERT(IsWindow(pWnd->m_hWnd));
		pWnd->SetFocus();
		return;
	}
	else if(iTotalSize < FILELENGTH)
	{
		if(MessageBox(
			"ALERT: Given size is smaller then the file size,Open anyway?",
			NULL,MB_YESNO | MB_ICONWARNING) != IDYES)
		{
			CWnd *pWnd = GetDlgItem(IDC_EDIT_HEIGHT);
			ASSERT(IsWindow(pWnd->m_hWnd));
			pWnd->SetFocus();
			return;
		}
	}
	CDialog::OnOK();
}

BOOL CDlgGuessWidth::OnInitDialog() 
{
	CDialog::OnInitDialog();
/*	m_btOK.SubclassDlgItem(IDOK, this);
	m_btOK.SetIcon(IDI_OKAC, IDI_OKUN);
	m_btOK.SetActiveBgColor(RGB(220,220,220));
	m_btOK.SetActiveFgColor(RGB(255,0,0));
	m_btOK.SetBtnCursor(IDC_GREEN);
	
	m_btCancel.SubclassDlgItem(IDCANCEL, this);
	m_btCancel.SetIcon(IDI_CANCELAC, IDI_CANCELUN);
	m_btCancel.SetActiveBgColor(RGB(220,220,220));
	m_btCancel.SetActiveFgColor(RGB(255,0,0));
	m_btCancel.SetBtnCursor(IDC_GREEN);
*/	
	SetWindowText(TITLE);	
	
	CFile file;
	if(!file.Open(PATHNAME,CFile::modeRead | CFile::shareExclusive))
	{
		return FALSE;
	}
	FILELENGTH = file.GetLength();
	file.Close();

	UINT iByte;
	if(m_iDepth == 4)
	{
		iByte = 8;
	}
	else
	{
		iByte = (UINT)(1 + m_iDepth);
	}

	iByte = (FILELENGTH - m_iHeaderSize) / iByte;
	m_iWidth = m_iHeight = (DWORD)sqrt(iByte);
	while((iByte % m_iWidth) != 0) m_iWidth--;
	m_iHeight = iByte / m_iWidth;

	CWnd* pWnd = GetDlgItem(IDC_FILE_DESCRIBE);
	ASSERT_VALID(pWnd);
	if(IsWindow(pWnd->m_hWnd))
	{
		char szDes[MAX_PATH+40];
		char *pExt=strrchr(PATHNAME,'\\');
		
		sprintf(szDes,"Describe: \" %s \"\n%d bytes",++pExt,FILELENGTH);
		pWnd->SetWindowText((LPCTSTR)szDes);
	}
	UpdateData(FALSE);

	return TRUE;  // return TRUE unless you set the focus to a control
	// EXCEPTION: OCX Property Pages should return FALSE
}

HBRUSH CDlgGuessWidth::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	
	if(pWnd->GetDlgCtrlID() == IDC_EDIT_HEADER_SIZE)
	{
		if(IsWindow(pWnd->m_hWnd))
		{
			CBrush b;
			b.CreateSolidBrush(RGB(0,96,249));
			CRect rc;
			pWnd->GetClientRect(&rc);
			pDC->FillRect(&rc,&b);
			pDC->SetBkColor(RGB(0,96,249));
		}
	}
	// TODO: Change any attributes of the DC here
	
	// TODO: Return a different brush if the default is not desired
	return hbr;
}

void CDlgGuessWidth::OnChannels(UINT uID)
{
	UpdateData(TRUE);
	UINT iByte;
	if(m_iDepth == 4)
	{
		iByte = 8;
	}
	else
	{
		iByte = (UINT)(1 + m_iDepth);
	}
	if(m_iWidth != 0)
	{
		m_iHeight = (FILELENGTH - m_iHeaderSize)/iByte/m_iWidth;
	}
	UpdateData(FALSE);
}

⌨️ 快捷键说明

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