📄 makesealdlg.cpp
字号:
char* temp;
char* p;
int nCha = strlen(m_strMainText)/2;
temp = m_strMainText.GetBuffer(0);
m_strMainText.ReleaseBuffer();
p = temp;
for(int i = 0; i < nCha; i ++)
{
//将单个字保存在数组中
memcpy(cha[i], p, 2);
cha[i][3] = 0;
p += 2;
}
(*MemDC).SetTextColor(ChooseColor(&m_nRadioColor));
(*MemDC).SetTextAlign(TA_CENTER);
(*MemDC).SetBkMode(TRANSPARENT);
//定义字中心到圆心的半径
int r = m_nRadius - m_nInterval;
double xTemp,yTemp;
double arc;
arc = m_nAngle * TWO_PI/360.0;
static POINT point;
point.x = point.y = 100;
//显示签章单位
//字数为偶数时
if(nCha%2 == 0)
{
//显示右半边字
for(int i = 0; i < nCha/2; i++)
{
xTemp = point.x + r * sin(arc/2 + i * arc);
yTemp = point.y - r * cos(arc/2 + i * arc);
m_lf->lfEscapement = -10 * (m_nAngle / 2 + i * m_nAngle);
(*MemDC).SelectObject(CreateFontIndirect(m_lf));
(*MemDC).TextOut((int) xTemp, (int)yTemp, cha[nCha/2 + i]);
}
//显示左半边字
for(i = 0; i < nCha/2; i++)
{
xTemp = point.x - r * sin(arc/2 + i * arc);
yTemp = point.y - r * cos(arc/2 + i * arc);
m_lf->lfEscapement = 10 * (m_nAngle / 2 + i * m_nAngle);
(*MemDC).SelectObject(CreateFontIndirect(m_lf));
(*MemDC).TextOut((int) xTemp, (int)yTemp, cha[nCha/2 - i -1]);
}
}
//字数为奇数时
else
{
m_lf->lfEscapement = 0;
(*MemDC).SelectObject(CreateFontIndirect(m_lf));
//显示中间字
(*MemDC).TextOut(point.x, point.y - r, cha[(nCha-1)/2]);
//显示右半边字
for(int i = 1; i < (nCha + 1)/2; i++)
{
xTemp = point.x + r * sin(i * arc);
yTemp = point.y - r * cos(i * arc);
m_lf->lfEscapement = -10 * (i * m_nAngle);
(*MemDC).SelectObject(CreateFontIndirect(m_lf));
(*MemDC).TextOut((int) xTemp, (int)yTemp, cha[(nCha-1)/2 + i]);
}
//显示左半边字
for(i = 1; i < (nCha + 1)/2; i++)
{
xTemp = point.x - r * sin(i * arc);
yTemp = point.y - r * cos(i * arc);
m_lf->lfEscapement = 10 * (i * m_nAngle);
(*MemDC).SelectObject(CreateFontIndirect(m_lf));
(*MemDC).TextOut((int) xTemp, (int)yTemp, cha[(nCha-1)/2 - i]);
}
}
}
//更新显示五角星
void CMakeSealDlg::OnShowTri()
{
UpdateData(TRUE);
UpdateShow();
}
//修改字间距
void CMakeSealDlg::OnChangeAngle()
{
UpdateData(TRUE);
CSpinButtonCtrl* pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_ANGLE);
pSpin->SetPos(m_nAngle);
UpdateShow();
}
//修改字到外圆间的距离
void CMakeSealDlg::OnChangeInterval()
{
UpdateData(TRUE);
CSpinButtonCtrl* pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_INTERVAL);
pSpin->SetPos(m_nInterval);
UpdateShow();
}
//修改公章半径
void CMakeSealDlg::OnChangeRadius()
{
UpdateData(TRUE);
CSpinButtonCtrl* pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_RADIUS);
pSpin->SetPos(m_nRadius);
UpdateShow();
}
//修改主字体的高度
void CMakeSealDlg::OnChangeTextHeight()
{
UpdateData(TRUE);
CSpinButtonCtrl* pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_TEXT_HEIGHT);
pSpin->SetPos(m_nTextHeight);
UpdateShow();
}
//修改五角星外圆半径
void CMakeSealDlg::OnChangeTriRadius()
{
UpdateData(TRUE);
CSpinButtonCtrl* pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_TRI_RADIUS);
pSpin->SetPos(m_nTriRadius);
UpdateShow();
}
//显示红色
void CMakeSealDlg::OnRadioRed()
{
UpdateData(TRUE);
UpdateShow();
}
//显示蓝色
void CMakeSealDlg::OnRadioBlue()
{
UpdateData(TRUE);
UpdateShow();
}
//显示紫色
void CMakeSealDlg::OnRadioPurple()
{
UpdateData(TRUE);
UpdateShow();
}
//选择颜色
COLORREF CMakeSealDlg::ChooseColor(int *nChoice)
{
if(*nChoice == 0)
return RGB(255, 0, 0);
else if(*nChoice == 1)
return RGB(0, 0, 255);
else
return RGB(128, 0, 128);
}
//绘制附文1
void CMakeSealDlg::DrawSubText1(CDC * MemDC)
{
memset(m_lf, 0, sizeof(LOGFONT));
m_lf->lfHeight = m_nSub1Height;
m_lf->lfWidth = m_nSub1Width;
m_lf->lfWeight = FW_BOLD;
strcpy(m_lf->lfFaceName, m_strStyle);
(*MemDC).SelectObject(CreateFontIndirect(m_lf));
(*MemDC).SetTextColor(ChooseColor(&m_nRadioColor));
(*MemDC).SetTextAlign(TA_CENTER);
(*MemDC).SetBkMode(TRANSPARENT);
(*MemDC).TextOut(100, 120 + m_nSub1Pos, m_strSub1Text);
}
//修改附文1的内容
void CMakeSealDlg::OnChangeSub1Text()
{
UpdateData(TRUE);
UpdateShow();
}
//修改附文1的字高
void CMakeSealDlg::OnChangeSub1Height()
{
UpdateData(TRUE);
CSpinButtonCtrl* pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_SUB1_HEIGHT);
pSpin->SetPos(m_nSub1Height);
UpdateShow();
}
//修改附文1的位置
void CMakeSealDlg::OnChangeSub1Pos()
{
UpdateData(TRUE);
CSpinButtonCtrl* pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_SUB1_POS);
pSpin->SetPos(m_nSub1Pos);
UpdateShow();
}
//修改附文1的字宽
void CMakeSealDlg::OnChangeSub1Width()
{
UpdateData(TRUE);
CSpinButtonCtrl* pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_SUB1_WIDTH);
pSpin->SetPos(m_nSub1Width);
UpdateShow();
}
//绘制附文2
void CMakeSealDlg::DrawSubText2(CDC * MemDC)
{
memset(m_lf, 0, sizeof(LOGFONT));
m_lf->lfHeight = m_nSub2Height;
m_lf->lfWidth = m_nSub2Width;
m_lf->lfWeight = FW_NORMAL;
strcpy(m_lf->lfFaceName, m_strStyle);
(*MemDC).SelectObject(CreateFontIndirect(m_lf));
(*MemDC).SetTextColor(ChooseColor(&m_nRadioColor));
(*MemDC).SetTextAlign(TA_CENTER);
(*MemDC).SetBkMode(TRANSPARENT);
(*MemDC).TextOut(100, 120 + m_nSub2Pos, m_strSub2Text);
}
//修改附文2的内容
void CMakeSealDlg::OnChangeSub2Text()
{
UpdateData(TRUE);
UpdateShow();
}
//修改附文2的位置
void CMakeSealDlg::OnChangeSub2Pos()
{
UpdateData(TRUE);
CSpinButtonCtrl* pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_SUB2_POS);
pSpin->SetPos(m_nSub2Pos);
UpdateShow();
}
//修改附文2的字高
void CMakeSealDlg::OnChangeSub2Height()
{
UpdateData(TRUE);
CSpinButtonCtrl* pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_SUB2_HEIGHT);
pSpin->SetPos(m_nSub2Height);
UpdateShow();
}
//修改附文2的字宽
void CMakeSealDlg::OnChangeSub2Width()
{
UpdateData(TRUE);
CSpinButtonCtrl* pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_SUB2_WIDTH);
pSpin->SetPos(m_nSub2Width);
UpdateShow();
}
//保存位图
void CMakeSealDlg::OnSaveSeal(CDC* MemDC)
{
CFileDialog filedlg(FALSE);
//
int structsize=0;
DWORD dwVersion;
//检测目前的操作系统,GetVersion具体用法详见MSDN
dwVersion=GetVersion();
// 如果运行的操作系统是Windows NT/2000
if(dwVersion<0x80000000)
structsize = 88;//显示新的文件对话框
else
//运行的操作系统Windows 95/98
structsize = 76;//显示老的文件对话框
//
filedlg.m_ofn.lpstrFilter = "*.bmp";
filedlg.m_ofn.lStructSize=structsize;
if(filedlg.DoModal()==IDOK)
{
m_strFile = filedlg.GetPathName() + ".bmp";
UpdateData(FALSE);
SaveBitmapToFile(m_picture.GetBitmap(), (char*)(LPCTSTR)m_strFile);
}
}
BOOL CMakeSealDlg::SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName) //hBitmap 为刚才的屏幕位图句柄 lpFileName 为位图文件名
{
//设备描述表
HDC hDC;
//当前分辨率下每象素所占字节数
int iBits;
//位图中每象素所占字节数
WORD wBitCount;
//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
//位图属性结构
BITMAP Bitmap;
//位图文件头结构
BITMAPFILEHEADER bmfHdr;
//位图信息头结构
BITMAPINFOHEADER bi;
//指向位图信息头结构
LPBITMAPINFOHEADER lpbi;
//定义文件,分配内存句柄,调色板句柄
HANDLE fh, hDib, hPal,hOldPal=NULL;
//计算位图文件每个像素所占字节数
hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);
if (iBits <= 1)
wBitCount = 1;
else if (iBits <= 4)
wBitCount = 4;
else if (iBits <= 8)
wBitCount = 8;
else
wBitCount = 24;
GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrImportant = 0;
bi.biClrUsed = 0;
dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
//为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;
// 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);
if(hPal)
{
hDC = ::GetDC(NULL);
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC);
}
// 获取该调色板下新的像素值
GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight,
(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
+ dwPaletteSize, (BITMAPINFO*)lpbi, DIB_RGB_COLORS);
//恢复调色板
if (hOldPal)
{
::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL, hDC);
}
//创建位图文件
fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if(fh == INVALID_HANDLE_VALUE)
return FALSE;
// 设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ dwPaletteSize + dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER)
+ dwPaletteSize;
// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
//清除
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -