`
nanjingjiangbiao_T
  • 浏览: 2583738 次
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

vc++如何将客户区存为bmp和VC实现自绘图形输出到bmp文件

 
阅读更多

vc++如何将客户区存为bmp

在view类中添加以下三个函数:

BOOL CTestestView::WriteWindowToDIB(LPTSTR szFile, CWnd *pWnd)

{

CBitmap bitmap;

CWindowDC dc(pWnd);

CDC memDC;

CRect rect;

memDC.CreateCompatibleDC(&dc);

pWnd->GetWindowRect(rect);

bitmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());

CBitmap* pOldBitmap=memDC.SelectObject(&bitmap);

memDC.BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);

CPalette pal;

if(dc.GetDeviceCaps(RASTERCAPS)&RC_PALETTE)

{

UINT nSize=sizeof(LOGPALETTE)+(sizeof(PALETTEENTRY)*256);

LOGPALETTE* pLP=(LOGPALETTE*)new BYTE[nSize];

pLP->palVersion=0x300;

pLP->palNumEntries=GetSystemPaletteEntries(dc,0,255,pLP->palPalEntry);

pal.CreatePalette(pLP);

delete[] pLP;

}

memDC.SelectObject(pOldBitmap);

HANDLE hDIB=DDBToDIB(bitmap,BI_RGB,&pal);

if(hDIB==NULL)

return FALSE;

WriteDIB(szFile,hDIB);

GlobalFree(hDIB);

return TRUE;

}

HANDLE CTestestView::DDBToDIB(CBitmap &bitmap, DWORD dwCompression, CPalette *pPal)

{

BITMAP bm;

BITMAPINFOHEADER bi;

LPBITMAPINFOHEADER lpbi;

DWORD dwLen;

HANDLE hDIB;

HANDLE handle;

HDC hDC;

HPALETTE hPal;

ASSERT(bitmap.GetSafeHandle());

if(dwCompression==BI_BITFIELDS)

return NULL;

hPal=(HPALETTE)pPal->GetSafeHandle();

if(hPal==NULL)

hPal=(HPALETTE)GetStockObject(DEFAULT_PALETTE);

bitmap.GetObject(sizeof(bm),(LPSTR)&bm);

bi.biSize=sizeof(BITMAPINFOHEADER);

bi.biWidth=bm.bmWidth;

bi.biHeight=bm.bmHeight;

bi.biPlanes=1;

bi.biBitCount=bm.bmPlanes*bm.bmBitsPixel;

bi.biCompression=dwCompression;

bi.biSizeImage=0;

bi.biXPelsPerMeter=0;

bi.biYPelsPerMeter=0;

bi.biClrImportant=0;

bi.biClrUsed=0;

int nColors=(1<<bi.biBitCount);

if(nColors>256)

nColors=0;

dwLen=bi.biSize+nColors*sizeof(RGBQUAD);

hDC=::GetDC(NULL);

hPal=SelectPalette(hDC,hPal,FALSE);

RealizePalette(hDC);

hDIB=GlobalAlloc(GMEM_FIXED,dwLen);

if(!hDIB)

{

SelectPalette(hDC,hPal,FALSE);

::ReleaseDC(NULL,hDC);

return NULL;

}

lpbi=(LPBITMAPINFOHEADER)hDIB;

*lpbi=bi;

GetDIBits(hDC,(HBITMAP)bitmap.GetSafeHandle(),0L,(DWORD)bi.biHeight,(LPBYTE)NULL,(LPBITMAPINFO)lpbi,(DWORD)DIB_RGB_COLORS);

bi=*lpbi;

if(bi.biSizeImage==0)

{

bi.biSizeImage=((((bi.biWidth*bi.biBitCount)+31)& ~31)/8)*bi.biHeight;

if(dwCompression!=BI_RGB)

bi.biSizeImage=(bi.biSizeImage*3)/2;

}

dwLen+=bi.biSizeImage;

if(handle=GlobalReAlloc(hDIB,dwLen,GMEM_MOVEABLE))

hDIB=handle;

else

{

GlobalFree(hDIB);

SelectPalette(hDC,hPal,FALSE);

::ReleaseDC(NULL,hDC);

return NULL;

}

lpbi=(LPBITMAPINFOHEADER)hDIB;

BOOL bGotBits=GetDIBits(hDC,(HBITMAP)bitmap.GetSafeHandle(),0L,(DWORD)bi.biHeight,(LPBYTE)lpbi+(bi.biSize+nColors*sizeof(RGBQUAD)),

(LPBITMAPINFO)lpbi,(DWORD)DIB_RGB_COLORS);

if(!bGotBits)

{

GlobalFree(hDIB);

SelectPalette(hDC,hPal,FALSE);

::ReleaseDC(NULL,hDC);

return NULL;

}

SelectPalette(hDC,hPal,FALSE);

::ReleaseDC(NULL,hDC);

return hDIB;

}

BOOL CTestestView::WriteDIB(LPTSTR szFile, HANDLE hDIB)

{

BITMAPFILEHEADER hdr;

LPBITMAPINFOHEADER lpbi;

if(!hDIB)

return FALSE;

CFile file;

if(!file.Open(szFile,CFile::modeWrite|CFile::modeCreate))

return FALSE;

lpbi=(LPBITMAPINFOHEADER)hDIB;

int nColors=1<<lpbi->biBitCount;

hdr.bfType=((WORD)('M'<<8)|'B');

hdr.bfSize=::GlobalSize(hDIB)+sizeof(hdr);

hdr.bfReserved1=0;

hdr.bfReserved2=0;

hdr.bfOffBits=(DWORD)(sizeof(hdr)+lpbi->biSize+nColors*sizeof(RGBQUAD));

file.Write(&hdr,sizeof(hdr));

file.Write(lpbi,GlobalSize(hDIB));

return TRUE;

}

在保存时调用函数WriteWindowToDIB()

void CTestestView::OnFileSave()

{

// TODO: Add your command handler code here

WriteWindowToDIB("D://My.bmp",this);

}

本人测试过,确实直接加上就可以了,但是注意类名要改为和你的一致的

转载声明: 本文转自http://wmnmtm.blog.163.com/blog/static/38245714200963032449/

==================================================================

VC实现自绘图形输出到bmp文件

在用vc做程序时候,经常需要把输出的文本和图形保存到位图文件,当然可以有现成的控件来实现,但总不能如自己所愿,还是自己动手写吧!如下图:


一、实现方法

  要把文本和图形保存到位图文件,只要对掌握位图结构有一定的了解,一切都ok呢。先必须要创建内存设备环境,然后内存设备环境创建的DIB区域,别忘了还要创建个CBitmap对象,CBitmap对象必须和DIB区域关联起来,把CBitmap对象选择到当前设备环境,然后在当前设备环境输出文本和图形就可以了。

二、具体实现代码如下


void CTestSaveBmpView::SaveAsBmp(CString filename)
{
//定义图形大小
int iWidth = 800;
int iHeight = 600;
int iPixel = 16;
//图形格式参数
LPBITMAPINFO lpbmih = new BITMAPINFO;
lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbmih->bmiHeader.biWidth = iWidth;
lpbmih->bmiHeader.biHeight = iHeight;
lpbmih->bmiHeader.biPlanes = 1;
lpbmih->bmiHeader.biBitCount = iPixel;
lpbmih->bmiHeader.biCompression = BI_RGB;
lpbmih->bmiHeader.biSizeImage = 0;
lpbmih->bmiHeader.biXPelsPerMeter = 0;
lpbmih->bmiHeader.biYPelsPerMeter = 0;
lpbmih->bmiHeader.biClrUsed = 0;
lpbmih->bmiHeader.biClrImportant = 0;

//创建位图数据
HDC hdc,hdcMem;
HBITMAP hBitMap = NULL;
CBitmap *pBitMap = NULL;
CDC *pMemDC = NULL;
BYTE *pBits;

hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
hdcMem = CreateCompatibleDC(hdc);
hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);
pBitMap = new CBitmap;
pBitMap->Attach(hBitMap);
pMemDC = new CDC;
pMemDC->Attach(hdcMem);
pMemDC->SelectObject(pBitMap);
//
CRect rc(0,0,iWidth,iHeight);
pMemDC->SetBkMode(TRANSPARENT);
//添加自绘图形
DrawCurve(pMemDC,rc);
//保存到文件并创建位图结构
BITMAPFILEHEADER bmfh;
ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
*((char *)&bmfh.bfType) = ''B'';
*(((char *)&bmfh.bfType) + 1) = ''M'';
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8;

TCHAR szBMPFileName[128];
int iBMPBytes = iWidth * iHeight * iPixel / 8;
strcpy(szBMPFileName,filename);
CFile file;
if(file.Open(szBMPFileName,CFile::modeWrite | CFile::modeCreate))
{
file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));
file.Write(pBits,iBMPBytes);
file.Close();
}

pMemDC->DeleteDC();
delete pMemDC; pMemDC = NULL;
delete pBitMap; pBitMap = NULL;
delete lpbmih; lpbmih = NULL;
}

//输出文本和图形

void CTestSaveBmpView::DrawCurve(CDC *pDC, CRect rcClient)
{
//页面背景色
CBrush brushCtl;
brushCtl.CreateSolidBrush(RGB(255,255,255));
pDC->Rectangle(rcClient);
pDC->FillRect(rcClient,&brushCtl) ;
brushCtl.DeleteObject();

CPen pen;
pen.CreatePen(PS_SOLID, 1, RGB(255,0,0));
CPen *oldPen = pDC->SelectObject(&pen);

double xMin = 10.00f, xMax = 100.00f;
double yMin = 10.00f, yMax = 200.00f;

double dbX1 = (xMax- xMin)/100 + xMin;
double dbY1 = 600/dbX1 ;
for (int i=1; i<100; i++) //曲线
{
double dbX2 = (xMax- xMin)*i/100 + xMin;
double dbY2 = 600/dbX2 ;

pDC->MoveTo(int(rcClient.left+(dbX1 - xMin)*rcClient.Width()/(xMax- xMin)),
int(rcClient.bottom-(dbY1- yMin)*rcClient.Height()/(yMax- yMin)));
pDC->LineTo(int(rcClient.left+(dbX2 - xMin)*rcClient.Width()/(xMax- xMin)),
int(rcClient.bottom-(dbY2- yMin)*rcClient.Height()/(yMax- yMin)));

dbX1=dbX2;
dbY1=dbY2;
}
pDC->SelectObject(oldPen);
pen.DeleteObject();
oldPen = NULL;
}

//保存的实现
void CTestSaveBmpView::OnRButtonDown(UINT nFlags, CPoint point)
{

CFileDialog dlg(false,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"位图文件(*.bmp)|*.bmp|",
NULL);
if (dlg.DoModal()!= IDOK) return;
CString filename = dlg.GetFileName() + ".bmp";
SaveAsBmp(filename);

CView::OnRButtonDown(nFlags, point);
}

转载声明: 本文转自http://wmnmtm.blog.163.com/blog/static/38245714200963005616282/

==================================================================

分享到:
评论

相关推荐

    VC++ 实现BMP位图 图形 菜单

    VC++ 实现BMP位图 图形 菜单 很不错的漂亮菜单

    VC++ JPEG与BMP图像互转

    本函数将一个JPG图形文件转换为BMP图形文件。 函数调用语句样例: rs=jpg_to_bmp("c:\jpgdemo\demo.jpg","c:\temp\demo.bmp") . 6. long bmp_to_jpg(char *jpgfilename, char *bmpfilename,long quality) 5. long...

    三个VC++读取并显示BMP位图的小程序

    摘要:VC/C++源码,图形处理,BMP,位图  三个VC++读取并显示BMP位图的小程序,通过读取位图资源显示位图、通过位图文件直接得到位图大孝通过装入位图文件显示位图。

    打开BMP文件的所有源程序

    [disp bmp.rar] - c语言写的bmp图像读取显示例程,有助于具体了解bmp文件格式,灵活操作 ... [运用Opengl和C实现一个人体面部的三维显示.rar] - 通过VC++和OPenGL实现人脸的三维显示,在 vc++6.0下编译通过

    vc++ 应用源码包_3

    自绘了CListCtrl 控件,实现了其它控件阙套到List中并自绘等。主要的实现在CListReport类中。 CListCtrlTest 演示了重载CListCtrl后的使用方法。 CListItem Drawing 演示了其它控件(全部)阙套到List中并自绘等,...

    VC++图像的复制剪切粘贴

    摘要:VC/C++源码,图形处理,复制,剪切  VC++图像的复制剪切粘贴,简单吧,不能再简单了,仅供初学者入门参考。

    vc++ 应用源码包_1

    自绘了CListCtrl 控件,实现了其它控件阙套到List中并自绘等。主要的实现在CListReport类中。 CListCtrlTest 演示了重载CListCtrl后的使用方法。 CListItem Drawing 演示了其它控件(全部)阙套到List中并自绘等,...

    vc++ 应用源码包_6

    自绘了CListCtrl 控件,实现了其它控件阙套到List中并自绘等。主要的实现在CListReport类中。 CListCtrlTest 演示了重载CListCtrl后的使用方法。 CListItem Drawing 演示了其它控件(全部)阙套到List中并自绘等,...

    VC++图形编程技巧与实例

    提供了对图像处理的基础算法,包括图像阈值化,图像的反转,对彩色图像的处理。以及适合各种图像处理的BMP图片

    VC++打开预览BMP图像

    摘要:VC/C++源码,图形处理,BMP VC++打开预览BMP图像,写的一个VC++小程序,用来打开预览BMP格式的图像,以前见到不少新手对于在窗体上显示BMP位图很是纠结,希望通过这个小小的VC++实例源码为你找到答案。

    VC++实现BMP位图图形菜单

    内容索引:VC/C++源码,界面编程,图形菜单,界面编程,位图 一个使用BMP位图编写的VC++图形菜单源码。

    VC++图形编程(图形编辑放大,缩小,漫游等)

    VC++图形编程,能打开BMP图像,并能实现图形放大,缩小,漫游,编辑,属性查询等功能

    vc++ 应用源码包_2

    自绘了CListCtrl 控件,实现了其它控件阙套到List中并自绘等。主要的实现在CListReport类中。 CListCtrlTest 演示了重载CListCtrl后的使用方法。 CListItem Drawing 演示了其它控件(全部)阙套到List中并自绘等,...

    vc++ 应用源码包_5

    自绘了CListCtrl 控件,实现了其它控件阙套到List中并自绘等。主要的实现在CListReport类中。 CListCtrlTest 演示了重载CListCtrl后的使用方法。 CListItem Drawing 演示了其它控件(全部)阙套到List中并自绘等,...

    基于VC6.0实现程序截图保存图片格式任意设定

    本工程基于VC++6.0 实现了可以实现应用程序的截图功能,同时截图可以保存为 BMP格式, JPEG格式 PNG格式等等,本工程运行需要VC++6.0 进行GDI+配置。。。 对本工程进行修改可用于屏幕截屏功能。。。。且保存图片格式...

    vc++ 开发实例源码包

    自绘了CListCtrl 控件,实现了其它控件阙套到List中并自绘等。主要的实现在CListReport类中。 CListCtrlTest 演示了重载CListCtrl后的使用方法。 CListItem Drawing 演示了其它控件(全部)阙套到List中并自绘等,...

    VC与Labview、Matlab编程论文资料[2].rar

    VC_中利用DirectX实现3DS文件的读取和控制.pdf VC_中基于MFC的多线程应用程序设计.pdf VC_中连接Oracle数据库的几种方法.pdf VC_串口通信中多线程技术的应用研究.pdf VC_和COM的预测控制算法的仿真研究.pdf VC_和...

    VC++6.0车牌识别系统

    在完成相应的功能后 将 isnewfile 和 isnewiamge 置为真 ,并使用myDoc-&gt;UpdateAllViews(NULL); 刷新 当然,可以更加有个性化一点,有能力的同学可以自己完成。 随着课程的进行,菜单功能逐渐丰富,最后完成基本的...

    VC与Labview、Matlab编程论文资料

    VC_中利用DirectX实现3DS文件的读取和控制.pdf VC_中基于MFC的多线程应用程序设计.pdf VC_中连接Oracle数据库的几种方法.pdf VC_串口通信中多线程技术的应用研究.pdf VC_和COM的预测控制算法的仿真研究.pdf VC_和...

    VC++BMP图形拖动,动态运动实例

    摘要:VC/C++源码,图形处理,图形拖动 VC++实现BMP图形拖动,动态运动实例,编译运行本程序后,可见到窗体中有三个基于BMP位图的星球在运动,运动轨迹是随机的,如果你用鼠标去拖动它,便可以把拖动到任意位置,松开...

Global site tag (gtag.js) - Google Analytics