下面我把CGrid的内容和对CGrid的使用转贴一下,该文的原文件来自于
www.vchelp.net上的flex_grid_src.zip文件。对CGrid的使用进行了一下修改,
由于不知道原作者,望见量。
其中CGrid.h和CGrid.cpp是对CFlexGrid的封装,CDlgUserManger是使用CGrid
/****************CGrid.h**************************/
// Grid.h: interface for the CGrid class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_GRID_H__91679B43_6C53_11D3_BEF7_00C04F755C52__INCLUDED_)
#define AFX_GRID_H__91679B43_6C53_11D3_BEF7_00C04F755C52__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "msflexgrid.h"
class CGrid : public CMSFlexGrid
{
public:
CGrid();
virtual ~CGrid();
public :
BOOL GoRight();
BOOL GoLeft();
BOOL GoDown();
BOOL GoUp();
OnKeyPressGrid(short FAR* KeyAscii) ;
OnClickGrid();
void OnEnterCell();
private :
CString m_GridData;
BOOL bEditMode;
BOOL TransferValue (BOOL ToGrid);
};
#endif // !defined(AFX_GRID_H__91679B43_6C53_11D3_BEF7_00C04F755C52__INCLUDED_)
/****************CGrid.cpp**********************/
#include "stdafx.h"
#include "grid.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CGrid ::CGrid()
{
}
CGrid ::~CGrid()
{
}
BOOL CGrid ::GoUp()
{
TransferValue(TRUE);
if (GetRow () > 1 ) {
int CurrentRow = GetRow();
CurrentRow --;
SetRow (CurrentRow );
TransferValue (FALSE);
if (! GetRowIsVisible (CurrentRow))
SetTopRow (CurrentRow );
}
return TRUE;
}
BOOL CGrid ::GoDown()
{
TransferValue(TRUE);
if ( GetRow () < GetRows () -1) {
int CurrentRow = GetRow();
CurrentRow ++;
SetRow ( CurrentRow);
TransferValue (FALSE);
if (! GetRowIsVisible (CurrentRow))
SetTopRow (CurrentRow );
}
return TRUE;
}
BOOL CGrid ::GoLeft()
{
TransferValue(TRUE);
if ( GetCol () > 1 ) {
int CurrentCol = GetCol();
CurrentCol --;
SetCol (CurrentCol);
TransferValue (FALSE);
if (!GetColIsVisible (CurrentCol))
SetLeftCol (CurrentCol);
}
return TRUE;
}
BOOL CGrid ::GoRight()
{
TransferValue(TRUE);
if ( GetCol () < GetCols() - 1 ) {
int CurrentCol = GetCol ();
CurrentCol++;
SetCol (CurrentCol);
TransferValue (FALSE);
if (!GetColIsVisible (CurrentCol))
SetLeftCol (CurrentCol);
}
return TRUE;
}
BOOL CGrid ::TransferValue(BOOL ToGrid)
{
CString sText;
if (ToGrid) { file://Transfer value to Grid from Edit Box
SetText(m_GridData );
} else {
m_GridData = GetText ();
SetBackColorSel (RGB(0,255,255));
}
return TRUE;
}
BOOL CGrid ::OnKeyPressGrid(short FAR* KeyAscii)
{
switch ( (int) * KeyAscii) {
case VK_BACK : file://Backspace - delete the last character
m_GridData.Delete (m_GridData.GetLength ()-1,1);
break;
default :
m_GridData = m_GridData + (TCHAR *) KeyAscii;
break;
}
TransferValue (TRUE);
}
CGrid ::OnClickGrid()
{
TransferValue (FALSE);
}
void CGrid::OnEnterCell()
{
TransferValue (FALSE);
}
/*********************对CGrid的使用*********************/
/****************CDlgUserManager.cpp********************/
// DlgUserManager.cpp : implementation file
#include "stdafx.h"
#include "DlgUserManager.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDlgUserManager dialog
CDlgUserManager::CDlgUserManager(CWnd* pParent /*=NULL*/)
: CDialog(CDlgUserManager::IDD, pParent)
{
file://{{AFX_DATA_INIT(CDlgUserManager)
file://}}AFX_DATA_INIT
}
void CDlgUserManager::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
file://{{AFX_DATA_MAP(CDlgUserManager)
DDX_Control(pDX, IDC_USER_MANAGER_GRID, m_grid);
file://}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgUserManager, CDialog)
file://{{AFX_MSG_MAP(CDlgUserManager)
ON_WM_DESTROY()
ON_WM_CREATE()
file://}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgUserManager message handlers
BOOL CDlgUserManager::OnInitDialog()
{
CDialog::OnInitDialog();
CWnd * hwnd = GetDlgItem (IDC_USER_MANAGER_GRID);
hGrid = hwnd->GetSafeHwnd();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
BEGIN_EVENTSINK_MAP(CDlgUserManager, CDialog)
file://{{AFX_EVENTSINK_MAP(CDlgUserManager)
ON_EVENT(CDlgUserManager, IDC_USER_MANAGER_GRID, -600 /* Click */, OnClickUserManagerGrid, VTS_NONE)
ON_EVENT(CDlgUserManager, IDC_USER_MANAGER_GRID, -601 /* DblClick */, OnDblClickUserManagerGrid, VTS_NONE)
ON_EVENT(CDlgUserManager, IDC_USER_MANAGER_GRID, -602 /* KeyDown */, OnKeyDownUserManagerGrid, VTS_PI2 VTS_I2)
ON_EVENT(CDlgUserManager, IDC_USER_MANAGER_GRID, 74 /* Compare */, OnCompareUserManagerGrid, VTS_I4 VTS_I4 VTS_PI2)
ON_EVENT(CDlgUserManager, IDC_USER_MANAGER_GRID, -603 /* KeyPress */, OnKeyPressUserManagerGrid, VTS_PI2)
ON_EVENT(CDlgUserManager, IDC_USER_MANAGER_GRID, -605 /* MouseDown */, OnMouseDownUserManagerGrid, VTS_I2 VTS_I2 VTS_I4 VTS_I4)
file://}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
void CDlgUserManager::OnClickUserManagerGrid()
{
// TODO: Add your control notification handler code here
m_grid.OnClickGrid ();
}
void CDlgUserManager::OnDblClickUserManagerGrid()
{
// TODO: Add your control notification handler code here
m_grid.OnClickGrid ();
}
void CDlgUserManager::OnKeyPressUserManagerGrid(short FAR* KeyAscii)
{
// TODO: Add your control notification handler code here
m_grid.OnKeyPressGrid ( KeyAscii);
}
BOOL CDlgUserManager::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->message == WM_KEYDOWN && (pMsg->hwnd == hGrid ) ) {
switch (pMsg->wParam ) {
case VK_UP :
m_grid.GoUp ();
return TRUE;
case VK_DOWN:
m_grid.GoDown();
return TRUE;
case VK_LEFT :
m_grid.GoLeft();
return TRUE;
case VK_RIGHT:
m_grid.GoRight();
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
void CDlgUserManager::OnOK()
{
try{
file://delete all records of users
_variant_t vRecsAffected(0L);
_bstr_t bstrDelete("Delete from 3pw");
(((CSltg2001App *)AfxGetApp())->m_SltgDbConn)->Execute(bstrDelete,&vRecsAffected,adOptionUnspecified);
_bstr_t bstrInsert;
CString strUser,strPasswd;
for(int i=1;i<m_grid.GetRows();i++){
strUser=m_grid.GetTextMatrix(i,1);
if(strUser=="") continue;
strPasswd=m_grid.GetTextMatrix(i,2);
if(strPasswd.IsEmpty())
strPasswd="";
bstrInsert= ("insert into 3PW (用户名,密码) values ('" + _bstr_t((LPCTSTR)(strUser)) + _bstr_t("'")+_bstr_t(_T(","))+_bstr_t("'") + _bstr_t((LPCTSTR)(strPasswd)) + _bstr_t("'")+_bstr_t(")") );
(((CSltg2001App *)AfxGetApp())->m_SltgDbConn)->Execute(bstrInsert,&vRecsAffected,adOptionUnspecified);
}
}
catch(_com_error e){
CString sError=e.ErrorMessage();
AfxMessageBox(sError);
}
catch(...){
AfxMessageBox("不能处理的错误");
}
CDialog::OnOK();
}
主要是增加了几个消息处理函数。
OnClickUserManagerGrid
OnDblClickUserManagerGrid
OnKeyDownUserManagerGrid
OnKeyPressUserManagerGrid
PreTranslateMessage
其中主要是PreTranslateMessage
最后的OnOK()函数是具体连接数据库,并把网格中的数据存到数据库中。
希望上面的内容能对大家有益。
。。。。。。。待续。。。。。。。。。。。。。。