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

📄 flatedit.cpp

📁 本程序为求解博弈纳什均衡解的源程序
💻 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 + -