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

📄 magicedit.cpp.svn-base

📁 股票软件源码
💻 SVN-BASE
字号:
// MagicRichEdit.cpp : implementation file
//

#include "stdafx.h"
#include "MagicEdit.h"

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


/////////////////////////////////////////////////////////////////////////////
// CMagicDlg dialog


CMagicDlg::CMagicDlg(CWnd* pParent /*=NULL*/)
	: CXFResDialog(CMagicDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMagicDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
}

void CMagicDlg::SetListStrings( CStringArray & astr )
{
	m_nMaxLength	=	0;

	ASSERT( ::IsWindow(m_hWnd) );
	if( ::IsWindow( m_hWnd ) )
	{
		for( int i=0; i<astr.GetSize(); i++ )
		{
			m_listMagic.AddString( astr[i] );
			if( astr[i].GetLength() > m_nMaxLength )
				m_nMaxLength	=	astr[i].GetLength();
		}
		if( m_listMagic.GetCount() > 0 )
			m_listMagic.SetCurSel( 0 );
	}
	m_nMaxLength	+=	1;
}

int CMagicDlg::GetMaxLength( )
{
	return m_nMaxLength;
}

void CMagicDlg::DoDataExchange(CDataExchange* pDX)
{
	CXFResDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMagicDlg)
	DDX_Control(pDX, IDC_XFLISTMAGIC, m_listMagic);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CMagicDlg, CXFResDialog)
	//{{AFX_MSG_MAP(CMagicDlg)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMagicDlg message handlers
BOOL CMagicDlg::OnInitDialog() 
{
	CXFResDialog::OnInitDialog();
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

/////////////////////////////////////////////////////////////////////////////
// CMagicEdit

CMagicEdit::CMagicEdit()
{
	m_bOpen		=	FALSE;
	m_nMagicBegin	=	0;
}

CMagicEdit::~CMagicEdit()
{
}

void CMagicEdit::SetListStrings( CStringArray & astr )
{
	if( !::IsWindow( m_dlgMagic.m_hWnd ) )
	{
		m_dlgMagic.Create( CMagicDlg::IDD, NULL );
		HideMagicDialog();
	}
	m_dlgMagic.SetListStrings( astr );
}

BEGIN_MESSAGE_MAP(CMagicEdit, CEdit)
	//{{AFX_MSG_MAP(CMagicEdit)
	ON_WM_CHAR()
	ON_WM_KEYDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMagicEdit message handlers

void CMagicEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if( m_bOpen )
	{
		if( VK_RETURN == nChar || VK_SPACE == nChar )
		{
			int		nCurPos;
			nCurPos	=	m_dlgMagic.m_listMagic.GetCurSel();
			if( LB_ERR != nCurPos )
			{
				CString	strWord;
				m_dlgMagic.m_listMagic.GetText( nCurPos, strWord );

				SetSel( -1, 0 );
				CPoint	pt		=	GetCaretPos( );
				int	nCurChar	=	CharFromPos( pt );
				WORD nIndex	=	LOWORD( nCurChar );
				WORD nLine	=	HIWORD( nCurChar );
				if( nIndex >= m_nMagicBegin )
					SetSel( m_nMagicBegin, nIndex );
				ReplaceSel( strWord, TRUE);

				if( VK_SPACE == nChar )
					CEdit::OnChar(nChar, nRepCnt, nFlags);
			}
			HideMagicDialog();
			return;
		}
		else if( isalpha(nChar) || ('_' == nChar) )
		{
			m_strSearch	+=	(unsigned char)nChar;
			int	nFind	=	m_dlgMagic.m_listMagic.FindString( -1, m_strSearch );
			m_dlgMagic.m_listMagic.SetCurSel( nFind );
			if( m_strSearch.GetLength() > m_dlgMagic.GetMaxLength() )
				HideMagicDialog( );
		}
		else if( VK_BACK == nChar && m_strSearch.GetLength() > 1 )
		{
			m_strSearch	=	m_strSearch.Left( m_strSearch.GetLength() -1 );
			int	nFind	=	m_dlgMagic.m_listMagic.FindString( -1, m_strSearch );
			m_dlgMagic.m_listMagic.SetCurSel( nFind );
		}
		else if( VK_ESCAPE == nChar )
		{
			HideMagicDialog();
			return;
		}
	}
	else
	{
		if( ':' == nChar )
		{
			CPoint	pt		=	GetCaretPos( );
			int	nCurChar	=	CharFromPos( pt );
			WORD nIndex	=	LOWORD( nCurChar );
			WORD nLine	=	HIWORD( nCurChar );

			CString	strText;
			GetWindowText( strText );
			if( nIndex > 0 && nIndex-1 < strText.GetLength() && strText[nIndex-1] == ':' )
			{
				m_nMagicBegin	=	nIndex+1;
				CEdit::OnChar(nChar, nRepCnt, nFlags);
				ShowMagicDialog();
				SetFocus( );
				return;
			}
		}
	}

	CEdit::OnChar(nChar, nRepCnt, nFlags);
}

void CMagicEdit::ShowMagicDialog( )
{
	if( !::IsWindow( m_dlgMagic.m_hWnd ) )
	{
		m_dlgMagic.Create( CMagicDlg::IDD, NULL );
	}
	CPoint	pt	=	GetCaretPos( );
	ClientToScreen( &pt );

	CFont	* pFont	=	GetFont( );
	LOGFONT	logfont;
	if( pFont && pFont->GetLogFont( &logfont ) && 0 != logfont.lfHeight )
		pt.y	+=	abs(logfont.lfHeight);
	else
		pt.y	+=	12;

	m_dlgMagic.SetWindowPos( &wndTopMost, pt.x, pt.y, 0, 0, 
		SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOACTIVATE );
	SetFocus();
	m_bOpen	=	TRUE;
}

void CMagicEdit::HideMagicDialog( )
{
	if( ::IsWindow( m_dlgMagic.m_hWnd ) )
	{
		m_dlgMagic.ShowWindow( SW_HIDE );
		m_dlgMagic.m_listMagic.SetCurSel( 0 );
		m_bOpen	=	FALSE;
		m_strSearch	=	"";
	}
}

void CMagicEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if( m_bOpen )
	{
		int		nCurPos;
		nCurPos	=	m_dlgMagic.m_listMagic.GetCurSel();
		switch( nChar )
		{
		case	VK_UP:
		case	VK_DOWN:
		case	VK_NEXT:
		case	VK_PRIOR:
			if( LB_ERR != nCurPos )
			{
				if( VK_UP == nChar )
					nCurPos--;
				else if( VK_DOWN == nChar )
					nCurPos++;
				else if( VK_NEXT == nChar )
					nCurPos	+=	8;
				else if( VK_PRIOR == nChar )
					nCurPos	-=	8;

				int	nCount = m_dlgMagic.m_listMagic.GetCount();
				if( nCurPos < 0 )
					nCurPos = 0;
				else if ( nCurPos >= nCount )
					nCurPos	=	nCount - 1;
				m_dlgMagic.m_listMagic.SetCurSel( nCurPos );
			}
			else
			{
				int	nCount = m_dlgMagic.m_listMagic.GetCount();
				if( nCount > 0 )
					m_dlgMagic.m_listMagic.SetCurSel( 0 );
			}
			return;
		case	VK_ESCAPE:
			HideMagicDialog();
			return;
		case	VK_LEFT:
		case	VK_RIGHT:
		case	VK_HOME:
		case	VK_END:
			HideMagicDialog();
			break;
		}
	}
	CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}

BOOL CMagicEdit::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	if(	WM_KEYFIRST == pMsg->message
		|| WM_KEYDOWN == pMsg->message
		|| WM_KEYUP == pMsg->message
		|| WM_CHAR == pMsg->message
		|| WM_DEADCHAR == pMsg->message
		|| WM_SYSKEYDOWN == pMsg->message
		|| WM_SYSKEYUP == pMsg->message
		|| WM_SYSCHAR == pMsg->message
		|| WM_SYSDEADCHAR == pMsg->message
		|| WM_KEYLAST == pMsg->message )
	{
		if( VK_ESCAPE == pMsg->wParam && m_bOpen )
		{
			HideMagicDialog( );
			return TRUE;
		}
	}
	
	return CEdit::PreTranslateMessage(pMsg);
}

⌨️ 快捷键说明

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