闲来无事,在网上看见一个印章的程序,挺有意思的,呵呵,用了点时间实现了
其实不难~ 这个程序挺好的,对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