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

📄 makesealdlg.cpp

📁 图章制作软件VC++ 图形图像操作源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -