ex124View.cpp
上传用户:qdhmjx
上传日期:2022-07-11
资源大小:2226k
文件大小:5k
源码类别:

书籍源码

开发平台:

Visual C++

  1. // ex124View.cpp : implementation of the CEx124View class
  2. //
  3. #include "stdafx.h"
  4. #include "ex124.h"
  5. #include "ex124Doc.h"
  6. #include "ex124View.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CEx124View
  14. IMPLEMENT_DYNCREATE(CEx124View, CView)
  15. BEGIN_MESSAGE_MAP(CEx124View, CView)
  16. //{{AFX_MSG_MAP(CEx124View)
  17. ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
  18. //}}AFX_MSG_MAP
  19. // Standard printing commands
  20. ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  21. ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  22. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
  23. END_MESSAGE_MAP()
  24. /////////////////////////////////////////////////////////////////////////////
  25. // CEx124View construction/destruction
  26. CEx124View::CEx124View()
  27. {
  28. m_pDIBData=NULL;
  29. m_pBMI=NULL;
  30. }
  31. CEx124View::~CEx124View()
  32. {
  33. }
  34. BOOL CEx124View::PreCreateWindow(CREATESTRUCT& cs)
  35. {
  36. // TODO: Modify the Window class or styles here by modifying
  37. //  the CREATESTRUCT cs
  38. return CView::PreCreateWindow(cs);
  39. }
  40. /////////////////////////////////////////////////////////////////////////////
  41. // CEx124View drawing
  42. void CEx124View::OnDraw(CDC* pDC)
  43. {
  44. CEx124Doc* pDoc = GetDocument();
  45. ASSERT_VALID(pDoc);
  46. //如果还没有DIB数据,则返回
  47. if(m_pBMI==NULL||m_pDIBData==NULL)
  48. return;
  49. CRect rect;
  50. GetClientRect(rect);
  51. //在整个客户区显示DIB图像
  52. ShowDIB(pDC,0,0,rect.Width(),rect.Height());
  53. }
  54. /////////////////////////////////////////////////////////////////////////////
  55. // CEx124View printing
  56. BOOL CEx124View::OnPreparePrinting(CPrintInfo* pInfo)
  57. {
  58. // default preparation
  59. return DoPreparePrinting(pInfo);
  60. }
  61. void CEx124View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  62. {
  63. // TODO: add extra initialization before printing
  64. }
  65. void CEx124View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  66. {
  67. // TODO: add cleanup after printing
  68. }
  69. /////////////////////////////////////////////////////////////////////////////
  70. // CEx124View diagnostics
  71. #ifdef _DEBUG
  72. void CEx124View::AssertValid() const
  73. {
  74. CView::AssertValid();
  75. }
  76. void CEx124View::Dump(CDumpContext& dc) const
  77. {
  78. CView::Dump(dc);
  79. }
  80. CEx124Doc* CEx124View::GetDocument() // non-debug version is inline
  81. {
  82. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CEx124Doc)));
  83. return (CEx124Doc*)m_pDocument;
  84. }
  85. #endif //_DEBUG
  86. /////////////////////////////////////////////////////////////////////////////
  87. // CEx124View message handlers
  88. BOOL CEx124View::LoadFromFile(LPCTSTR lpszFileName)
  89. {
  90. CFile file;
  91. if(!file.Open(lpszFileName,CFile::modeRead|CFile::typeBinary))
  92. {
  93. AfxMessageBox("打不开文件!");
  94. return FALSE;
  95. }
  96. //读入BMP文件头信息
  97. BITMAPFILEHEADER bfh;
  98. if(file.Read(&bfh,sizeof(bfh))!=sizeof(bfh))
  99. {
  100. AfxMessageBox("读文件出错!");
  101. return FALSE;
  102. }
  103. //若不是BMP,则不处理
  104. if(bfh.bfType!=0x4d42) //'BM'
  105. {
  106. AfxMessageBox("不是BMP文件!");
  107. return FALSE;
  108. }
  109. //读入位图信息头
  110. BITMAPINFOHEADER bih;
  111. if(file.Read(&bih,sizeof(bih))!=sizeof(bih))
  112. {
  113. AfxMessageBox("读文件出错!");
  114. return FALSE;
  115. }
  116. //不是24位真彩色图像,则不予处理
  117. if(bih.biBitCount!=24)
  118. {
  119. AfxMessageBox("不是24位真彩色图像!");
  120. return FALSE;
  121. }
  122. //为BITMAPINFO结构指针申请内存,由于真彩色位图没有颜色表,
  123. //所以其BITMAPINFO = BITMAPINFOHEADER
  124. m_pBMI=(BITMAPINFO*)new char[sizeof(BITMAPINFOHEADER)];
  125. if(!m_pBMI)
  126. {
  127. AfxMessageBox("分配内存出错!");
  128. return FALSE;
  129. }
  130. //由于前面已将BITMAPINFOHEADER读入了内存,这里只需拷贝一下
  131. memcpy(m_pBMI,&bih,sizeof(BITMAPINFOHEADER));
  132. //为DIB图像数据指针申请内存
  133. DWORD dataBytes=bfh.bfSize-bfh.bfOffBits;//图像数据的字节数
  134. m_pDIBData=(BYTE*)new char[dataBytes];
  135. if(!m_pDIBData)
  136. {
  137. AfxMessageBox("分配内存出错!");
  138. delete m_pBMI;
  139. return FALSE;
  140. }
  141. //读入位图的图像数据
  142. if(file.ReadHuge(m_pDIBData,dataBytes)!=dataBytes)
  143. {
  144. AfxMessageBox("读文件出错!");
  145. delete m_pDIBData;
  146. delete m_pBMI;
  147. return FALSE;
  148. }
  149. file.Close();
  150. return TRUE;
  151. }
  152. void CEx124View::ShowDIB(CDC *pDC, int nLeft, int nTop, int nWidth, int nHeight)
  153. {
  154. pDC->SetStretchBltMode(COLORONCOLOR);//设置伸缩拷贝模式
  155. StretchDIBits(pDC->GetSafeHdc(),
  156. nLeft, //目标矩形左上角X坐标
  157. nTop, //目标矩形左上角Y坐标
  158. nWidth, //目标矩形的宽度
  159. nHeight,//目标矩形的高度
  160. 0,0, //源矩形左上角X、Y坐标
  161. m_pBMI->bmiHeader.biWidth,//源矩形宽度
  162. m_pBMI->bmiHeader.biHeight,//源矩形高度
  163. m_pDIBData, //位图图像数据的地址
  164. m_pBMI, //位图信息结构地址
  165. DIB_RGB_COLORS, //标志选项
  166. SRCCOPY); //光栅操作码
  167. }
  168. void CEx124View::OnFileOpen() 
  169. {
  170. CString filename;
  171. //利用通用对话框打开一个BMP文件
  172. static char szFilter[]="BMP文件(*.bmp)|*.bmp||";
  173. CFileDialog dlg(TRUE,"bmp",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);
  174. if(dlg.DoModal()==IDOK)
  175. {
  176. filename=dlg.GetPathName();//得到选择的文件名
  177. if(!LoadFromFile(filename))//读入DIB文件内容
  178. return;
  179. Invalidate(FALSE);  //刷新窗口显示内容
  180. }
  181. }