www.gusucode.com > ADO智能开发包C++源码程序 > ADO智能开发包/sfxdb_src_1.0.510.1/sfx/Source/db/src/DBImage.cpp
// DBImage.cpp : implementation file // #include "stdafx.h" #include "DBImage.h" #include <windowsx.h> #include "FileDialogEx.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // DBImage CDBImage::CDBImage(): m_pPicture(NULL), m_bShow(true) { m_pPicture = new CPicture(); m_pWnd = this; } CDBImage::~CDBImage() { if (NULL!=m_pPicture) delete m_pPicture; } VOID CDBImage::Clear() { VERIFY(m_pPicture->LoadPictureData(0, 0)); } VOID CDBImage::virDataChange() { //_variant_t _varField; //long nSize = 0; //_variant_t varBLOB; //try //{ // ASSERT(m_pRecordSet); // if ((NULL!=m_pRecordSet) && m_pRecordSet->IsOpen()) // { // if (m_pRecordSet->IsRecord(m_pRecordSet->GetAbsolutePosition())) // { // ADO::FieldsPtr _FieldsPtr = m_pRecordSet->GetFields(); // _varField = (LPCTSTR)m_strFieldName; // FieldPtr _FieldPtr = _FieldsPtr->GetItem(_varField); //m_pRecordSet->GetField(m_strFieldName); // TRACE(_T("----载入图像字段名:%s, 大小:%d, 记录号:%d\n"), // m_strFieldName, nSize, m_pRecordSet->GetAbsolutePosition()); // nSize = _FieldPtr->GetActualSize(); // if (nSize > 0) // { // varBLOB = _FieldPtr->GetChunk(nSize); // if (varBLOB.vt == (VT_ARRAY | VT_UI1)) // { // if (BYTE *pBuffer = new BYTE [nSize+1]) ///重新申请必要的存储空间 // { // char *pBuf = NULL; // SafeArrayAccessData(varBLOB.parray, (void**)&pBuf); // memcpy(pBuffer, pBuf, nSize); ///复制数据到缓冲区m_pBMPBuffer // SafeArrayUnaccessData (varBLOB.parray); // m_pPicture->LoadPictureData(pBuffer, nSize); // delete [] pBuffer; // pBuf=0; // m_bShow = TRUE; // InvalidateRect(NULL, TRUE); // return; // } // } // }else // { // VERIFY(m_pPicture->LoadPictureData(0, 0)); // } // } // } // m_bShow = FALSE; //} //catch(_com_error e) //{ // adoShowComError(m_hWnd, e); // VERIFY(m_pPicture->LoadPictureData(0, 0)); //} //InvalidateRect(NULL, TRUE); ASSERT(NULL != m_hWnd); try { m_Size = m_pRecordSet->GetFieldActualSize(m_strFieldName); if (m_bShow) { m_pPicture->LoadPictureData(0, 0); if (m_Size>0) { BYTE *lpszData = new BYTE[m_Size+1]; m_pRecordSet->GetChunk(m_strFieldName, lpszData); m_pPicture->LoadPictureData(lpszData, m_Size); delete []lpszData; } } InvalidateRect(NULL, TRUE); } catch (_com_error e) { adoShowComError(m_hWnd, e); } } void CDBImage::SetPictureShow(bool bShow) { if (m_bShow != bShow) { m_bShow = bShow; if (m_bShow) { virDataChange(); } } } LRESULT CDBImage::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_PAINT: { if (NULL != m_pPicture) { CPaintDC dc(this); ASSERT(NULL != m_pPicture); RECT Rect; ::GetClientRect(m_hWnd, &Rect); SelectObject(dc.m_hDC, GetStockObject(WHITE_BRUSH)); dc.Rectangle(&Rect); if (m_Size>0) { if (m_bShow) { m_pPicture->UpdateSizeOnDC(&dc); // Get Picture Dimentions In Pixels m_pPicture->Show(&dc, CRect(0, 0, m_pPicture->m_Width, m_pPicture->m_Height) ); }else { dc.TextOut(5, 10, _T("Image")); } } return TRUE; } }break; case WM_RBUTTONUP: case WM_CONTEXTMENU: { CPoint pt;//(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); GetCursorPos(&pt); OnContextMenu(this, pt); }break; } return CWnd::WindowProc(message, wParam, lParam); } VOID CDBImage::virDataWrite() { //if (GetAdoRecordset()->AppendChunk(GetField()->GetFieldPtr(), m_FileName)) //{ // m_pRecordSet->SetEditChange(true); // virDataChange(); //} } BOOL CDBImage::DoFileDialog(HWND hWnd, CString &outFileName) { CFileDialogEx dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, _T("JPG Files (*.jpg)|*.jpg|BMP File (*.bmp)|*.bmp||"), this); if (dlg.DoModal() == IDOK) { outFileName = dlg.GetPathName(); return TRUE; } return FALSE; } #define IDM_LOAD 100 #define IDM_CLEAR 101 #define IDM_SAVEAS 102 void CDBImage::OnContextMenu(CWnd* pWnd, CPoint pos) { HMENU _PopupMenu = CreatePopupMenu(); int _ComID = 0; ASSERT(_PopupMenu); if (NULL!=_PopupMenu) { AppendMenu(_PopupMenu, MF_STRING, IDM_LOAD, _T("载入新的图型(&I)...")); AppendMenu(_PopupMenu, MF_STRING, IDM_CLEAR, _T("清空图像(&C)...")); AppendMenu(_PopupMenu, MF_SEPARATOR, 0, _T("")); AppendMenu(_PopupMenu, MF_STRING, IDM_CLEAR, _T("保存为(&A)...")); _ComID = TrackPopupMenu(_PopupMenu, TPM_LEFTALIGN|TPM_RETURNCMD, pos.x, pos.y, NULL, m_hWnd, NULL); switch(_ComID) { case IDM_LOAD: { CString m_FileName; if (DoFileDialog(m_hWnd, m_FileName)) { if (GetAdoRecordset()->AppendChunk(m_strFieldName, m_FileName)) { GetAdoRecordset()->GetAdoRecordset()->Update(); m_pRecordSet->SetEditChange(true); virDataChange(); } } }break; case IDM_CLEAR: { if (m_pRecordSet->AppendChunk((LPCTSTR)m_strFieldName, 0, 0)) { m_pRecordSet->SetEditChange(true); virDataChange(); } }break; case IDM_SAVEAS: { MessageBox(_T("不支持这个功能")); }break; } DestroyMenu(_PopupMenu); } }