dlgmix.cpp

来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C++ 代码 · 共 207 行

CPP
207
字号
// DlgMix.cpp : implementation file
//

#include "stdafx.h"
#include "demo.h"
#include "demoDoc.h"
#include "DlgMix.h"

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

/////////////////////////////////////////////////////////////////////////////
// DlgMix dialog


DlgMix::DlgMix(CWnd* pParent /*=NULL*/)
	: CDialog(DlgMix::IDD, pParent)
{
	//{{AFX_DATA_INIT(DlgMix)
	m_xoffset = 0;
	m_yoffset = 0;
	m_mixalpha = FALSE;
	//}}AFX_DATA_INIT
}


void DlgMix::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(DlgMix)
	DDX_Control(pDX, IDC_PICTURE, m_picture);
	DDX_Control(pDX, IDC_BUTTON1, m_preview);
	DDX_Control(pDX, IDOK, m_ok);
	DDX_Control(pDX, IDCANCEL, m_canc);
	DDX_Control(pDX, IDC_SRC, m_cbSrc);
	DDX_Control(pDX, IDC_OP, m_cbOpType);
	DDX_Control(pDX, IDC_DST, m_cbDst);
	DDX_Text(pDX, IDC_EDIT1, m_xoffset);
	DDX_Text(pDX, IDC_EDIT2, m_yoffset);
	DDX_Check(pDX, IDC_CHECK1, m_mixalpha);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(DlgMix, CDialog)
	//{{AFX_MSG_MAP(DlgMix)
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_WM_DESTROY()
	ON_CBN_SELCHANGE(IDC_DST, OnSelchangeDst)
	ON_CBN_SELCHANGE(IDC_SRC, OnSelchangeSrc)
	ON_CBN_SELCHANGE(IDC_OP, OnSelchangeOp)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// DlgMix message handlers

BOOL DlgMix::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	m_bitmap=0;
	m_ratio=1.0f;
	m_xoffset=m_yoffset=0;
	pDocSrc = pDocDst = 0;
	OpType=0;
	m_mixalpha = 0;

	m_ok.SetIcon(IDI_G,BS_LEFT);
	m_canc.SetIcon(IDI_R,BS_LEFT);

	POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition();
	while (pos != NULL) {
		CDocTemplate* pTemplate = AfxGetApp()->GetNextDocTemplate(pos);
		ASSERT(pTemplate->IsKindOf(RUNTIME_CLASS(CDocTemplate)));
		POSITION pos2 = pTemplate->GetFirstDocPosition();
		while (pos2 != NULL) {
			CDemoDoc* pDoc = (CDemoDoc*) pTemplate->GetNextDoc(pos2);
			ASSERT(pDoc->IsKindOf(RUNTIME_CLASS(CDemoDoc)));
			CString title = pDoc->GetTitle();
			m_cbSrc.AddString(title);
			m_cbSrc.SetItemData(m_cbSrc.GetCount()-1, (DWORD)pDoc);
			m_cbDst.AddString(title);
			m_cbDst.SetItemData(m_cbDst.GetCount()-1, (DWORD)pDoc);
		}
	}
	m_cbSrc.SetCurSel(0);

	if (m_cbDst.GetCount()>1){
		m_cbDst.SetCurSel(1);
	} else {
		m_cbDst.SetCurSel(0);
	}
	
	m_cbOpType.AddString("OpAdd");
	m_cbOpType.SetItemData(m_cbOpType.GetCount()-1, (DWORD)CxImage::ImageOpType::OpAdd);
	m_cbOpType.AddString("OpAnd");
	m_cbOpType.SetItemData(m_cbOpType.GetCount()-1, (DWORD)CxImage::ImageOpType::OpAnd);
	m_cbOpType.AddString("OpXor");
	m_cbOpType.SetItemData(m_cbOpType.GetCount()-1, (DWORD)CxImage::ImageOpType::OpXor);
	m_cbOpType.AddString("OpOr");
	m_cbOpType.SetItemData(m_cbOpType.GetCount()-1, (DWORD)CxImage::ImageOpType::OpOr);
	m_cbOpType.AddString("OpScreen");
	m_cbOpType.SetItemData(m_cbOpType.GetCount()-1, (DWORD)CxImage::ImageOpType::OpScreen);
	m_cbOpType.AddString("OpMask");
	m_cbOpType.SetItemData(m_cbOpType.GetCount()-1, (DWORD)CxImage::ImageOpType::OpMask);
	m_cbOpType.AddString("OpSrcCopy");
	m_cbOpType.SetItemData(m_cbOpType.GetCount()-1, (DWORD)CxImage::ImageOpType::OpSrcCopy);
	m_cbOpType.AddString("OpDstCopy");
	m_cbOpType.SetItemData(m_cbOpType.GetCount()-1, (DWORD)CxImage::ImageOpType::OpDstCopy);
	m_cbOpType.AddString("OpSub");
	m_cbOpType.SetItemData(m_cbOpType.GetCount()-1, (DWORD)CxImage::ImageOpType::OpSub);
	m_cbOpType.AddString("OpSrcBlend");
	m_cbOpType.SetItemData(m_cbOpType.GetCount()-1, (DWORD)CxImage::ImageOpType::OpSrcBlend);
	m_cbOpType.SetCurSel(1);


	SetMix();

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

void DlgMix::OnButton1() 
{
	UpdateData(1);
	SetMix();
}

void DlgMix::OnDestroy() 
{
	CDialog::OnDestroy();
	
	if (m_bitmap) DeleteObject(m_bitmap);
}

void DlgMix::OnSelchangeDst() 
{
	UpdateData(1);
	SetMix();
}

void DlgMix::OnSelchangeSrc() 
{
	UpdateData(1);
	SetMix();
}

void DlgMix::OnSelchangeOp() 
{
	UpdateData(1);
	SetMix();
}

void DlgMix::SetThumbs(CxImage* pSrc, CxImage* pDst)
{
	if (pSrc==0 || pDst==0) return;

	if (pDst->GetWidth() > pDst->GetHeight()){
		m_ratio = 200.0f/pDst->GetWidth();
	} else {
		m_ratio = 200.0f/pDst->GetHeight();
	}
	if (m_ratio > 1.0f) m_ratio = 1.0f;

	pSrc->Resample((long)(pSrc->GetWidth()*m_ratio),(long)(pSrc->GetHeight()*m_ratio),1,&m_imageSrc);
	pDst->Resample((long)(pDst->GetWidth()*m_ratio),(long)(pDst->GetHeight()*m_ratio),1,&m_imageDst);
}

void DlgMix::SetMix()
{
	pDocSrc = (CDemoDoc*) m_cbSrc.GetItemData(m_cbSrc.GetCurSel());
	pDocDst = (CDemoDoc*) m_cbDst.GetItemData(m_cbDst.GetCurSel());
	OpType = m_cbOpType.GetItemData(m_cbOpType.GetCurSel());

	if (pDocSrc==0 || pDocDst==0) return;

	CxImage* pImageSrc = pDocSrc->GetImage();
	CxImage* pImageDst = pDocDst->GetImage();

	SetThumbs(pImageSrc,pImageDst);

	CxImage tmp;
	tmp.Copy(m_imageDst);
	tmp.Mix(m_imageSrc,(CxImage::ImageOpType)OpType,(long)(m_xoffset*m_ratio),(long)(m_yoffset*m_ratio),m_mixalpha!=0);

	if (m_mixalpha!=0){
		RGBQUAD c={255,255,255,0};
		tmp.SetTransColor(c);
		tmp.AlphaStrip();
	}

	if (m_bitmap) DeleteObject(m_bitmap);
	m_bitmap = tmp.MakeBitmap(m_picture.GetDC()->m_hDC);
	m_picture.SetBitmap(m_bitmap);
}


void DlgMix::OnOK() 
{
	SetMix();
	CDialog::OnOK();
}

⌨️ 快捷键说明

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