DynSplitView2.cpp
Upload User: szkelitina
Upload Date: 2022-05-21
Package Size: 6797k
Code Size: 5k
Category:

Special Effects

Development Platform:

Visual C++

  1. // DynSplitView2.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "DSplit.h"
  5. #include "DynSplitView2.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CDynSplitView2
  13. IMPLEMENT_DYNCREATE(CDynSplitView2, CView)
  14. CDynSplitView2::CDynSplitView2()
  15. {
  16. state2=0;
  17. }
  18. void CDynSplitView2::clearmem()
  19. {
  20. CDSplitDoc* pDoc = GetDocument();
  21. ASSERT_VALID(pDoc);
  22. pDoc->statedoc=0;
  23.     state2=1;
  24. CDibNew1=&pDoc->CDibNew;
  25.     CDib1=&pDoc->CDib;
  26. long int  size=CDib1->GetHeight()*CDib1->GetDibWidthBytes();
  27. memcpy(CDibNew1->m_pData,CDib1->m_pData,size);
  28. }
  29. CPalette * CDynSplitView2::CreateBitmapPalette(BianYuanJianCeDib * pBitmap)
  30. {
  31. struct
  32. {
  33. WORD Version;
  34. WORD NumberOfEntries;
  35. PALETTEENTRY aEntries[256];
  36. } palette = { 0x300, 256 };
  37. LPRGBQUAD pRGBTable = pBitmap->GetRGB();
  38. UINT numberOfColors = pBitmap->GetNumberOfColors();
  39. for(UINT x=0; x<numberOfColors; ++x)
  40. {
  41. palette.aEntries[x].peRed =
  42. pRGBTable[x].rgbRed;
  43. palette.aEntries[x].peGreen =
  44. pRGBTable[x].rgbGreen;
  45. palette.aEntries[x].peBlue =
  46. pRGBTable[x].rgbBlue;
  47. palette.aEntries[x].peFlags = 0;
  48. }
  49. hPalette.CreatePalette((LPLOGPALETTE)&palette);
  50. return &hPalette;
  51. }
  52. CDynSplitView2::~CDynSplitView2()
  53. {
  54. }
  55. CDSplitDoc* CDynSplitView2::GetDocument() // non-debug version is inline
  56. {
  57. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDSplitDoc)));
  58. return (CDSplitDoc*)m_pDocument;
  59. }
  60. BEGIN_MESSAGE_MAP(CDynSplitView2, CView)
  61. //{{AFX_MSG_MAP(CDynSplitView2)
  62. ON_WM_ERASEBKGND()
  63. ON_COMMAND(ID_FILESAVE, OnFilesave)
  64. ON_COMMAND(ID_Robert, OnRobert)
  65. ON_COMMAND(ID_Guasslaplacian, OnGuasslaplacian)
  66. ON_COMMAND(ID_Krisch, OnKrisch)
  67. ON_COMMAND(ID_Laplacian, OnLaplacian)
  68. ON_COMMAND(ID_Prewitt, OnPrewitt)
  69. ON_COMMAND(ID_Sobel, OnSobel)
  70. //}}AFX_MSG_MAP
  71. END_MESSAGE_MAP()
  72. /////////////////////////////////////////////////////////////////////////////
  73. // CDynSplitView2 drawing
  74. void CDynSplitView2::OnDraw(CDC* pDC)
  75. {
  76. CDSplitDoc* pDoc = GetDocument();
  77. ASSERT_VALID(pDoc);
  78. if(!pDoc ->statedoc&&state2==1)
  79. {
  80.         BYTE* pBitmapData = CDibNew1->GetData();
  81.         LPBITMAPINFO pBitmapInfo = CDibNew1->GetInfo();
  82.         int bitmapHeight = CDibNew1->GetHeight();
  83.         int bitmapWidth = CDibNew1->GetWidth();
  84. if (CDibNew1->GetRGB()) // Has a color table
  85. {
  86. CPalette * hPalette=CreateBitmapPalette(CDibNew1);
  87.             CPalette * hOldPalette =
  88.                 pDC->SelectPalette(hPalette, true);
  89.             pDC->RealizePalette();
  90. ::StretchDIBits(pDC->GetSafeHdc(),0, 0, bitmapWidth, bitmapHeight,
  91. 0, 0, bitmapWidth, bitmapHeight,
  92. pBitmapData, pBitmapInfo,
  93. DIB_RGB_COLORS, SRCCOPY);
  94.             pDC->SelectPalette(hOldPalette, true);
  95.             ::DeleteObject(hPalette);
  96. }
  97. else
  98. {
  99.             StretchDIBits(pDC->GetSafeHdc(),
  100.                 0, 0, bitmapWidth, bitmapHeight,
  101.                 0, 0, bitmapWidth, bitmapHeight,
  102. pBitmapData, pBitmapInfo,
  103. DIB_RGB_COLORS, SRCCOPY);
  104. }
  105. }
  106. }
  107. /////////////////////////////////////////////////////////////////////////////
  108. // CDynSplitView2 diagnostics
  109. #ifdef _DEBUG
  110. void CDynSplitView2::AssertValid() const
  111. {
  112. CView::AssertValid();
  113. }
  114. void CDynSplitView2::Dump(CDumpContext& dc) const
  115. {
  116. CView::Dump(dc);
  117. }
  118. #endif //_DEBUG
  119. /////////////////////////////////////////////////////////////////////////////
  120. // CDynSplitView2 message handlers
  121. BOOL CDynSplitView2::OnEraseBkgnd(CDC* pDC) 
  122. {
  123. CRect rect;
  124. GetClientRect(&rect);
  125. pDC->FillSolidRect(&rect,::GetSysColor(COLOR_WINDOW));
  126. return TRUE;
  127. }
  128. void CDynSplitView2::OnFilesave() 
  129. {
  130. CFileDialog dlg(FALSE,_T("BMP"),_T("*.BMP"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("位图文件(*.BMP)|*.BMP|"));
  131.     if(IDOK==dlg.DoModal())
  132. CString  filename;
  133.     filename.Format ("%s",dlg.GetPathName() );    
  134.     CDibNew1->SaveFile(filename);
  135. state2=1;
  136. Invalidate();
  137. }
  138. /*罗伯特算子消息映射*/
  139. void CDynSplitView2::OnRobert() 
  140. {
  141. clearmem();
  142. CDibNew1->Robert();             //调用Robert算子检测处理函数
  143.   Invalidate();
  144. }
  145. /*高斯拉普拉斯算子消息映射*/
  146. void CDynSplitView2::OnGuasslaplacian() 
  147. {
  148. clearmem();
  149. CDibNew1->Guasslaplacian();             //调用Guasslaplacian算子检测处理函数
  150.   Invalidate(); 
  151. }
  152. /*克瑞斯算子消息映射*/
  153. void CDynSplitView2::OnKrisch() 
  154. {
  155. clearmem();
  156. CDibNew1->Krisch();             //调用Krisch算子检测处理函数
  157.   Invalidate();
  158. }
  159. /*拉普拉斯算子消息映射*/
  160. void CDynSplitView2::OnLaplacian() 
  161. {
  162. clearmem();
  163. CDibNew1->Laplacian();             //调用Laplacian算子检测处理函数
  164.   Invalidate();
  165. }
  166. /*普瑞维特算子消息映射*/
  167. void CDynSplitView2::OnPrewitt() 
  168. {
  169. clearmem();
  170. CDibNew1->PreWitt();             //调用Prewitt算子检测处理函数
  171.   Invalidate();
  172. }
  173. /*索伯尔算子消息映射*/
  174. void CDynSplitView2::OnSobel() 
  175. {
  176. clearmem();
  177. CDibNew1->Sobel();             //调用Sobel算子检测处理函数
  178.   Invalidate();
  179. }