📄 flatedit.cpp
字号:
// FlatEdit.cpp : implementation file
//
#include "stdafx.h"
#include "Game.h"
#include "FlatEdit.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CFlatEdit
CFlatEdit::CFlatEdit()
{
}
CFlatEdit::~CFlatEdit()
{
}
BEGIN_MESSAGE_MAP(CFlatEdit, CEdit)
//{{AFX_MSG_MAP(CFlatEdit)
ON_WM_KILLFOCUS()
ON_WM_CREATE()
ON_WM_CHAR()
ON_WM_NCDESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFlatEdit message handlers
CFlatEdit::CFlatEdit(int iItem, int iSubItem, CString sInitText)
:m_sInitText( sInitText )
{
//设置在位编辑项的行
m_iItem = iItem;
//设置在位编辑项的列
m_iSubItem = iSubItem;
//设置在位编辑生效为否
m_bESC = FALSE;
// EDIT中仅有一个数据的标志
isOneValue = TRUE;
}
/******************************************************************
功能:EDIT消息预处理函数
参数:pMsg--系统消息参数
******************************************************************/
BOOL CFlatEdit::PreTranslateMessage(MSG* pMsg)
{
//响应键盘操作
if( pMsg->message == WM_KEYDOWN )
{
//拦截一些键盘消息,使之不执行
if(pMsg->wParam == VK_RETURN
|| pMsg->wParam == VK_DELETE
|| pMsg->wParam == VK_ESCAPE
|| GetKeyState( VK_CONTROL)
)
{
::TranslateMessage(pMsg);
::DispatchMessage(pMsg);
return TRUE;
}
}
return CEdit::PreTranslateMessage(pMsg);
}
/******************************************************************
功能:EDIT失去焦点时响应
参数:系统参数
******************************************************************/
void CFlatEdit::OnKillFocus(CWnd* pNewWnd)
{
CEdit::OnKillFocus(pNewWnd);
CString str;
GetWindowText(str);
//发送消息通知LISTCTRL
LV_DISPINFO dispinfo;
dispinfo.hdr.hwndFrom = GetParent()->m_hWnd;
dispinfo.hdr.idFrom = GetDlgCtrlID();
dispinfo.hdr.code = LVN_ENDLABELEDIT;
dispinfo.item.mask = LVIF_TEXT;
dispinfo.item.iItem = m_iItem;
dispinfo.item.iSubItem = m_iSubItem;
//根据用户操作判断修改结果是否有效
dispinfo.item.pszText = m_bESC ? NULL : LPTSTR((LPCTSTR)str);
dispinfo.item.cchTextMax = str.GetLength();
//向LISTCTRL发修改完成的消息
GetParent()->GetParent()->SendMessage( WM_NOTIFY, GetParent()->GetDlgCtrlID(),
(LPARAM)&dispinfo );
// EDIT中为多个数据且不包含","时报错
if(str.Find(",") < 0 && isOneValue == FALSE)
{
AfxMessageBox("请不要删除数据分隔符','");
}
//销毁自身
DestroyWindow();
}
/******************************************************************
功能:EDIT创建时响应
参数:系统参数
******************************************************************/
int CFlatEdit::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CEdit::OnCreate(lpCreateStruct) == -1)
return -1;
//设置与LISTCTRL匹配的字体
CFont* font = GetParent()->GetFont();
SetFont(font);
//初始化EDIT的内容
SetWindowText( m_sInitText );
//使EDIT获得当前焦点
SetFocus();
//所有EDIT的内容被选择
SetSel( 0, -1 );
return 0;
}
/******************************************************************
功能:响应用户的键盘操作
参数:系统参数
******************************************************************/
void CFlatEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if( nChar == VK_ESCAPE || nChar == VK_RETURN)
{
//ESC键按下,修改不生效
if( nChar == VK_ESCAPE )
m_bESC = TRUE;
//回车键按下,LISTCTRL获取焦点
GetParent()->SetFocus();
//让用户再次修改
return;
}
// 输入为数字、小数点、DELETE、BACKSPACE、逗号
if(!((nChar >= '0' && nChar <= '9') || nChar == '.' ||
nChar == VK_DELETE || nChar == VK_BACK ||
nChar == ','|| nChar == '-'))
return;
//必要时调整EDIT尺寸
//获取LISTCTRL对应项的文本
CString str;
GetWindowText( str );
CWindowDC dc(this);
CFont *pFont = GetParent()->GetFont();
CFont *pFontDC = dc.SelectObject( pFont );
CSize size = dc.GetTextExtent( str );
dc.SelectObject( pFontDC );
size.cx += 5;
//获取EDIT尺寸
CRect rect, parentrect;
GetClientRect( &rect );
GetParent()->GetClientRect( &parentrect );
//将EDIT尺寸转化为LISTCTRL尺寸
ClientToScreen( &rect );
GetParent()->ScreenToClient( &rect );
//检查EDIT是否需要调整尺寸,LISTCTRL是否有空间让EDIT扩展
if( size.cx > rect.Width() )
{
if( size.cx + rect.left < parentrect.right )
rect.right = rect.left + size.cx;
else
rect.right = parentrect.right;
//将EDIT放置到调整后的位置
MoveWindow( &rect );
}
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
/******************************************************************
功能:删除在位编辑动态创建的EDIT控件
参数:无
******************************************************************/
void CFlatEdit::OnNcDestroy()
{
CEdit::OnNcDestroy();
//删除动态创建的EDIT控件
delete this;
}
/******************************************************************
功能:设置EDIT中仅有一个数据的标志
参数:BOOL oneValue 标志
******************************************************************/
void CFlatEdit::SetOneValue(BOOL oneValue)
{
isOneValue = oneValue;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -