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);
	}
}