自绘图章

      闲来无事,在网上看见一个印章的程序,挺有意思的,呵呵,用了点时间实现了

 

     其实不难~ 这个程序挺好的,对LOGPEN,LOGFONT,BRUSH,CDC,位图的存储基本是综合性操作~新手做做肯定很有帮助的

     首先:OnInitDialog()里进行初始化

CreateMap(&m_pBitmap);   ///自定义函数,绘制图章
 HBITMAP BitmapHandle = (HBITMAP)m_pBitmap.Detach();//

m_bitmap.SetBitmap(BitmapHandle); /将位图与CStatic对象关联,以显示bitmap

第二步:初始化spin控件

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

 pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_CENTER);
 pSpin->SetRange(0,100);
 pSpin->SetPos(m_centerBeyond);

 pSpin = (CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_SUBSPACE);
 pSpin->SetRange(0,20);
 pSpin->SetPos(m_subSpace);~~~~

~~~~~很多spin控件 省略   一步步来 下面看下CreateMap()

void CSealDlg::CreateMap(CBitmap *bitmap)
{/**/
 CClientDC dc(this);
 CDC memDC;

 bitmap->CreateCompatibleBitmap(&dc,200,200);
 memDC.CreateCompatibleDC(&dc);
 memDC.SelectObject(bitmap);

 DrawSeal(&memDC);//绘制印章外圆
 DrawFont(&memDC);//绘制主文本
 DrawSubText(&memDC);//次文本

 if(TRUE == m_showPentagram)
 {
  DrawTri(&memDC);五角星
    }

 memDC.SelectObject(bitmap);
 memDC.DeleteDC();写到内存设备

}

接下来看一下DrawSeal()

void CSealDlg::DrawSeal(CDC *MemDC)
{
    int cx = 100;
 int cy = 100;
 POINT point;
 point.x = point.y = 5;
 
 LOGPEN logPen;

/**/ 
 logPen.lopnColor = ChooseColor(m_RadioRed);
 //选择字体颜色
 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_sealSize, cy - m_sealSize, cx + m_sealSize, cy + m_sealSize);
}

在看看DrawFont()


void CSealDlg::DrawFont(CDC *memDC)
{

 InitFont(m_pLogfont);

 char cz[20][4];
 char* temp;
 char* p;

 int nCz = m_mainText.GetLength()/2;

 temp = m_mainText.GetBuffer(0);
 m_mainText.ReleaseBuffer();   ///ÕâÁ½¾äµÄ×÷ÓþÍÊǽ«CStringÀàÐ͵ĸÄΪcharÐÍ
 p = temp;
  
 for(int j=0; j<nCz; j++)
 {
  memcpy(cz[j], p, 2);
  cz[j][3] = 0;
  p=p+2;
 }

 memDC->SetTextColor(ChooseColor(m_RadioRed));
 memDC->SetTextAlign(TA_CENTER);
 memDC->SetBkMode(TRANSPARENT);

 int r = m_centerBeyond;   ///ÖÐÐľàÀë
 double xTemp,yTemp;
 double arc;

 arc = TWO_PI*m_angle/360.0;
 
 static POINT point;
 point.x = point.y = 100;

 if(nCz%2 == 0)
 {
  //ÏÔʾÓÒ°ë±ß×Ö
   for(int i = 0; i < nCz/2; i++)
   { 
  xTemp = point.x + r * sin(arc/2 + i * arc);
  yTemp = point.y - r * cos(arc/2 + i * arc);
  
  
  m_pLogfont->lfEscapement = -10 * (m_angle / 2 + i * m_angle);
  ///Æ«ÒƵĽǶÈÉèÖÃ
  (*memDC).SelectObject(CreateFontIndirect(m_pLogfont));
  
  (*memDC).TextOut((int) xTemp, (int)yTemp, cz[nCz/2 + i]);
   }
 
   //ÏÔʾ×ó°ë±ß×Ö
  for(i = 0; i < nCz/2; i++)
   {
  xTemp = point.x - r * sin(arc/2 + i * arc);
  yTemp = point.y - r * cos(arc/2 + i * arc);
  
  m_pLogfont->lfEscapement = 10 * (m_angle / 2 + i * m_angle);
  (*memDC).SelectObject(CreateFontIndirect(m_pLogfont));

  (*memDC).TextOut((int) xTemp, (int)yTemp, cz[nCz/2 - i -1]);
   }
 }

 //×ÖÊýΪÆæÊýʱ
 else  
 {
  m_pLogfont->lfEscapement = 0; 
  (*memDC).SelectObject(CreateFontIndirect(m_pLogfont));
  //ÏÔʾÖмä×Ö
  (*memDC).TextOut(point.x, point.y - r, cz[(nCz-1)/2]);
   //ÏÔʾÓÒ°ë±ß×Ö
   for(int i = 1; i < (nCz + 1)/2; i++)
   { 
  xTemp = point.x + r * sin(i * arc);
  yTemp = point.y - r * cos(i * arc);
  
  
  m_pLogfont->lfEscapement = -10 * (i * m_angle);
  (*memDC).SelectObject(CreateFontIndirect(m_pLogfont));

  (*memDC).TextOut((int) xTemp, (int)yTemp, cz[(nCz-1)/2 + i]);
   }
   //ÏÔʾ×ó°ë±ß×Ö
   for(i = 1; i < (nCz + 1)/2; i++)  
   {
  xTemp = point.x - r * sin(i * arc);
  yTemp = point.y - r * cos(i * arc);
  
  m_pLogfont->lfEscapement = 10 * (i * m_angle);
  (*memDC).SelectObject(CreateFontIndirect(m_pLogfont));
  
  (*memDC).TextOut((int) xTemp, (int)yTemp, cz[(nCz-1)/2 - i]);
   }
 }

}
这个自己研究 不难懂

太多了累了在各重点就是位图的存储了


void CSealDlg::OnSaveSeal(CDC* MemDC)
{
 // TODO: Add your control notification handler code here
 CFileDialog   filedlg(FALSE);
  // 
 int   structsize=0;   
 DWORD   dwVersion;   
  //¼ì²âÄ¿Ç°µÄ²Ù×÷ϵͳ£¬GetVersion¾ßÌåÓ÷¨Ïê¼ûMSDN   
 dwVersion=GetVersion(); 
  //   Èç¹ûÔËÐеIJÙ×÷ϵͳÊÇWindows   NT/2000   
 if(dwVersion<0x80000000) 
  structsize = 88;//ÏÔʾеÄÎļþ¶Ô»°¿ò   
 else   
  //ÔËÐеIJÙ×÷ϵͳ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_bitmap.GetBitmap(), (char*)(LPCTSTR)m_strFile); 
 }
}

 


BOOL CSealDlg::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;   
}

就这样了 重点都在这里了 谁如果想要的话可以留下邮箱我把源代码发给他~ ok

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值