⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gridtestdlg.cpp

📁 在VC++ 中实现MSFlexGrid 控件的网格编辑功能
💻 CPP
字号:
// GridTestDlg.cpp : implementation file
//

#include "stdafx.h"
#include "GridTest.h"
#include "GridTestDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CGridTestDlg dialog


CGridTestDlg::CGridTestDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CGridTestDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CGridTestDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	m_edit = 0;

	m_selectedRow = 1;
	m_selectedCol = 1;
	m_oldSelectedRow = 1;
	m_oldSelectedCol = 1;

}


void CGridTestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CGridTestDlg)
	DDX_Control(pDX, IDC_MSFLEXGRID1, m_gridCtrl);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CGridTestDlg, CDialog)
	//{{AFX_MSG_MAP(CGridTestDlg)
	ON_MESSAGE(GRID_DATA_CHANGED,OnGridDataChanged)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGridTestDlg message handlers

BEGIN_EVENTSINK_MAP(CGridTestDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CGridTestDlg)
	ON_EVENT(CGridTestDlg, IDC_MSFLEXGRID1, 71 /* EnterCell */, OnEnterCellMsflexgrid1, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CGridTestDlg::OnEnterCellMsflexgrid1() 
{
	// TODO: Add your control notification handler code here

	if(m_edit->GetSafeHwnd()!=0)
			m_edit->DestroyWindow();

	int col = m_gridCtrl.GetCol();
	int row = m_gridCtrl.GetRow();

	if(row==0 || col==0) return;  //如果进入标题栏则返回

	m_selectedRow = row;
	m_selectedCol = col;	

	CreateEditBox();
	
	//保存网格中原有的值
	m_oldGridValue = m_gridCtrl.GetTextMatrix(row,col);

	m_oldSelectedCol = m_selectedCol;
	m_oldSelectedRow = m_selectedRow;
	
	
}


LONG CGridTestDlg::OnGridDataChanged(UINT wParam, LONG lParam)
{
	CString str;
	m_edit->GetWindowText(str);
	m_gridCtrl.SetTextMatrix(m_oldSelectedRow,m_oldSelectedCol,str);
	

	return 1L;
}

void CGridTestDlg::CreateEditBox()
{
	long row_value = m_gridCtrl.GetRowHeight((long)m_selectedRow);//行高
	long col_value = m_gridCtrl.GetColWidth((long)m_selectedCol); //列宽 
	long col_pos = m_gridCtrl.GetColPos(m_selectedCol); //列的起始位置
	long row_pos = m_gridCtrl.GetRowPos(m_selectedRow); //行的起始位置

	
	CClientDC dc(this);
	int x_pixels = dc.GetDeviceCaps(LOGPIXELSX);//X方向没逻辑英寸的象素数
	int y_pixels = dc.GetDeviceCaps(LOGPIXELSY);//y方向没逻辑英寸的象素数


	//MM_TWIPS 一逻辑单位为1/1440英寸
	CRect editrect;
	editrect.left = (int)((col_pos/1440.0)*x_pixels);
	editrect.top =  (int)((row_pos/1440.0)*y_pixels);
	editrect.right = (int)(((col_pos + col_value)/1440.0)*x_pixels);
	editrect.bottom = (int)(((row_pos + row_value)/1440.0)*y_pixels);

	
	if(m_edit->GetSafeHwnd()!= NULL)
	{
		m_edit->DestroyWindow();
		m_gridCtrl.SetAllowUserResizing(1L);
	}
	delete m_edit;
	m_edit = 0;


	m_edit = new CMyEdit;
	m_edit->Create(ES_AUTOHSCROLL|WS_VISIBLE|WS_BORDER|LVS_NOLABELWRAP ,
			editrect,m_gridCtrl.FromHandle(m_gridCtrl.GetSafeHwnd()),MY_EDIT_CTRL);	
	m_edit->SetFont(GetFont());
	m_edit->SetFocus();
	m_gridCtrl.SetAllowUserResizing(0L);

	CString str = m_gridCtrl.GetTextMatrix(m_selectedRow,m_selectedCol);
	m_edit->SetWindowText(str);

}


BOOL CGridTestDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	int n = 5; char buf[10];
	m_gridCtrl.SetCols(n); 
	m_gridCtrl.SetRows(n);
	for ( int i=0;  i<n;  i++)
	for ( int j=0; j<n;  j++){
			sprintf(buf, "[%d,%d]", i, j );
			m_gridCtrl.SetTextMatrix( i, j, buf);
			m_gridCtrl.SetColWidth(j,800);
	}

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -