DynSplitView2.cpp
Upload User: szkelitina
Upload Date: 2022-05-21
Package Size: 6797k
Code Size: 6k
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. {state2=0;
  16. }
  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();//GetWidth();
  27.      memcpy(CDibNew1->m_pData,CDib1->m_pData,size);//复制原图像到处理区
  28. }
  29. CPalette * CDynSplitView2::CreateBitmapPalette(BianTiDib * 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. //CPalette hPale=&hPalette;
  51. return &hPalette;
  52. }
  53. CDynSplitView2::~CDynSplitView2()
  54. {
  55. }
  56. CDSplitDoc* CDynSplitView2::GetDocument() // non-debug version is inline
  57. {
  58. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDSplitDoc)));
  59. return (CDSplitDoc*)m_pDocument;
  60. }
  61. BEGIN_MESSAGE_MAP(CDynSplitView2, CView)
  62. //{{AFX_MSG_MAP(CDynSplitView2)
  63. ON_WM_ERASEBKGND()
  64. ON_COMMAND(ID_FILESAVE, OnFilesave)
  65. ON_COMMAND(ID_Xihua, OnXihua)
  66. ON_COMMAND(ID_Cuhua, OnCuhua)
  67. ON_COMMAND(ID_Zhongzhoubianhuan, OnZhongzhoubianhuan)
  68. //}}AFX_MSG_MAP
  69. END_MESSAGE_MAP()
  70. /////////////////////////////////////////////////////////////////////////////
  71. // CDynSplitView2 drawing
  72. void CDynSplitView2::OnDraw(CDC* pDC)
  73. {
  74. /* CDSplitDoc* pDoc = GetDocument();
  75. ASSERT_VALID(pDoc);
  76. if(!pDoc ->statedoc&&state2==1)
  77. {
  78.         BYTE* pBitmapData = CDibNew1->GetData();
  79.         LPBITMAPINFO pBitmapInfo = CDibNew1->GetInfo();
  80.         int bitmapHeight = CDibNew1->GetHeight();
  81.         int bitmapWidth = CDibNew1->GetWidth();
  82. if (CDibNew1->GetRGB()) // Has a color table
  83. {
  84. CPalette * hPalette=CreateBitmapPalette(CDibNew1);
  85.             CPalette * hOldPalette =
  86.                 pDC->SelectPalette(hPalette, true);
  87.             pDC->RealizePalette();
  88. ::StretchDIBits(pDC->GetSafeHdc(),0, 0, bitmapWidth, bitmapHeight,
  89.                0, 0, bitmapWidth, bitmapHeight,
  90. pBitmapData, pBitmapInfo,
  91. DIB_RGB_COLORS, SRCCOPY);
  92.             pDC->SelectPalette(hOldPalette, true);
  93.             ::DeleteObject(hPalette);
  94. }
  95. }*/
  96. CDSplitDoc* pDoc = GetDocument();
  97. ASSERT_VALID(pDoc);
  98. if(!pDoc ->statedoc&&state2==1)
  99. {
  100. int m_scale=1;
  101.         BYTE* pBitmapData = CDibNew1->GetData();
  102.         LPBITMAPINFO pBitmapInfo = CDibNew1->GetInfo();
  103.         int bitmapHeight = CDibNew1->GetHeight();
  104.         int bitmapWidth = CDibNew1->GetWidth();
  105. int scaledWidth = (int)(bitmapWidth * m_scale);
  106. int scaledHeight = (int)(bitmapHeight * m_scale);
  107. if (CDibNew1->GetRGB()) // Has a color table
  108. {
  109. CPalette * hPalette=CreateBitmapPalette(CDibNew1);
  110.             CPalette * hOldPalette =
  111.                 pDC->SelectPalette(hPalette, true);
  112.             pDC->RealizePalette();
  113. ::StretchDIBits(pDC->GetSafeHdc(),0, 0, bitmapWidth, bitmapHeight,
  114.                0, 0, bitmapWidth, bitmapHeight,
  115. pBitmapData, pBitmapInfo,
  116. DIB_RGB_COLORS, SRCCOPY);
  117.             pDC->SelectPalette(hOldPalette, true);
  118.             ::DeleteObject(hPalette);
  119. }
  120. else
  121. {
  122.             StretchDIBits(pDC->GetSafeHdc(),
  123.                 0, 0, scaledWidth, scaledHeight,
  124.                 0, 0, bitmapWidth, bitmapHeight,
  125. pBitmapData, pBitmapInfo,
  126. DIB_RGB_COLORS, SRCCOPY);
  127. }
  128. }
  129. }
  130. /////////////////////////////////////////////////////////////////////////////
  131. // CDynSplitView2 diagnostics
  132. #ifdef _DEBUG
  133. void CDynSplitView2::AssertValid() const
  134. {
  135. CView::AssertValid();
  136. }
  137. void CDynSplitView2::Dump(CDumpContext& dc) const
  138. {
  139. CView::Dump(dc);
  140. }
  141. #endif //_DEBUG
  142. /////////////////////////////////////////////////////////////////////////////
  143. // CDynSplitView2 message handlers
  144. BOOL CDynSplitView2::OnEraseBkgnd(CDC* pDC) 
  145. {
  146. CRect rect;
  147. GetClientRect(&rect);
  148. pDC->FillSolidRect(&rect,::GetSysColor(COLOR_WINDOW));
  149. return TRUE;
  150. }
  151.  
  152. void CDynSplitView2::OnFilesave() 
  153. {
  154. // TODO: Add your command handler code here
  155. CFileDialog dlg(FALSE,_T("BMP"),_T("*.BMP"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("位图文件(*.BMP)|*.BMP|"));
  156.     if(IDOK==dlg.DoModal())
  157. CString  filename;
  158.     filename.Format ("%s",dlg.GetPathName() );    
  159.     CDibNew1->SaveFile(filename);
  160. state2=1;
  161. Invalidate();
  162. }
  163. /*细化消息映射*/
  164. void CDynSplitView2::OnXihua() 
  165. {
  166. // TODO: Add your command handler code here
  167. clearmem();
  168. CDibNew1->Xihua();             //调用细化处理函数
  169.   Invalidate();
  170. }
  171. /*粗化消息映射*/
  172. void CDynSplitView2::OnCuhua() 
  173. {
  174. // TODO: Add your command handler code here
  175. clearmem();
  176. CDibNew1->Cuhua();             //调用粗化处理函数
  177.   Invalidate();
  178. }
  179. /*中轴变换消息映射*/
  180. void CDynSplitView2::OnZhongzhoubianhuan() 
  181. {
  182. // TODO: Add your command handler code here
  183. clearmem();
  184. CDibNew1->Zhongzhoubianhuan();             //调用中轴变换处理函数
  185.   Invalidate();
  186. }