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

📄 newlistctrl.cpp

📁 vc 和mapobjects地理信息系统组件开发 很有启发意义和参考价值
💻 CPP
字号:
// NewListCtrl.cpp : implementation file
//

#include "stdafx.h"
#include "NewListCtrl.h"

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

/////////////////////////////////////////////////////////////////////////////
// CNewListCtrl

CNewListCtrl::CNewListCtrl()
{
	m_bEditing = FALSE;

//	m_nCol=0;
}

CNewListCtrl::~CNewListCtrl()
{
}


BEGIN_MESSAGE_MAP(CNewListCtrl, CListCtrl)
	//{{AFX_MSG_MAP(CNewListCtrl)
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CNewListCtrl message handlers
/////////////////////////////////////////////////////////////////////////////
// CMyEdit

CMyEdit::CMyEdit()
{
	m_bInputValid = TRUE;
}

CMyEdit::~CMyEdit()
{
}


BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
	//{{AFX_MSG_MAP(CMyEdit)
	ON_WM_CREATE()
	ON_WM_KILLFOCUS()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyEdit message handlers

void CNewListCtrl::PreSubclassWindow() 
{
	ModifyStyle(LVS_EDITLABELS, 0L);		//禁止标题编辑
	ModifyStyle(0L, LVS_REPORT);			//设为Report类型
	ModifyStyle(0L, LVS_SHOWSELALWAYS);		//始终高亮度被选中的表项

	SetExtendedStyle( 	LVS_EX_FULLROWSELECT |		//允许整行选中
		LVS_EX_HEADERDRAGDROP |		//允许整列拖动
		LVS_EX_GRIDLINES |			//画出网格线
		LVS_EX_ONECLICKACTIVATE |	//单击选中表项
		LVS_EX_FLATSB );			//扁平风格的滚动条

	CListCtrl::PreSubclassWindow();
}

void CNewListCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
{
	POSITION pos;
	BOOL bSelected = FALSE;

	// 检查是否有Item正被编辑
	if( m_bEditing ==TRUE)
		goto defalt_session;

	// 检查是否有Item被选中,没有时不进入编辑
	pos = GetFirstSelectedItemPosition();
	if( pos )
	{
		// 得到被点击的Item
		LVHITTESTINFO testinfo;
		testinfo.pt.x = point.x;
		testinfo.pt.y = point.y;			//点击时的鼠标位置
		testinfo.flags = LVHT_ONITEMLABEL;	//点击的必须是标题
		if( SubItemHitTest(&testinfo)<0 )
			goto defalt_session;			//没有点在有效区域,不进入编辑
		m_nItem = testinfo.iItem;			//被点击表项的行号
		m_nSubItem = testinfo.iSubItem;	//被点击表项的列号

//		if(m_nSubItem==m_nCol)
//				goto defalt_session;

		// 检查该表项是否被选中,没被选中不进入编辑
		while( pos )
			if( m_nItem==GetNextSelectedItem(pos) )
			{
				bSelected = TRUE;
				break;
			}
		if( bSelected==FALSE )
			goto defalt_session;			//没有点在有效区域,不编辑

		// 开始编辑
		m_bEditing = MyBeginEdit();
		return;
	}

defalt_session:
	CListCtrl::OnLButtonDown(nFlags, point);
}

#define ID_MYEDIT		101		//编辑控件的ID号
BOOL CNewListCtrl::MyBeginEdit()
{
	// 得到被编辑表项的区域
	CRect rect;
	if( GetSubItemRect(m_nItem, m_nSubItem, LVIR_LABEL, rect)==FALSE )
		return FALSE;

	// 创建编辑控件
	int style = 	WS_CHILD | 
					WS_CLIPSIBLINGS |
					WS_EX_TOOLWINDOW |
					WS_BORDER;
	if( m_edit.Create(style, rect, this, ID_MYEDIT)==FALSE )
		return FALSE;

	// 取被编辑表项的文字
	CString txtItem = GetItemText( m_nItem, m_nSubItem );

	// 取出的文字填写到编辑控件
	m_edit.SetWindowText( txtItem );
	m_edit.SetFocus();
	m_edit.SetSel( 0, -1 );
	m_edit.ShowWindow( SW_SHOW );

	return TRUE;
}

void CNewListCtrl::MyEndEdit( BOOL bValidate )
{
	// 编辑结果是有效的,重设被编辑表项的文字
	if( bValidate )
	{
		CString txtItem;
		m_edit.GetWindowText( txtItem );
		SetItemText(m_nItem, m_nSubItem, txtItem);

//添加编辑标志
		m_uaEdited.Add(m_nItem);
	}

	// 销毁编辑窗口
	m_edit.DestroyWindow();
	m_bEditing = FALSE;
}

int CMyEdit::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CEdit::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// 改变字体
	LOGFONT logfont;
	logfont.lfHeight = -12;
	logfont.lfWidth = 0;
	logfont.lfEscapement = 0;
	logfont.lfOrientation = 0;
	logfont.lfWeight = 400;
	logfont.lfItalic = 0;
	logfont.lfUnderline = 0;
	logfont.lfStrikeOut = 0;
	logfont.lfCharSet = 134;
	logfont.lfOutPrecision = 0;
	logfont.lfClipPrecision = 0;
	logfont.lfQuality = 0;
	logfont.lfPitchAndFamily = 2;
	strcpy( logfont.lfFaceName, "宋体" );
	m_font.DeleteObject();
	if( m_font.CreateFontIndirect(&logfont) )
		SetFont( &m_font );
	return 0;
}

void CMyEdit::OnKillFocus(CWnd* pNewWnd) 
{
	// 得到父窗口,并通知父窗口结束编辑过程
	CNewListCtrl *parent = (CNewListCtrl *)GetParent();
	if( parent )
		parent->MyEndEdit( m_bInputValid );

	m_bInputValid = TRUE;
	
	CEdit::OnKillFocus(pNewWnd);
}


BOOL CMyEdit::PreTranslateMessage(MSG* pMsg) 
{
	//拦截ESC键和RETURN键按下的消息,解释为WM_KILLFOCUS消息
	if( pMsg->message==WM_KEYDOWN )
	{
		if( pMsg->wParam==13 )		//回车键
			pMsg->message = WM_KILLFOCUS;
		else if( pMsg->wParam==27 )	//ESC键
		{
			m_bInputValid = FALSE;	//此时的编辑结果无效
			pMsg->message = WM_KILLFOCUS;
		}
	}
	
	return CEdit::PreTranslateMessage(pMsg);
}

⌨️ 快捷键说明

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