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

📄 makesealdlg.cpp

📁 图章制作软件VC++ 图形图像操作源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MakeSealDlg.cpp : implementation file
//

#include "stdafx.h"
#include "MakeSeal.h"
#include "MakeSealDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CMakeSealDlg dialog

CMakeSealDlg::CMakeSealDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMakeSealDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMakeSealDlg)
	m_strStyle = _T("幼圆");
	m_nMainWidth = 9;
	m_lf = new(LOGFONT);
	m_strMainText = _T("天喻信息产业股份公司");
	m_nRadius = 90;
	m_nTriRadius = 17;
	m_nAngle = 20;
	m_nTextHeight = 25;
	m_nInterval = 10;
	m_bShowTri = TRUE;
	m_nRadioColor = 0;
	m_strSub1Text = _T("应用软件部");
	m_nSub2Pos = 0;
	m_nSub1Pos = 20;
	m_strSub2Text = _T("");
	m_nSub2Width = 6;
	m_nSub2Height = 12;
	m_nSub1Height = 24;
	m_nSub1Width = 8;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	memset(m_lf, 0, sizeof(LOGFONT));
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}


void CMakeSealDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMakeSealDlg)
	DDX_Control(pDX, IDC_SHOW_WND, m_picture);
	DDX_CBString(pDX, IDC_FONT_STYLE, m_strStyle);
	DDX_Text(pDX, IDC_MAIN_WIDTH, m_nMainWidth);
	DDX_Text(pDX, IDC_MAIN_TEXT, m_strMainText);
	DDV_MaxChars(pDX, m_strMainText, 40);
	DDX_Text(pDX, IDC_RADIUS, m_nRadius);
	DDV_MinMaxInt(pDX, m_nRadius, 0, 90);
	DDX_Text(pDX, IDC_TRI_RADIUS, m_nTriRadius);
	DDV_MinMaxInt(pDX, m_nTriRadius, 0, 80);
	DDX_Text(pDX, IDC_ANGLE, m_nAngle);
	DDV_MinMaxInt(pDX, m_nAngle, 0, 50);
	DDX_Text(pDX, IDC_TEXT_HEIGHT, m_nTextHeight);
	DDV_MinMaxInt(pDX, m_nTextHeight, 0, 50);
	DDX_Text(pDX, IDC_INTERVAL, m_nInterval);
	DDV_MinMaxInt(pDX, m_nInterval, 0, 20);
	DDX_Check(pDX, IDC_SHOW_TRI, m_bShowTri);
	DDX_Radio(pDX, IDC_RADIO_RED, m_nRadioColor);
	DDX_Text(pDX, IDC_SUB1_TEXT, m_strSub1Text);
	DDX_Text(pDX, IDC_SUB2_POS, m_nSub2Pos);
	DDX_Text(pDX, IDC_SUB1_POS, m_nSub1Pos);
	DDX_Text(pDX, IDC_SUB2_TEXT, m_strSub2Text);
	DDX_Text(pDX, IDC_SUB2_WIDTH, m_nSub2Width);
	DDX_Text(pDX, IDC_SUB2_HEIGHT, m_nSub2Height);
	DDX_Text(pDX, IDC_SUB1_HEIGHT, m_nSub1Height);
	DDX_Text(pDX, IDC_SUB1_WIDTH, m_nSub1Width);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMakeSealDlg, CDialog)
	//{{AFX_MSG_MAP(CMakeSealDlg)
	ON_WM_QUERYDRAGICON()
	ON_WM_VSCROLL()
	ON_CBN_SELENDOK(IDC_FONT_STYLE, OnSelendokFontStyle)
	ON_EN_CHANGE(IDC_MAIN_WIDTH, OnChangeMainWidth)
	ON_EN_CHANGE(IDC_MAIN_TEXT, OnChangeMainText)
	ON_BN_CLICKED(IDC_SHOW_TRI, OnShowTri)
	ON_EN_CHANGE(IDC_ANGLE, OnChangeAngle)
	ON_EN_CHANGE(IDC_INTERVAL, OnChangeInterval)
	ON_EN_CHANGE(IDC_RADIUS, OnChangeRadius)
	ON_EN_CHANGE(IDC_TEXT_HEIGHT, OnChangeTextHeight)
	ON_EN_CHANGE(IDC_TRI_RADIUS, OnChangeTriRadius)
	ON_BN_CLICKED(IDC_RADIO_RED, OnRadioRed)
	ON_BN_CLICKED(IDC_RADIO_BLUE, OnRadioBlue)
	ON_BN_CLICKED(IDC_RADIO_PURPLE, OnRadioPurple)
	ON_EN_CHANGE(IDC_SUB1_TEXT, OnChangeSub1Text)
	ON_EN_CHANGE(IDC_SUB1_HEIGHT, OnChangeSub1Height)
	ON_EN_CHANGE(IDC_SUB1_POS, OnChangeSub1Pos)
	ON_EN_CHANGE(IDC_SUB1_WIDTH, OnChangeSub1Width)
	ON_BN_CLICKED(IDC_SAVE_SEAL, OnSaveSeal)
	ON_EN_CHANGE(IDC_SUB2_TEXT, OnChangeSub2Text)
	ON_EN_CHANGE(IDC_SUB2_POS, OnChangeSub2Pos)
	ON_EN_CHANGE(IDC_SUB2_HEIGHT, OnChangeSub2Height)
	ON_EN_CHANGE(IDC_SUB2_WIDTH, OnChangeSub2Width)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMakeSealDlg message handlers

BOOL CMakeSealDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	// TODO: Add extra initialization here	
	
	CreateBmp(&m_pBitmap);
	m_picture.SetBitmap((HBITMAP)m_pBitmap.Detach());

	//初始化各个Spin控件
	CSpinButtonCtrl* pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_MAIN_WIDTH);
	pSpin->SetRange(0, 100);
	pSpin->SetPos(m_nMainWidth);

	pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_RADIUS);
	pSpin->SetRange(0, 90);
	pSpin->SetPos(m_nRadius);

	pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_TRI_RADIUS);
	pSpin->SetRange(0, 50);
	pSpin->SetPos(m_nTriRadius);

	pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_ANGLE);
	pSpin->SetRange(0, 50);
	pSpin->SetPos(m_nAngle);

	pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_TEXT_HEIGHT);
	pSpin->SetRange(0, 50);
	pSpin->SetPos(m_nTextHeight);	

	pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_INTERVAL);
	pSpin->SetRange(0, 20);
	pSpin->SetPos(m_nInterval);

	pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_SUB1_POS);
	pSpin->SetRange(-50, 50);
	pSpin->SetPos(m_nSub1Pos);

	pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_SUB1_HEIGHT);
	pSpin->SetRange(0, 50);
	pSpin->SetPos(m_nSub1Height);

	pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_SUB1_WIDTH);
	pSpin->SetRange(0, 50);
	pSpin->SetPos(m_nSub1Width);

	pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_SUB2_POS);
	pSpin->SetRange(-50, 50);
	pSpin->SetPos(m_nSub2Pos);

	pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_SUB2_HEIGHT);
	pSpin->SetRange(0, 50);
	pSpin->SetPos(m_nSub2Height);

	pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_SUB2_WIDTH);
	pSpin->SetRange(0, 50);
	pSpin->SetPos(m_nSub2Width);

	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.



// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CMakeSealDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}


void CMakeSealDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	CSliderCtrl* pSlide = (CSliderCtrl*) pScrollBar;
	CString strText;
	switch(pScrollBar->GetDlgCtrlID())
	{
	//调整主字体宽度
	case IDC_SPIN_MAIN_WIDTH:
		((CSpinButtonCtrl*)pScrollBar)->SetBuddy((CEdit*)GetDlgItem(IDC_MAIN_WIDTH));
		strText.Format("%d", nPos);
		((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowText(strText);
		UpdateData(TRUE);
		break;
	//调整印章半径大小
	case IDC_SPIN_RADIUS:
		((CSpinButtonCtrl*)pScrollBar)->SetBuddy((CEdit*)GetDlgItem(IDC_RADIUS));
		strText.Format("%d", nPos);
		((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowText(strText);
		UpdateData(TRUE);
		break;
	//调整五角星外圆半径
	case IDC_SPIN_TRI_RADIUS:
		((CSpinButtonCtrl*)pScrollBar)->SetBuddy((CEdit*)GetDlgItem(IDC_TRI_RADIUS));
		strText.Format("%d", nPos);
		((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowText(strText);
		UpdateData(TRUE);
		break;
	//调整主字体间的间距
	case IDC_SPIN_ANGLE:
		((CSpinButtonCtrl*)pScrollBar)->SetBuddy((CEdit*)GetDlgItem(IDC_ANGLE));
		strText.Format("%d", nPos);
		((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowText(strText);
		UpdateData(TRUE);
		break;
	//调整字体的高度
	case IDC_SPIN_TEXT_HEIGHT:
		((CSpinButtonCtrl*)pScrollBar)->SetBuddy((CEdit*)GetDlgItem(IDC_TEXT_HEIGHT));
		strText.Format("%d", nPos);
		((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowText(strText);
		UpdateData(TRUE);
		break;
	//调整主字体与印章外圈的距离
	case IDC_SPIN_INTERVAL:
		((CSpinButtonCtrl*)pScrollBar)->SetBuddy((CEdit*)GetDlgItem(IDC_INTERVAL));
		strText.Format("%d", nPos);
		((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowText(strText);
		UpdateData(TRUE);
		break;
	//调整附字体1的高度
	case IDC_SPIN_SUB1_HEIGHT:
		((CSpinButtonCtrl*)pScrollBar)->SetBuddy((CEdit*)GetDlgItem(IDC_SUB1_HEIGHT));
		strText.Format("%d", nPos);
		((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowText(strText);
		UpdateData(TRUE);
		break;
	//调整附字体1的宽度
	case IDC_SPIN_SUB1_WIDTH:
		((CSpinButtonCtrl*)pScrollBar)->SetBuddy((CEdit*)GetDlgItem(IDC_SUB1_WIDTH));
		strText.Format("%d", nPos);
		((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowText(strText);
		UpdateData(TRUE);
		break;
	//调整附字体1的位置
	case IDC_SPIN_SUB1_POS:
		((CSpinButtonCtrl*)pScrollBar)->SetBuddy((CEdit*)GetDlgItem(IDC_SUB1_POS));
		strText.Format("%d", nPos);
		((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowText(strText);
		UpdateData(TRUE);
		break;
	//调整附字体2的高度
	case IDC_SPIN_SUB2_HEIGHT:
		((CSpinButtonCtrl*)pScrollBar)->SetBuddy((CEdit*)GetDlgItem(IDC_SUB2_HEIGHT));
		strText.Format("%d", nPos);
		((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowText(strText);
		UpdateData(TRUE);
		break;
	//调整附字体2的宽度
	case IDC_SPIN_SUB2_WIDTH:
		((CSpinButtonCtrl*)pScrollBar)->SetBuddy((CEdit*)GetDlgItem(IDC_SUB2_WIDTH));
		strText.Format("%d", nPos);
		((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowText(strText);
		UpdateData(TRUE);
		break;
	//调整附字体1的位置
	case IDC_SPIN_SUB2_POS:
		((CSpinButtonCtrl*)pScrollBar)->SetBuddy((CEdit*)GetDlgItem(IDC_SUB2_POS));
		strText.Format("%d", nPos);
		((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowText(strText);
		UpdateData(TRUE);
		break;
	}
	
	UpdateShow();
}


void CMakeSealDlg::CreateBmp(CBitmap *bitmap)
{
	
	
	CClientDC dc(this);
	//设置内存CDC
	CDC MemDC;
	//创建相容的bitmap和dc
	bitmap->CreateCompatibleBitmap(&dc, 198, 198);
	MemDC.CreateCompatibleDC(&dc);
	MemDC.SelectObject(bitmap);
	//在内存DC中绘制图章
	DrawSeal(&MemDC);
	DrawSealText(&MemDC);
	DrawSubText1(&MemDC);
	DrawSubText2(&MemDC);
	//判断是否绘制五角星
	if(m_bShowTri)
	{
		DrawTri(&MemDC);
	}
	//将创建图片保存在内存中
	MemDC.SelectObject(bitmap);
	
	MemDC.DeleteDC();
}

	//初始化字体
void CMakeSealDlg::InitLogFont(LOGFONT *lf)
{
	lf->lfCharSet = 134;
	lf->lfWidth = m_nMainWidth;
	lf->lfWeight = FW_BOLD;
	lf->lfHeight = m_nTextHeight;
	strcpy(lf->lfFaceName, m_strStyle);	
}

void CMakeSealDlg::OnOK() 
{
	UpdateData(TRUE);
	TRACE("m_strStyle = %s, m_strMainWidth = %d\n", m_strStyle, m_nMainWidth);
	CDialog::OnOK();
}

//重绘picture
void CMakeSealDlg::UpdateShow()
{
	m_pBitmap.DeleteObject();
	CreateBmp(&m_pBitmap);
	//在picture控件中显示位图
	m_picture.SetBitmap((HBITMAP)m_pBitmap.Detach());
}

//选择字型
void CMakeSealDlg::OnSelendokFontStyle() 
{
	CComboBox *pComboBox;
	pComboBox = (CComboBox *)GetDlgItem(IDC_FONT_STYLE);
	
	int index = pComboBox->GetCurSel();
	pComboBox->GetLBText(index, m_strStyle.GetBuffer(pComboBox->GetLBTextLen(index)));
    m_strStyle.ReleaseBuffer();
	//重绘picture
	UpdateShow();
}

//改变主字体宽度
void CMakeSealDlg::OnChangeMainWidth() 
{
	UpdateData(TRUE);

	CSpinButtonCtrl* pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_MAIN_WIDTH);
	pSpin->SetPos(m_nMainWidth);
		
	UpdateShow();
}

//改变主内容
void CMakeSealDlg::OnChangeMainText() 
{
	UpdateData(TRUE);
	UpdateShow();
}

//绘制图章基本图形
void CMakeSealDlg::DrawSeal(CDC * MemDC)
{
	int cx = 100;
	int cy = 100;
	POINT point;
	point.x = point.y = 5;
	
	LOGPEN logPen;
	
	logPen.lopnColor = ChooseColor(&m_nRadioColor);
	//绘制背景
	logPen.lopnStyle = PS_NULL;
	logPen.lopnWidth = point;
	(*MemDC).SelectObject(CreatePenIndirect(&logPen));
	(*MemDC).Rectangle(0,0,200,200);
	//设置绘笔
	logPen.lopnStyle = PS_SOLID;
	(*MemDC).SelectObject(CreatePenIndirect(&logPen));
	//设置填充
	LOGBRUSH logBrush;
	logBrush.lbStyle = BS_HOLLOW;
	logBrush.lbColor = RGB(255, 0, 0);
	(*MemDC).SelectObject(CreateBrushIndirect(&logBrush));
	//绘制外圆
	(*MemDC).Ellipse(cx - m_nRadius, cy - m_nRadius, cx + m_nRadius, cy + m_nRadius);
	
}

void CMakeSealDlg::DrawTri(CDC * MemDC)
{
	//定义五角星五个顶点
	static POINT apt[5], apt1[5];
	//定义五角星的外圆半径
	int r = m_nTriRadius;		

	static POINT point, point1;
	point.x = point.y = 100;
	point1.x = point1.y =1;

	for(int i = 0; i < 5; i++)
	{
		apt[i].y = (long)(point.y - r * cos(TWO_PI * 72 * i / 360));
		apt[i].x = (long)(point.x + r * sin(TWO_PI * 72 * i / 360));
	}
	
	apt1[0] = apt[0];
	apt1[1] = apt[2];
	apt1[2] = apt[4];
	apt1[3] = apt[1];
	apt1[4] = apt[3];
	//设置好绘制参数
	LOGPEN logPen;
	logPen.lopnColor = ChooseColor(&m_nRadioColor);
	logPen.lopnStyle = PS_NULL;
	logPen.lopnWidth = point1;
	(*MemDC).SelectObject(CreatePenIndirect(&logPen));
	(*MemDC).SetPolyFillMode(WINDING);
	(*MemDC).SelectObject(CreateSolidBrush(ChooseColor(&m_nRadioColor)));
	//绘制五角星
	(*MemDC).Polygon(apt1, 5);
	
}

void CMakeSealDlg::DrawSealText(CDC* MemDC)
{	
	InitLogFont(m_lf);

	char cha[20][4]; 

⌨️ 快捷键说明

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