BmpFieldDlg.cpp
上传用户:lqt88888
上传日期:2009-12-14
资源大小:905k
文件大小:6k
源码类别:

书籍源码

开发平台:

Visual C++

  1. // BmpFieldDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "BmpField.h"
  5. #include "BmpFieldDlg.h"
  6. #include "ImageData.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CAboutDlg dialog used for App About
  14. class CAboutDlg : public CDialog
  15. {
  16. public:
  17. CAboutDlg();
  18. // Dialog Data
  19. //{{AFX_DATA(CAboutDlg)
  20. enum { IDD = IDD_ABOUTBOX };
  21. //}}AFX_DATA
  22. // ClassWizard generated virtual function overrides
  23. //{{AFX_VIRTUAL(CAboutDlg)
  24. protected:
  25. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  26. //}}AFX_VIRTUAL
  27. // Implementation
  28. protected:
  29. //{{AFX_MSG(CAboutDlg)
  30. //}}AFX_MSG
  31. DECLARE_MESSAGE_MAP()
  32. };
  33. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  34. {
  35. //{{AFX_DATA_INIT(CAboutDlg)
  36. //}}AFX_DATA_INIT
  37. }
  38. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  39. {
  40. CDialog::DoDataExchange(pDX);
  41. //{{AFX_DATA_MAP(CAboutDlg)
  42. //}}AFX_DATA_MAP
  43. }
  44. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  45. //{{AFX_MSG_MAP(CAboutDlg)
  46. // No message handlers
  47. //}}AFX_MSG_MAP
  48. END_MESSAGE_MAP()
  49. /////////////////////////////////////////////////////////////////////////////
  50. // CBmpFieldDlg dialog
  51. CBmpFieldDlg::CBmpFieldDlg(CWnd* pParent /*=NULL*/)
  52. : CDialog(CBmpFieldDlg::IDD, pParent)
  53. {
  54. //{{AFX_DATA_INIT(CBmpFieldDlg)
  55. // NOTE: the ClassWizard will add member initialization here
  56. //}}AFX_DATA_INIT
  57. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  58. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  59. }
  60. void CBmpFieldDlg::DoDataExchange(CDataExchange* pDX)
  61. {
  62. CDialog::DoDataExchange(pDX);
  63. //{{AFX_DATA_MAP(CBmpFieldDlg)
  64. // NOTE: the ClassWizard will add DDX and DDV calls here
  65. //}}AFX_DATA_MAP
  66. }
  67. BEGIN_MESSAGE_MAP(CBmpFieldDlg, CDialog)
  68. //{{AFX_MSG_MAP(CBmpFieldDlg)
  69. ON_WM_SYSCOMMAND()
  70. ON_WM_PAINT()
  71. ON_WM_QUERYDRAGICON()
  72. ON_BN_CLICKED(IDC_LOADIMAG, OnLoadimag)
  73. //}}AFX_MSG_MAP
  74. END_MESSAGE_MAP()
  75. /////////////////////////////////////////////////////////////////////////////
  76. // CBmpFieldDlg message handlers
  77. BOOL CBmpFieldDlg::OnInitDialog()
  78. {
  79. CDialog::OnInitDialog();
  80. // Add "About..." menu item to system menu.
  81. // IDM_ABOUTBOX must be in the system command range.
  82. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  83. ASSERT(IDM_ABOUTBOX < 0xF000);
  84. CMenu* pSysMenu = GetSystemMenu(FALSE);
  85. if (pSysMenu != NULL)
  86. {
  87. CString strAboutMenu;
  88. strAboutMenu.LoadString(IDS_ABOUTBOX);
  89. if (!strAboutMenu.IsEmpty())
  90. {
  91. pSysMenu->AppendMenu(MF_SEPARATOR);
  92. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  93. }
  94. }
  95. // Set the icon for this dialog.  The framework does this automatically
  96. //  when the application's main window is not a dialog
  97. SetIcon(m_hIcon, TRUE); // Set big icon
  98. SetIcon(m_hIcon, FALSE); // Set small icon
  99. // TODO: Add extra initialization here
  100. return TRUE;  // return TRUE  unless you set the focus to a control
  101. }
  102. void CBmpFieldDlg::OnSysCommand(UINT nID, LPARAM lParam)
  103. {
  104. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  105. {
  106. CAboutDlg dlgAbout;
  107. dlgAbout.DoModal();
  108. }
  109. else
  110. {
  111. CDialog::OnSysCommand(nID, lParam);
  112. }
  113. }
  114. // If you add a minimize button to your dialog, you will need the code below
  115. //  to draw the icon.  For MFC applications using the document/view model,
  116. //  this is automatically done for you by the framework.
  117. //显示位图
  118. void CBmpFieldDlg::OnPaint() 
  119. {
  120. //获得DC
  121. CPaintDC dc(this);
  122. if (!(OleBmp.m_hObject == NULL))
  123. {
  124. //创建内存设备场景
  125. CDC dcMem; 
  126. dcMem.CreateCompatibleDC( &dc ); 
  127. CBitmap*  pbmpOld ;
  128. BITMAP  BmpSize ; 
  129. OleBmp.GetBitmap(&BmpSize); //get Image Size
  130. pbmpOld = dcMem.SelectObject(&OleBmp);
  131. //显示位图
  132. dc.StretchBlt( 5, 5, 150, 200, &dcMem, 0, 0, BmpSize.bmWidth, BmpSize.bmHeight, SRCCOPY);
  133. dcMem.SelectObject( pbmpOld );
  134. }
  135. }
  136. // The system calls this to obtain the cursor to display while the user drags
  137. //  the minimized window.
  138. HCURSOR CBmpFieldDlg::OnQueryDragIcon()
  139. {
  140. return (HCURSOR) m_hIcon;
  141. }
  142. //读位图数据,并创建位图
  143. BOOL CBmpFieldDlg::ReadFromBLOB(CByteArray & DBArray)
  144. {
  145. CByteArray Array;
  146. Array.Copy( DBArray); 
  147. //获得位图文件头信息长度
  148. int HeaderLen =   78 + sizeof(BITMAPFILEHEADER); 
  149. Array.RemoveAt( 0, HeaderLen ); // I cut all Headers 
  150.     
  151. //获得位图信息  
  152. BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)
  153. Array.GetData() ;
  154.     BITMAPINFO &bmInfo = *(LPBITMAPINFO)Array.GetData() ;
  155. //获得位图颜色数
  156.     int nColors = bmiHeader.biClrUsed ?
  157. bmiHeader.biClrUsed : 1 << bmiHeader.biBitCount;
  158. //获得位图数据
  159.     LPVOID lpDIBBits;
  160.     if( bmInfo.bmiHeader.biBitCount > 8 )
  161.        lpDIBBits = (LPVOID)((LPDWORD)(bmInfo.bmiColors 
  162.    + bmInfo.bmiHeader.biClrUsed) + 
  163.        ((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ?
  164.    3 : 0));
  165.      else
  166.         lpDIBBits = (LPVOID)(bmInfo.bmiColors + nColors);
  167.      CClientDC dc(NULL);
  168.  //创建位图
  169.  HBITMAP hBmp = CreateDIBitmap( dc.m_hDC,   
  170.                     &bmiHeader,     
  171.                                 CBM_INIT,       
  172.                                 lpDIBBits,      
  173.                                 &bmInfo,        
  174.                                 DIB_RGB_COLORS);
  175.      
  176. OleBmp.Attach( hBmp );
  177. //清除临时数组
  178. Array.RemoveAll();
  179. return TRUE;
  180. }
  181. //获得位图数据
  182. void CBmpFieldDlg::OnLoadimag() 
  183. {
  184. //打开数据库
  185. CImageData db;
  186. db.Open();
  187. ReadFromBLOB(db.m_Images);
  188. //显示位图
  189. Invalidate();
  190. //关闭数据库
  191. db.Close();
  192. }