CreatBMPView.cpp
上传用户:hfwmdy
上传日期:2016-01-14
资源大小:83k
文件大小:9k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1. // CreatBMPView.cpp : implementation of the CCreatBMPView class
  2. //
  3. #include "stdafx.h"
  4. #include "CreatBMP.h"
  5. #include "CreatBMPDoc.h"
  6. #include "CreatBMPView.h"
  7. /*
  8. #include  ".atldebugapi.h"
  9. #include  ".atltrace.h"
  10. #include  ".atlexcept.h"
  11. #include  ".atlchecked.h"
  12. #include  ".atlcore.h"
  13. #include  ".atlsimpstr.h"
  14. #include  ".cstringt.h"
  15. #include  ".atlstr.h"
  16. #include  ".atlimage.h"
  17. */
  18. #ifdef _DEBUG
  19. #define new DEBUG_NEW
  20. #undef THIS_FILE
  21. static char THIS_FILE[] = __FILE__;
  22. #endif
  23. /////////////////////////////////////////////////////////////////////////////
  24. // CCreatBMPView
  25. IMPLEMENT_DYNCREATE(CCreatBMPView, CView)
  26. BEGIN_MESSAGE_MAP(CCreatBMPView, CView)
  27. //{{AFX_MSG_MAP(CCreatBMPView)
  28. ON_COMMAND(ID_CREATE_BMP, OnCreateBmp)
  29. //}}AFX_MSG_MAP
  30. // Standard printing commands
  31. ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  32. ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  33. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
  34. END_MESSAGE_MAP()
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CCreatBMPView construction/destruction
  37. CCreatBMPView::CCreatBMPView()
  38. {
  39. // TODO: add construction code here
  40. }
  41. CCreatBMPView::~CCreatBMPView()
  42. {
  43. }
  44. BOOL CCreatBMPView::PreCreateWindow(CREATESTRUCT& cs)
  45. {
  46. // TODO: Modify the Window class or styles here by modifying
  47. //  the CREATESTRUCT cs
  48. return CView::PreCreateWindow(cs);
  49. }
  50. /////////////////////////////////////////////////////////////////////////////
  51. // CCreatBMPView drawing
  52. void CCreatBMPView::OnDraw(CDC* pDC)
  53. {
  54. CCreatBMPDoc* pDoc = GetDocument();
  55. ASSERT_VALID(pDoc);
  56. // TODO: add draw code for native data here
  57. }
  58. /////////////////////////////////////////////////////////////////////////////
  59. // CCreatBMPView printing
  60. BOOL CCreatBMPView::OnPreparePrinting(CPrintInfo* pInfo)
  61. {
  62. // default preparation
  63. return DoPreparePrinting(pInfo);
  64. }
  65. void CCreatBMPView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  66. {
  67. // TODO: add extra initialization before printing
  68. }
  69. void CCreatBMPView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  70. {
  71. // TODO: add cleanup after printing
  72. }
  73. /////////////////////////////////////////////////////////////////////////////
  74. // CCreatBMPView diagnostics
  75. #ifdef _DEBUG
  76. void CCreatBMPView::AssertValid() const
  77. {
  78. CView::AssertValid();
  79. }
  80. void CCreatBMPView::Dump(CDumpContext& dc) const
  81. {
  82. CView::Dump(dc);
  83. }
  84. CCreatBMPDoc* CCreatBMPView::GetDocument() // non-debug version is inline
  85. {
  86. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCreatBMPDoc)));
  87. return (CCreatBMPDoc*)m_pDocument;
  88. }
  89. #endif //_DEBUG
  90. /////////////////////////////////////////////////////////////////////////////
  91. // CCreatBMPView message handlers
  92. void CCreatBMPView::OnCreateBmp() 
  93. {
  94. // TODO: Add your command handler code here
  95. /* CClientDC   dc(this); 
  96.   dc.TextOut(100,100,"thsi is a test");
  97.   CDC memDC; 
  98.   CRect   rect; 
  99.   GetClientRect(rect); 
  100.   CBitmap m_bitmap;
  101.   
  102. memDC.CreateCompatibleDC(&dc); 
  103. int   Width   =   rect.Width(); 
  104. int   Height   =   rect.Height(); 
  105. int   iBits;   //当前显示分辨率下每个像素所占字节数 
  106. WORD   wBitCount;   ////位图中每个像素所占字节数 
  107. DWORD   dwPaletteSize=0,   dwBmBitsSize;//定义调色板大小,位图中像素字节大小 
  108.   // if(m_OpenState   !=   1) 
  109.   // { 
  110.   m_bitmap.CreateCompatibleBitmap(&dc,   Width,   Height); 
  111.   // } 
  112.   CBitmap*   pOld   =   memDC.SelectObject(&m_bitmap); 
  113.   memDC.BitBlt(0,   0,   Width,   Height,   &dc,   0,   0,   SRCCOPY); 
  114.   memDC.SelectObject(pOld); 
  115.   BITMAP   btm; 
  116.   m_bitmap.GetBitmap(&btm); 
  117.   DWORD   dwBytesSize     =   btm.bmWidthBytes   *   btm.bmHeight; 
  118.   iBits   =   GetDeviceCaps(memDC,   BITSPIXEL); 
  119.   
  120. if   (iBits   <=   1) 
  121. wBitCount   =   1; 
  122. else   if   (iBits   <=   4) 
  123. wBitCount   =   4; 
  124. else   if   (iBits   <=   8) 
  125. wBitCount   =   8; 
  126. else   if   (iBits   <=   24) 
  127. wBitCount   =   24; 
  128. //计算调色板大小 
  129. if   (wBitCount   <=   8) 
  130. dwPaletteSize   =   (1   <<   wBitCount)   *sizeof(RGBQUAD); 
  131. /////////////////////////////////////////////   
  132. BITMAPFILEHEADER   bfh; 
  133. BITMAPINFOHEADER   bih; 
  134. HANDLE   hPal,hOldPal=NULL;   
  135.   bih.biBitCount   =   wBitCount;//btm.bmBitsPixel; 
  136.   bih.biClrImportant   =   0; 
  137.   bih.biClrUsed   =   0; 
  138.   bih.biCompression   =   BI_RGB; 
  139.   bih.biHeight   =   btm.bmHeight; 
  140.   bih.biPlanes   =   1; 
  141.   bih.biSize   =   sizeof(BITMAPINFOHEADER); 
  142.   bih.biSizeImage   =   dwBytesSize   ; 
  143.   bih.biWidth   =   btm.bmWidth; 
  144.   bih.biXPelsPerMeter   =   0; 
  145.   bih.biYPelsPerMeter   =   0; 
  146.   bfh.bfReserved1   =   bfh.bfReserved2   =   0; 
  147.   bfh.bfType   =   0x4D42;   //   bm   
  148.   
  149. dwBmBitsSize   =   ((btm.bmWidth*wBitCount+31)/32)*4*btm.bmHeight; 
  150. LPSTR   lpData   =   (LPSTR)GlobalAlloc(GPTR,   dwBmBitsSize); 
  151.   ////   处理调色板   
  152.   hPal   =   GetStockObject(DEFAULT_PALETTE);   
  153.   if   (hPal)   
  154.   {   
  155.   dc.m_hDC   =   ::GetDC(NULL);   
  156.   hOldPal   =   ::SelectPalette(dc,   (HPALETTE)hPal,   FALSE);   
  157.   RealizePalette(dc);   
  158.   } 
  159.   ////   获取该调色板下新的像素值 
  160.   GetDIBits(dc,m_bitmap,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS); 
  161.   ////恢复调色板   
  162.   if   (hOldPal)   
  163.   {   
  164.   ::SelectPalette(dc,   (HPALETTE)hOldPal,   TRUE);   
  165.   RealizePalette(dc);   
  166.   ::ReleaseDC(NULL,   dc);   
  167.   }             
  168.   
  169. bfh.bfSize   =sizeof(BITMAPFILEHEADER)   +   sizeof(BITMAPINFOHEADER)   +   dwPaletteSize   +   dwBmBitsSize;   
  170. bfh.bfOffBits   =   (DWORD)sizeof(BITMAPFILEHEADER)   +   (DWORD)sizeof(BITMAPINFOHEADER)   +   dwPaletteSize; 
  171.   CFileDialog   dlg(FALSE,NULL,NULL,NULL,_T( "位图文件(*.bmp)|*.bmp| ")); 
  172.   if   (dlg.DoModal()!=IDOK) 
  173.   return; 
  174.   
  175. CFile     bf; 
  176.   CString szSaveFileName=dlg.GetPathName()   +   ".bmp "; 
  177.   if(bf.Open(szSaveFileName,   CFile::modeCreate   |   CFile::modeWrite)) 
  178.   { 
  179.   bf.WriteHuge(&bfh,   sizeof(BITMAPFILEHEADER)); 
  180.   bf.WriteHuge(&bih,   sizeof(BITMAPINFOHEADER)); 
  181.   bf.WriteHuge(lpData,dwBmBitsSize); 
  182.   bf.Close(); 
  183.   AfxMessageBox( "保存成功 "); 
  184.   } 
  185.   GlobalFree(lpData);   
  186.   memDC.DeleteDC(); 
  187. */
  188. HDC   hActiveDC=::GetDC(this-> m_hWnd); 
  189. // SetMapMode(hActiveDC,MM_LOMETRIC);
  190. BITMAPINFO   bi;//信息头 
  191. void   *pBits=NULL; 
  192. // CRect   rect;//客户区窗口 
  193. // GetClientRect(&rect); 
  194. //    nWidth=rect.right; 
  195. //    nHeight=rect.bottom; 
  196. // int a4_w = 1000;//0.1mm
  197. // int a4_h = 2000;
  198. int a4_w = 2050-2*191;//0.1mm
  199. int a4_h = 2970-2*191;
  200. // CPoint p = CPoint(a4_w,-a4_h);
  201. CPoint p = CPoint(a4_h,-a4_w);
  202. SetMapMode(hActiveDC,MM_LOMETRIC);
  203. LPtoDP(hActiveDC,&p,1);
  204. SetMapMode(hActiveDC,MM_TEXT);
  205. DPtoLP(hActiveDC,&p,1);
  206. int nWidth = p.x; 
  207. int nHeight = p.y; 
  208. // int nWidth=800; 
  209. // int nHeight=600; 
  210. //拷贝客户区至内存DC 
  211. //HDC   hActiveDC=::GetDC(GetSafeHwnd());//参数 
  212. HDC   hActiveWndCompatibleDC=CreateCompatibleDC(hActiveDC); 
  213. HBITMAP   hActiveWndCompactibleBitmap=CreateCompatibleBitmap(hActiveDC,nWidth,nHeight); 
  214. SelectObject(hActiveWndCompatibleDC,hActiveWndCompactibleBitmap); 
  215. //把hActiveDC句柄所指定的当前客户区图复制到hActiveWndCompatibleDC中 
  216. BitBlt(hActiveWndCompatibleDC,0,0,nWidth,nHeight,hActiveDC,0,0,SRCCOPY); 
  217. SetMapMode(hActiveWndCompatibleDC,MM_LOMETRIC);
  218. TextOut(hActiveWndCompatibleDC,100,-100,"this is a test",14);
  219. TextOut(hActiveWndCompatibleDC,200,-200,"this is a test",14);
  220. SetMapMode(hActiveWndCompatibleDC,MM_TEXT);
  221. //保存内存DC 
  222. HDC   hBmpFileDC=CreateCompatibleDC(hActiveWndCompatibleDC); 
  223. //填充信息头 
  224. ZeroMemory(&bi,sizeof(bi)); 
  225. bi.bmiHeader.biSize=sizeof(bi.bmiHeader); 
  226. bi.bmiHeader.biHeight=nHeight; 
  227. bi.bmiHeader.biWidth=nWidth; 
  228. bi.bmiHeader.biPlanes=1; 
  229. bi.bmiHeader.biBitCount=24; 
  230. bi.bmiHeader.biCompression=BI_RGB; 
  231. bi.bmiHeader.biSizeImage=3*nWidth*nHeight; 
  232. //创建一个位图可用作直接进行写操作 
  233. // HBITMAP   hBmpFileBitmap=CreateDIBSection(hActiveWndCompatibleDC,&bi,DIB_RGB_COLORS,&pBits,NULL,0); 
  234. HBITMAP   hBmpFileBitmap=CreateDIBSection(hActiveWndCompatibleDC,&bi,DIB_PAL_COLORS,&pBits,NULL,0); 
  235. SelectObject(hBmpFileDC,hBmpFileBitmap); 
  236. BitBlt(hBmpFileDC,0,0,nWidth,nHeight,hActiveWndCompatibleDC,0,0,SRCCOPY); 
  237. CString   tempFileName;//目标文件名 
  238. tempFileName   =   "D:\MAP.bmp "; 
  239. HANDLE   hFile=CreateFile(tempFileName,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); 
  240. if(hFile!=INVALID_HANDLE_VALUE) 
  241. DWORD   dwRet=0; 
  242. //填充文件头 
  243. BITMAPFILEHEADER   bmfHeader; 
  244. ZeroMemory(&bmfHeader,sizeof(bmfHeader)); 
  245. bmfHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); 
  246. bmfHeader.bfSize=bi.bmiHeader.biSizeImage+bmfHeader.bfOffBits; 
  247. bmfHeader.bfType= 'MB'; 
  248. WriteFile(hFile,&bmfHeader,sizeof(bmfHeader),&dwRet,NULL); 
  249. WriteFile(hFile,&bi.bmiHeader,sizeof(bi.bmiHeader),&dwRet,NULL); 
  250. WriteFile(hFile,pBits,bi.bmiHeader.biSizeImage,&dwRet,NULL); 
  251. CloseHandle(hFile); 
  252. }