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

📄 myinterfacedlg.cpp

📁 用数字图像处理主要是为了修改图形,改善图像质量,或是从图像中提起有效信息,还有利用数字图像处理可以对图像进行体积.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// MyInterfaceDlg.cpp : 实现文件
//
#include <ocidl.h> 
#include <olectl.h> 
#include <atltime.h>






// lpstrFile:文件名(最好是包含路径在内) 
// hWnd 
// nScrWidth:输出图片的宽度 
// nScrHeight:输出图片的高度 
// nScrWidth、nScrHeight是输出图片的实际大小,换而言之是指缩放后的尺寸 
#include "stdafx.h"
#include "MyInterface.h"
#include "MyInterfaceDlg.h"
#include "Picture.h"
#include "Lapls.h"
#include "AllFunction.h"
#include <math.h>
#include <afxtempl.h>
#include <afxmt.h>

#include ".\myinterfacedlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif
float m_WidthScale;
float m_HeightScale;

double m_KeySignature[256];



HFILE hf;
BITMAPFILEHEADER   bf;
BITMAPINFOHEADER   bi;
HGLOBAL            hImgData=NULL;
DWORD 		       ImgSize;
DWORD              LineBytes;
DWORD              NumColors;
CString PicFilePath;
CLapls lplas;

#define WIDTHBYTES(i)    ((i+31)/32*4)
DWORD WINAPI ThreadProc(LPVOID pParm);





// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// 对话框数据
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedOk();
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	ON_BN_CLICKED(IDOK, OnBnClickedOk)
END_MESSAGE_MAP()


// CMyInterfaceDlg 对话框



CMyInterfaceDlg::CMyInterfaceDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMyInterfaceDlg::IDD, pParent),SourcePic(NULL),DestPic(NULL),intSD(0)
	, m_filterCheck(FALSE)
	, m_Sobel(FALSE)
	, m_x1(-1)
	, m_x2(-1)
	, m_x3(-1)	
	, m_x4(-1)
	, m_y1(-1)
	, m_y2(-1)
	, m_y3(-1)
	, m_y4(-1)
	, picInput(FALSE)
	, picShow(FALSE)
	, m_left(0)
	, m_top(0)
	, m_right(0)
	, m_bottom(0)
	, pBmp(NULL)	
	, m_valve(0.6)	
{
	m_pset=new CpicSet;	
	m_ShowTitle=TRUE;
	m_ReSizeFlag=FALSE;
	charlap=new char;
	pDest=NULL;
	SourcePic=NULL;
	charlap=NULL;
	DestPic=NULL;	
	//m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
CMyInterfaceDlg::~CMyInterfaceDlg()
{
	delete m_pset;
	m_pset=NULL;
	delete charlap;
	charlap=NULL;
	if(pBmp!=NULL)
	{
		delete pBmp;
		pBmp=NULL;
	}
	if(SourcePic!=NULL)
	{
		delete SourcePic;
		SourcePic=NULL;
	}
	if(charlap!=NULL)
	{
		delete charlap;
		charlap=NULL;
	}
	if(DestPic!=NULL)
	{
		delete DestPic;
		DestPic=NULL;
	}
	if(pDest!=NULL)
	{
		delete pDest;
		pDest=NULL;
	}
}

void CMyInterfaceDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_PIC, m_pic);
	DDX_Control(pDX, IDC_LIST_PIC, m_ListPic);
	DDX_Check(pDX, IDC_CHECK, m_filterCheck);
	DDX_Check(pDX, IDC_CHECK1, m_Sobel);	
	DDX_Text(pDX, IDC_EDITX1, m_x1);
	//DDV_MinMaxInt(pDX, m_x1, 0, 3);
	DDX_Text(pDX, IDC_EDITX2, m_x2);
	//DDV_MinMaxInt(pDX, m_x2, 0, 3);
	DDX_Text(pDX, IDC_EDITX3, m_x3);
	//DDV_MinMaxInt(pDX, m_x3, 0, 3);
	DDX_Text(pDX, IDC_EDITX4, m_x4);
	//DDV_MinMaxInt(pDX, m_x4, 0, 3);
	DDX_Text(pDX, IDC_EDITY1, m_y1);
	//DDV_MinMaxInt(pDX, m_y1, 0, 3);
	DDX_Text(pDX, IDC_EDITY2, m_y2);
	//DDV_MinMaxInt(pDX, m_y2, 0, 3);
	DDX_Text(pDX, IDC_EDITY3, m_y3);
	//DDV_MinMaxInt(pDX, m_y3, 0, 3);
	DDX_Text(pDX, IDC_EDITY4, m_y4);
	//DDV_MinMaxInt(pDX, m_y4, 0, 3);
	DDX_Text(pDX, IDC_EDITX5, m_left);
	DDX_Text(pDX, IDC_EDITX6, m_top);
	DDX_Text(pDX, IDC_EDITY5, m_right);
	DDX_Text(pDX, IDC_EDITY6, m_bottom);

	DDX_Text(pDX, IDC_EDITX7, m_valve);
	DDX_Control(pDX, IDC_FIND, m_ColorGraphSubmit);
	DDX_Control(pDX, IDC_BUTTONCOLORPAIR, m_ColorPairSubmit);
}

BEGIN_MESSAGE_MAP(CMyInterfaceDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_WM_NCLBUTTONDOWN()//The framework calls this member function when the user presses the left mouse button while the 
	//cursor is within a nonclient area of the CWnd object.


	ON_WM_NCMOUSEMOVE()
	ON_WM_SIZE()
	ON_WM_MOUSEMOVE()//The framework calls this member function after the CWnd object has been moved.
	ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)	
	ON_BN_CLICKED(IDC_BUTTON3, OnBnClickedButton3)
	ON_LBN_DBLCLK(IDC_LIST_PIC, OnLbnDblclkListPic)
	ON_BN_CLICKED(IDC_BUTTON2, OnBnClickedButton2)
	ON_BN_CLICKED(IDC_BUTTON4, OnBnClickedButton4)
	ON_BN_CLICKED(IDC_SEARCH, OnBnClickedSearch)
	ON_BN_CLICKED(IDC_BUTTON5, OnBnClickedButton5)
	ON_BN_CLICKED(IDC_BUTTON6, OnBnClickedButton6)
	ON_BN_CLICKED(IDC_FILTER, OnBnClickedFilter)
	ON_BN_CLICKED(IDC_CHECK, OnBnClickedCheck)
	ON_BN_CLICKED(IDC_CHECK1, OnBnClickedCheck1)
	ON_BN_CLICKED(IDC_SEARCHFROMLIB, OnBnClickedSearchfromlib)
	ON_BN_CLICKED(IDC_FIND, OnBnClickedFind)
	ON_BN_CLICKED(IDC_BUTTON7, OnBnClickedButton7)
	ON_BN_CLICKED(IDC_BUTTON8, OnBnClickedButton8)
	ON_BN_CLICKED(IDC_BUTTONCOLORPAIR, OnBnClickedButtoncolorpair)
	ON_WM_DESTROY()
END_MESSAGE_MAP()


// CMyInterfaceDlg 消息处理程序

BOOL CMyInterfaceDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	//SetControlText(IDOK,"test");
	// 将\“关于...\”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	m_filterCheck=FALSE;
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标
	m_ToolTip.Create(this,TTS_ALWAYSTIP);//创建工具提示控件,TTS_ALWAYSTIP表示,	
	m_ReSizeFlag=TRUE;
	CRect rtWnd;
	GetClientRect(rtWnd);
	m_OldWidth = rtWnd.Width();
	m_OldHeight = rtWnd.Height();

	// TODO: 在此添加额外的初始化代码
	//初始化list框将数据库中的图片读出		
	DWORD dwID;
	hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc,this,0,&dwID);
	

	CDC* pDC=m_ListPic.GetDC();
	int i=0;
	int dx=0;
	CSize sz;
	if(!m_pset->IsOpen())
		m_pset->Open();
	if(m_pset->GetRecordCount()>0)
	{	
		m_pset->MoveFirst();
		while(!m_pset->IsEOF())
		{
			CString str;
			m_ListPic.AddString((LPCTSTR)(CString)(m_pset->m_picAddr));
			m_ListPic.GetText(i,str);
			sz=pDC->GetTextExtent(str);
			if(sz.cx>dx)
				dx=sz.cx;
			m_pset->MoveNext();
			i++;
		}		
		m_ListPic.SetHorizontalExtent(dx);
		m_ListPic.SetCurSel(0);
		OnBnClickedButton5();
	}
	else
	{
		AfxMessageBox("您的数据库中没有图片,请添加图片");
		OnBnClickedButton1();
		OnBnClickedButton7();
	}
	m_ListPic.ReleaseDC(pDC);
	m_pset->Close();		
	return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
}
DWORD WINAPI ThreadProc(LPVOID pParm)
{
	CMyInterfaceDlg* dlg=(CMyInterfaceDlg*)pParm;
	CTime time;
	CString strTime;
	for(;;)
	{
		time=CTime::GetCurrentTime();
		strTime=time.Format("%H:%M:%S");
		CCriticalSection cs;
		cs.Lock();
		SetDlgItemText(dlg->m_hWnd,IDC_TIME,strTime);
		cs.Unlock();
		Sleep(1000);
	}
	return 1;
}

void CMyInterfaceDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}	
	if(nID==SC_CLOSE)
	{	
		TerminateThread(hThread,1);
		/*delete(SourcePic);
		  SourcePic=NULL;
		delete(DestPic);
		  DestPic=NULL;
		delete(charlap);
		  charlap=NULL;
		delete(pBmp);
		  pBmp=NULL;
		delete(pDest);		
		  pDest=NULL;*/
		AfxGetMainWnd()->DestroyWindow();
		return;
	}
	if(nID==SC_RESTORE)
	{
		ShowWindow(SW_NORMAL);
		m_ShowTitle=TRUE;
		return;
	}
	CDialog::OnSysCommand(nID,lParam);
}
void CMyInterfaceDlg::DrawTitleBar(CDC *pDC)
{
	if (m_hWnd)
	{
		CBrush Brush(RGB(0,100,255));
		CBrush* pOldBrush = pDC->SelectObject(&Brush);

		CRect rtWnd, rtTitle, rtButtons;
		GetWindowRect(&rtWnd); 
		//取得标题栏的位置
		rtTitle.left = GetSystemMetrics(SM_CXFRAME);
		rtTitle.top = GetSystemMetrics(SM_CYFRAME);
		rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME);
		rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE);

		//计算最小化按钮的位置,位图大小为15X15
		rtButtons.left = rtTitle.right-60;
		rtButtons.top= rtTitle.top+2;
		rtButtons.right = rtTitle.right-42;
		rtButtons.bottom = rtTitle.top+20;
		m_rtButtMin = rtButtons;
		//计算最大化按钮的位置,位图大小为15X15
		m_rtButtMax.left = m_rtButtMin.left + 18;
		m_rtButtMax.top = m_rtButtMin.top;
		m_rtButtMax.right = m_rtButtMin.right + 16;
		m_rtButtMax.bottom = m_rtButtMin.bottom;

		m_rtButtExit.left = m_rtButtMax.left + 18;
		m_rtButtExit.top =  m_rtButtMax.top;
		m_rtButtExit.right = m_rtButtMax.right + 16;
		m_rtButtExit.bottom = m_rtButtMax.bottom;


		//准备画图
		CBitmap* pBitmap = new CBitmap;
		BITMAP BmpInfo;
		CBitmap* pOldBitmap;
		CDC* pDisplayMemDC=new CDC;
		pDisplayMemDC->CreateCompatibleDC(pDC);

		//重画最Caption
		POINT  DrawPonit;
		DrawPonit.x =	rtTitle.left-4;
		DrawPonit.y =	rtTitle.top-4;
		pBitmap->LoadBitmap(IDB_TITLE_LEFT);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		pBitmap->GetBitmap(&BmpInfo);
		pDC->BitBlt(rtTitle.left-4, rtTitle.top-4, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
		DrawPonit.x = DrawPonit.x + BmpInfo.bmWidth;
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();

		pBitmap->LoadBitmap(IDB_TOP);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		pBitmap->GetBitmap(&BmpInfo);
		while(DrawPonit.x<= m_rtButtMin.left-66) 
		{
			pDC->BitBlt(DrawPonit.x, DrawPonit.y, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
			DrawPonit.x = DrawPonit.x + BmpInfo.bmWidth;
		}
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();

		pBitmap->LoadBitmap(IDB_TITLE_RIGHT);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		pBitmap->GetBitmap(&BmpInfo);
		pDC->BitBlt(DrawPonit.x, DrawPonit.y, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);

		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();



		//重画最小化button
		rtButtons = m_rtButtMin;
		pBitmap->LoadBitmap(IDB_NORMAL);
		pBitmap->GetBitmap(&BmpInfo);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		pDC->BitBlt(rtButtons.left-6, rtButtons.top-2, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();

		int nOldMode = pDC->SetBkMode(TRANSPARENT);
		COLORREF clOldText=pDC->GetTextColor();		
		CFont titleFont;	
		titleFont.CreateFont( 12, // nHeight 
			8, // nWidth 
			0, // nEscapement文本行逆时针旋转角度 
			0, // nOrientation字体角度
			FW_BOLD, // nWeight字体粗细程度 
			FALSE, // bItalic 
			FALSE, // bUnderline 
			0, // cStrikeOut 删除线
			ANSI_CHARSET, // nCharSet 
			OUT_DEFAULT_PRECIS, // nOutPrecision 
			CLIP_DEFAULT_PRECIS, // nClipPrecision 
			DEFAULT_QUALITY, // nQuality 
			DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily 
			_T("隶书")); // lpszFac		pDC->SelectStockObject(SYSTEM_FIXED_FONT);		
		CFont *OldFont;
		OldFont = pDC->SelectObject(&titleFont);
		CString m_StrTitle;
		//GetWindowText(m_StrTitle);
		m_StrTitle="Content Based Image Retrieving System  Samson";
		pDC->SetTextColor(RGB(80,255,25));
		if(m_ShowTitle)
		{
			pDC->TextOut(65,10,m_StrTitle);	
		}
		else
		{   
			m_StrTitle = m_StrTitle.Left(6);
			m_StrTitle += "...";
			pDC->TextOut(30,10,m_StrTitle);	
		}
		pDC->SetBkMode(nOldMode);
		pDC->SetTextColor(clOldText);
		pDC->SelectObject(OldFont);
		//	pDC->TextOut(60,60,m_StrTitle);	
		//重画左边框
		pBitmap->LoadBitmap(IDB_LEFTDOWN);
		pBitmap->GetBitmap(&BmpInfo);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		int i ;
		for (i= 20;i<=rtWnd.bottom;i=i+BmpInfo.bmHeight-3)
		{
			pDC->BitBlt(0, rtButtons.top+i, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
		}
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();

		//重画右边框
		pBitmap->LoadBitmap(IDB_RIGHTDOWN);
		pBitmap->GetBitmap(&BmpInfo);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		GetClientRect(&rtWnd);
		for (i= 25;i<=rtWnd.bottom+27;i=i+BmpInfo.bmHeight-3)
		{
			pDC->BitBlt(rtWnd.right, i, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
		}
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();

		//重画底边框
		pBitmap->LoadBitmap(IDB_DOWN);
		pBitmap->GetBitmap(&BmpInfo);
		pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap);
		GetClientRect(&rtWnd);
		for (i= 9; i<=rtWnd.right; i=i+2)
		{
			GetClientRect(&rtWnd);
			pDC->BitBlt(i,rtWnd.bottom+26, BmpInfo.bmWidth, BmpInfo.bmHeight, pDisplayMemDC, 0, 0, SRCCOPY);
		}
		pDisplayMemDC->SelectObject(pOldBitmap);
		pBitmap->DeleteObject();

		//重画图标
			m_rtIcon.left = 3;//rtWnd.Width()-5;
			m_rtIcon.top =  GetSystemMetrics(SM_CYFRAME);
			m_rtIcon.right = m_rtIcon.left + 32;
			m_rtIcon.bottom = m_rtIcon.top + 32;
			::DrawIconEx(pDC->m_hDC, m_rtIcon.left, m_rtIcon.top, m_hIcon, 
			m_rtIcon.Width(), m_rtIcon.Height(), 0, NULL, DI_NORMAL);
			m_rtIcon.OffsetRect(rtWnd.TopLeft()); 

		ReleaseDC(pDisplayMemDC);
		delete pDisplayMemDC;
		delete pBitmap;
	}

⌨️ 快捷键说明

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