📄 newlistctrl.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 + -