PreviewDlg.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:5k
源码类别:

图形图象

开发平台:

Visual C++

  1. // PreviewDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "flt_steff.h"
  5. #include "PreviewDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CPreviewDlg dialog
  13. CPreviewDlg::CPreviewDlg(CWnd* pParent /*=NULL*/)
  14. : CDialog(CPreviewDlg::IDD, pParent)
  15. {
  16. //{{AFX_DATA_INIT(CPreviewDlg)
  17. m_iMosaic_Unit = 8;
  18. //}}AFX_DATA_INIT
  19. }
  20. void CPreviewDlg::DoDataExchange(CDataExchange* pDX)
  21. {
  22. CDialog::DoDataExchange(pDX);
  23. //{{AFX_DATA_MAP(CPreviewDlg)
  24. DDX_Control(pDX, IDC_MOSIC_UNIT, m_tracebar);
  25. DDX_Text(pDX, IDC_EDIT_MOSAIC_UNIT, m_iMosaic_Unit);
  26. //}}AFX_DATA_MAP
  27. }
  28. BEGIN_MESSAGE_MAP(CPreviewDlg, CDialog)
  29. //{{AFX_MSG_MAP(CPreviewDlg)
  30. ON_WM_VSCROLL()
  31. ON_WM_PAINT()
  32. //}}AFX_MSG_MAP
  33. END_MESSAGE_MAP()
  34. /////////////////////////////////////////////////////////////////////////////
  35. // CPreviewDlg message handlers
  36. BOOL CPreviewDlg::OnInitDialog() 
  37. {
  38. CDialog::OnInitDialog();
  39. // To get the zoom of the image
  40. CStatic *pStatic = (CStatic*)GetDlgItem( IDC_PREVIEW_WINDOW );
  41. m_zoom = 1.0;
  42. CRect rect;
  43. pStatic->GetClientRect(&rect);
  44. rect.right -= 8;
  45. rect.bottom -= 8; // YZ add 2000-11-22
  46. float fXzoom, fYzoom;
  47. fXzoom= (rect.right-rect.left+1)/(float)m_lpInfo->dImageInfo.width;
  48. fYzoom= (rect.bottom-rect.top+1)/(float)m_lpInfo->dImageInfo.height;
  49. if(fXzoom<1.0 || fYzoom<1.0)
  50. m_zoom = fXzoom<fYzoom ? fXzoom : fYzoom;
  51. m_Ox = (rect.right-rect.left+1)/2 - (int)(m_lpInfo->dImageInfo.width * m_zoom)/2;
  52. m_Oy = (rect.bottom-rect.top+1)/2 - (int)(m_lpInfo->dImageInfo.height * m_zoom)/2;
  53. m_Ox += 2;
  54. m_Oy += 2; // YZ YZ add 2000-11-22
  55. m_Preview_width = (int)(m_lpInfo->dImageInfo.width * m_zoom);
  56. m_Preview_height= (int)(m_lpInfo->dImageInfo.height * m_zoom);
  57.                      
  58. m_tracebar.SetRange(2,32,TRUE);
  59. m_tracebar.SetTicFreq(2);
  60. m_tracebar.SetLineSize(1);
  61. m_tracebar.SetPageSize(2);
  62. m_tracebar.SetTic(8);
  63. m_tracebar.SetPos(m_iMosaic_Unit);
  64. // TODO: Add extra initialization here
  65. hdd = DrawDibOpen();
  66. return TRUE;  // return TRUE unless you set the focus to a control
  67.               // EXCEPTION: OCX Property Pages should return FALSE
  68. }
  69. void CPreviewDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
  70. {
  71. // TODO: Add your message handler code here and/or call default
  72. CSliderCtrl* slider=(CSliderCtrl*)pScrollBar;
  73. int position=slider->GetPos();
  74. m_iMosaic_Unit=position;
  75. // Record Mosaic unit for furture use
  76. m_lpInfo->annexdata.siAnnData[1]= m_iMosaic_Unit;
  77. if (m_pRect == NULL)
  78.  _fnSPE_MOSAIC(m_lpInfo, m_iMosaic_Unit);
  79. else
  80. _fnSPE_MOSAIC(m_lpInfo,m_iMosaic_Unit, m_pRect);
  81. UpdateData(FALSE);
  82. // display bitmap into preview control
  83. //CStatic *pStatic = (CStatic*)GetDlgItem( IDC_PREVIEW_WINDOW );
  84. //pStatic->Invalidate(FALSE);
  85. //slider->Invalidate(FALSE);
  86. Invalidate(FALSE);
  87. CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
  88. }
  89. void CPreviewDlg::OnPaint() 
  90. {
  91. CPaintDC dc(this); // device context for painting
  92. // Show image in preview window
  93. CStatic *pStatic = (CStatic*)GetDlgItem( IDC_PREVIEW_WINDOW );
  94. /*********************Drawlib****************************/
  95. // Use Drawlib to display image 
  96. HWND hWnd = pStatic->m_hWnd;
  97. HDC hDC = ::GetDC(hWnd);
  98.     UINT wFlags;
  99.     //wFlags = DDF_DONTDRAW;
  100.     wFlags = DDF_NOTKEYFRAME;
  101.     if (hdd != NULL) 
  102.     { 
  103. DrawDibDraw(hdd,
  104. hDC,
  105. m_Ox,
  106. m_Oy,
  107. m_Preview_width ,
  108. m_Preview_height,
  109. (LPBITMAPINFOHEADER)m_lpbi,
  110. m_lpInfo->_pdbdata,
  111. 0,
  112. 0,
  113. m_lpInfo->dImageInfo.width-1,
  114. m_lpInfo->dImageInfo.height-1,
  115. wFlags);
  116.     }
  117. /*********************Drawlib****************************/
  118. // Do not call CDialog::OnPaint() for painting messages
  119. }
  120. /********* Transmit image process packet into dlg class*******/
  121. void CPreviewDlg::SendPreviewImage(LPIMAGEPROCSTR lpInfo)
  122. {
  123. m_lpInfo=lpInfo;
  124. // Set bi value
  125. HWND hWnd = ::GetDesktopWindow();
  126. HDC hDC = ::GetDC(hWnd);
  127. bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  128. bi.bmiHeader.biPlanes = 1;
  129. bi.bmiHeader.biBitCount = m_lpInfo->sImageInfo.bitperpix;
  130. bi.bmiHeader.biCompression = BI_RGB;
  131. bi.bmiHeader.biSizeImage = 0;
  132. bi.bmiHeader.biWidth = m_lpInfo->dImageInfo.width;
  133. bi.bmiHeader.biHeight =  m_lpInfo->dImageInfo.height;
  134. bi.bmiHeader.biClrImportant = 0;
  135. bi.bmiHeader.biClrUsed = 0;
  136. bi.bmiHeader.biXPelsPerMeter = (int)(::GetDeviceCaps(hDC,LOGPIXELSX)*(float)39.373);
  137. bi.bmiHeader.biYPelsPerMeter = (int)(::GetDeviceCaps(hDC,LOGPIXELSY)*(float)39.373);
  138. m_lpbi = (LPBITMAPINFO)&bi;
  139. m_pRect = new CRect;
  140. if (lpInfo->annexdata.siAnnData[0]==0)
  141. {
  142. _fnSPE_MOSAIC(lpInfo, m_iMosaic_Unit);
  143. }
  144. else
  145. {
  146. m_pRect->left=lpInfo->annexdata.siAnnData[2];
  147. m_pRect->top=lpInfo->annexdata.siAnnData[3];
  148. m_pRect->right=lpInfo->annexdata.siAnnData[4];
  149. m_pRect->bottom=lpInfo->annexdata.siAnnData[5];
  150. _fnSPE_MOSAIC(lpInfo,m_iMosaic_Unit, m_pRect);
  151. }
  152. delete m_pRect;
  153. m_pRect = NULL;
  154. // Record Mosaic unit for furture use
  155. lpInfo->annexdata.siAnnData[1]= m_iMosaic_Unit;
  156. }
  157. void CPreviewDlg::OnOK() 
  158. {
  159. if (hdd)
  160. DrawDibClose(hdd);
  161. CDialog::OnOK();
  162. }
  163. void CPreviewDlg::OnCancel() 
  164. {
  165. if (hdd)
  166. DrawDibClose(hdd);
  167. CDialog::OnCancel();
  168. }