www.gusucode.com > ADO智能开发包C++源码程序 > ADO智能开发包/sfxdb_src_1.0.510.1/sfx/Source/db/src/dbStd.cpp

    #include "stdafx.h"
#include "dbstd.h"

//////////////////////////////////////////////////////////////////////////
//CDbEdit
IMPLEMENT_DYNAMIC(CDBEdit, CEdit)
CDBEdit::CDBEdit()
{
	m_pWnd = this;
}
CDBEdit::~CDBEdit()
{
}

BEGIN_MESSAGE_MAP(CDBEdit, CEdit)
	//ON_WM_DESTROY()
END_MESSAGE_MAP()


LRESULT CDBEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	// TODO: Add your specialized code here and/or call the base class
	CDBBaseControl::_WinMessage(message, wParam, lParam);
	return CEdit::WindowProc(message, wParam, lParam);
}

//////////////////////////////////////////////////////////////////////////
//
IMPLEMENT_DYNAMIC(CDBStatic, CStatic)
CDBStatic::CDBStatic()
{
	m_pWnd = this;
}

BEGIN_MESSAGE_MAP(CDBStatic, CStatic)
END_MESSAGE_MAP()
//
//void CDBStatic::virDataChange()
//{
//	TRACE(_T("----CDBStatic::virDataChange()\n"));
//
//	try
//	{
//		SetWindowText(m_Field.GetValue());
//	}
//	catch (_com_error &e)
//	{
//		adoShowComError(m_hWnd, e);
//		TRACE(_T("----CDBStatic::virDataChange()出现错误!\n"));
//	}
//}


LRESULT CDBStatic::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	// TODO: Add your specialized code here and/or call the base class
	CDBBaseControl::_WinMessage(message, wParam, lParam);

	return CStatic::WindowProc(message, wParam, lParam);
}

//////////////////////////////////////////////////////////////////////////
//
IMPLEMENT_DYNAMIC(CDBComboBox, CComboBox)

CDBComboBox::CDBComboBox()
{
	m_pWnd = this;
}

BEGIN_MESSAGE_MAP(CDBComboBox, CComboBox)
END_MESSAGE_MAP()

//void CDBComboBox::virDataChange()
//{
//	try
//	{
//		SetWindowText(m_Field.GetValue());
//	}
//	catch (_com_error &e)
//	{
//		adoShowComError(m_hWnd, e);
//		TRACE(_T("----CDBStatic::virDataChange()出现错误!\n"));
//	}
//}


#define _SFX_ID_LISTBOX 1000
#define _SFX_ID_EDIT	1001

LRESULT CDBComboBox::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	if (WM_COMMAND == message)
	{
		if (_SFX_ID_LISTBOX==LOWORD(wParam))
		{
			if (1==HIWORD(wParam))
			{
				m_pRecordSet->SetEditChange(true);
			}
		}else if(_SFX_ID_EDIT==LOWORD(wParam))
		{
			if (EN_CHANGE==HIWORD(wParam))
			{
				m_pRecordSet->SetEditChange(true);
			}
		}
		//return FALSE;
	}
	CDBBaseControl::_WinMessage(message, wParam, lParam);
	return CComboBox::WindowProc(message, wParam, lParam);
}


WNDPROC pOldEditProc = NULL;
LRESULT Edit_Proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message)
	{
	case WM_KEYDOWN:
	case WM_CUT:
	case WM_PASTE:
	case WM_UNDO:
	case WM_KILLFOCUS:
	case WM_SETFOCUS:
	case WM_CHAR:
		PostMessage(GetParent(hWnd), message, 0, 0);
		break;
	}
	LRESULT hRel = ::CallWindowProc(pOldEditProc, hWnd, message, wParam, lParam);
	return hRel;
}


//////////////////////////////////////////////////////////////////////////
//
IMPLEMENT_DYNAMIC(CDBCheckBox, CButton)

BEGIN_MESSAGE_MAP(CDBCheckBox, CButton)
	ON_WM_LBUTTONUP()
END_MESSAGE_MAP()

CDBCheckBox::CDBCheckBox()
{
	//m_ValueChecked = _T("True");
	//m_ValueUnchecked = _T("False");
	m_pWnd = this;
}


LRESULT CDBCheckBox::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	CDBBaseControl::_WinMessage(message, wParam, lParam);
	return CButton::WindowProc(message, wParam, lParam);
}


void CDBCheckBox::virDataChange()
{
	ASSERT(NULL != m_pWnd);
	HWND hWndParent = ::GetParent(m_hWnd);
	int m_bValue;
	if (NULL != hWndParent)
	{
		if (ADO::adBoolean == m_Field.GetType())
		{
			if (m_Field.GetValue(m_bValue))
			{
				if (FALSE == m_bValue)
				{
					::CheckDlgButton(hWndParent, GetWindowLong(m_hWnd, GWL_ID), BST_UNCHECKED);
				}else
				{
					::CheckDlgButton(hWndParent, GetWindowLong(m_hWnd, GWL_ID), BST_CHECKED);
				}
			}
			
		}/*else
		{		
			if (::IsDlgButtonChecked(hWndParent, ::GetWindowLong(m_hWnd, GWL_ID)) & BST_CHECKED)
			{
				SetWindowText(m_ValueChecked);
			}else
			{
				SetWindowText(m_ValueUnchecked);
			}
		}*/
	}
#ifdef _DEBUG
	else
	{
		TRACE(_T("----CDBCheckBox 没有父窗口,无法进行操作。\n"));
	}
#endif
}


void CDBCheckBox::virDataWrite()
{
	ASSERT(NULL != m_pWnd);
	HWND hWndParent = ::GetParent(m_hWnd);
	int m_bValue = -1;

	if (NULL != hWndParent)
	{
		if (m_pRecordSet->GetEditChange())
		{
			if (ADO::adBoolean == m_Field.GetType())
			{
				if (::IsDlgButtonChecked(hWndParent, ::GetWindowLong(m_hWnd, GWL_ID)) & BST_CHECKED)
				{
					m_bValue = TRUE;
				}else
				{
					m_bValue = FALSE;
				}
				m_Field.SetValue(m_bValue);
			}
		}
	}
#ifdef _DEBUG
	else
	{
		TRACE(_T("----CDBCheckBox 没有父窗口,无法进行操作。\n"));
	}
#endif
}


void CDBCheckBox::OnLButtonUp(UINT nFlags, CPoint point)
{
	CButton::OnLButtonUp(nFlags, point);
	m_pRecordSet->SetEditChange(true);
	///virDataWrite();
}



//////////////////////////////////////////////////////////////////////////
//
IMPLEMENT_DYNAMIC(CDBRichEdit, CRichEditCtrl)

CDBRichEdit::CDBRichEdit()
{
	m_pWnd = this;
	m_lpszData = NULL;
	m_FieldData.lpByte = NULL;
	m_FieldData.nSize = 0;
}

CDBRichEdit::~CDBRichEdit()
{
	if (NULL != m_lpszData)
	{
		delete m_lpszData;
	}
	if (NULL != m_FieldData.lpByte)
	{
		delete []m_FieldData.lpByte;
		m_FieldData.lpByte = NULL;
	}
}

BEGIN_MESSAGE_MAP(CDBRichEdit, CRichEditCtrl)
END_MESSAGE_MAP()

static DWORD CALLBACK MyStreamWriteCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
	CDBRichEdit *pRichEdit = (CDBRichEdit*)dwCookie;
	pRichEdit->GetAdoRecordset()->AppendChunk(pRichEdit->GetFieldName(), pbBuff, cb);
	*pcb = cb;
	return 0;
}


void CDBRichEdit::virDataWrite()
{
	EDITSTREAM es;
	if (GetModify())
	{
		CDBRichEdit *pRichEdit = this;
		es.dwCookie		= (DWORD)pRichEdit;
		es.pfnCallback	= (EDITSTREAMCALLBACK)MyStreamWriteCallback; 
		StreamOut(SF_RTF, es);
	}
}


static DWORD CALLBACK MyStreamReadCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
	CDBRichEdit::FIELDDATA *pFieldData = (CDBRichEdit::FIELDDATA*)dwCookie;
	if (pFieldData->nSize < cb)
	{
		*pcb = pFieldData->nSize;
		memcpy(pbBuff, (LPCSTR)pFieldData->lpByte, *pcb);
	}

	else
	{
		*pcb = cb;
		memcpy(pbBuff, (LPCSTR)pFieldData->lpByte, *pcb);
		pFieldData->lpByte += cb;
	}

	return 0;
}
void CDBRichEdit::virDataChange()
{
	EDITSTREAM es;
	SetSel(0, -1);
	Clear();

	m_FieldData.nSize = GetField()->GetActualSize();
	if (NULL != m_FieldData.lpByte)
	{
		delete []m_FieldData.lpByte;
		m_FieldData.lpByte = NULL;
	}

	if (m_FieldData.nSize > 0)
	{
		m_FieldData.lpByte = new BYTE[m_FieldData.nSize ];
		GetAdoRecordset()->GetChunk(GetFieldName(), m_FieldData.lpByte);
		es.dwCookie		= (DWORD)&m_FieldData;//(DWORD)m_lpszData;
		es.pfnCallback	= (EDITSTREAMCALLBACK)MyStreamReadCallback;
		StreamIn(SF_RTF, es);
	}
}


LRESULT CDBRichEdit::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
	case WM_KEYDOWN://按键,判断pEP->wParam
	case WM_PASTE://粘贴
	case WM_CUT://剪切
	case EM_SETCHARFORMAT:
		{
			SetModify(TRUE);
			m_pRecordSet->SetEditChange(true);
		};
	}

	return CRichEditCtrl::WindowProc(message, wParam, lParam);
}


//void CDBRichEdit::Clear()
//{
//	SetSel(0, -1);
//	ReplaceSel("");
//
//	EmptyUndoBuffer();
//}


//////////////////////////////////////////////////////////////////////////
//
IMPLEMENT_DYNAMIC(CDBMemo, CEdit)
CDBMemo::CDBMemo()
{
	m_pWnd = this;
}

BEGIN_MESSAGE_MAP(CDBMemo, CEdit)
END_MESSAGE_MAP()

LRESULT CDBMemo::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	CDBBaseControl::_WinMessage(message, wParam, lParam);
	return CEdit::WindowProc(message, wParam, lParam);
}




//////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC(CDBDateTimeCtrl, CDateTimeCtrl)
BEGIN_MESSAGE_MAP(CDBDateTimeCtrl, CDateTimeCtrl)
	ON_WM_KILLFOCUS()
	ON_WM_SETFOCUS()
END_MESSAGE_MAP()

CDBDateTimeCtrl::CDBDateTimeCtrl()
{
	m_pWnd = this;
}


void CDBDateTimeCtrl::virDataChange()
{
	ASSERT(NULL != m_pWnd);
	COleDateTime m_Time;
	if (ADO::adDate==m_Field.GetType())
	{
		if (m_Field.GetValue(m_Time))
		{
			SetTime(m_Time);
		}
	}
}


void CDBDateTimeCtrl::virDataWrite()
{
	COleDateTime m_Time;
	GetTime(m_Time);
	m_Time.SetTime(0, 0, 0);
	m_Field.SetValue(m_Time);
}


LRESULT CDBDateTimeCtrl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	CDBBaseControl::_WinMessage(message, wParam, lParam);
	return CDateTimeCtrl::WindowProc(message, wParam, lParam);
}


void CDBDateTimeCtrl::OnKillFocus(CWnd* pNewWnd)
{
	CDateTimeCtrl::OnKillFocus(pNewWnd);

	// TODO: Add your message handler code here
}

void CDBDateTimeCtrl::OnSetFocus(CWnd* pOldWnd)
{
	CDateTimeCtrl::OnSetFocus(pOldWnd);

	try
	{
		if (NULL != m_pRecordSet)
		{
			COleDateTime m_Time;
			COleDateTime m_FieldTime;
			m_Field.GetValue(m_FieldTime);
			GetTime(m_Time);
			m_Time.SetTime(0, 0, 0);
			if (m_Time!=m_FieldTime)
			{
				m_pRecordSet->SetEditChange(true);
			}
		}
	}
	catch (...)
	{
	}
}