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