📄 keywizzard.cpp
字号:
/*****************************************************************************
【文件名】
KeyWizzard.cpp
【功能模块和目的】
提供给用户利用字符选择股票代码或者操作指令的交互对象
【主要函数及其功能】
DWORD AddKeyTableReg(TaKeyRegisterTable *pKey); //选项表注册函数
DWORD DelKeyTableReg (TaKeyRegisterTable *pKey); //删除选项表函数
DWORD ActiveKeyTableReg (TaKeyRegisterTable *pKey); //激活一个选项表函数
DWORD DeactiveKeyTableReg (TaKeyRegisterTable *pKey); //使一个选项表失去活动状态函数
DWORD CompateKeyStr (char *t,char *s); //匹配一个字符串
DWORD ConvertChineseStr (char *szIn,char * szOut,int alter); //转换一 个汉字字符串到拼音字母字符串
DWORD Init(char* FilePath) //初始化多音字列表
【主要算法】
将筛选结果放入结构变量中,尽可能地在已得结果中进行查找.
【接口说明】
(必需)
【开发者及日期】
方丽 2003.6.24
【版本】
1.0
*****************************************************************************/
// KeyWizzard.cpp : implementation file
//
#include "stdafx.h"
//#include "slbbc.h"
#include "KeyWizzard.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
struct SORTDATA
{
char szCode[10];
char szName[20];
int nItemData;
};
static int SortCompare( const void *arg1, const void *arg2 );
/////////////////////////////////////////////////////////////////////////////
// CKeyWizzard dialog
CKeyWizzard *g_pKeyWizzard = NULL;
CKeyWizzard::CKeyWizzard(CWnd* pParent /*=NULL*/)
: CDialog(CKeyWizzard::IDD, pParent)
{
//{{AFX_DATA_INIT(CKeyWizzard)
m_EditStr = _T("");
//}}AFX_DATA_INIT
m_pResult = NULL;
m_nResultCount = 0;
m_nTableCount = 0;
m_nTrilen = 0;
m_xPos = 0;
m_yPos = 0;
m_cPosState = 0;
m_EditOnTop = FALSE;
memset(&m_sEditBox, 0, sizeof(SIZE));
//吴昊添加03/10/17
m_FirstChar = 0;
m_nType = 0;
m_nInputType = 0;
}
CKeyWizzard::~CKeyWizzard()
{
if( m_pResult!=NULL )
{
delete [] m_pResult;
m_pResult = NULL;
}
}
void CKeyWizzard::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CKeyWizzard)
DDX_Control(pDX, IDC_LIST, m_List);
DDX_Control(pDX, IDC_EDIT, m_Edit);
DDX_Text(pDX, IDC_EDIT, m_EditStr);
DDV_MaxChars(pDX, m_EditStr, 9);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CKeyWizzard, CDialog)
//{{AFX_MSG_MAP(CKeyWizzard)
ON_EN_CHANGE(IDC_EDIT, OnChangeEdit)
ON_LBN_DBLCLK(IDC_LIST, OnDblclkList)
ON_WM_CANCELMODE()
ON_WM_CLOSE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CKeyWizzard message handlers
/*****************************************************************************
【函数名称】
DWORD AddKeyTableReg(TaKeyRegisterTable *pKey);
【函数功能】
选项表注册函数
【参数】
TaKeyRegisterTable *pKey [in/out] 传入参数的注册选项表地址
【返回值】
=0 注册失败
>0 注册成功
【版本】
1.0
【使用情况】
新注册选项表时
*****************************************************************************/
DWORD CKeyWizzard::AddKeyTableReg(TaKeyRegisterTable *pKey)
{
if (pKey == NULL) //传入参数为NULL,返回0
{
return 0;
}
else if( m_nTableCount<MAX_TABLE_NUM )
{
//把传进来的*pKey新增到m_KeyTable中
m_KeyTable[m_nTableCount] = pKey;
m_nTableCount = m_nTableCount + 1;
return 1;
}
else
return 0;
}
/*****************************************************************************
【函数名称】
DWORD DelKeyTableReg(TaKeyRegisterTable *pKey);
【函数功能】
删除选项表函数
【参数】
TaKeyRegisterTable *pKey [in/out] 传入参数的注册选项表地址
【返回值】
0 表示成功删除,
1 表示未找到这样的注册记录,
其他值 为其他失败代码
【使用情况】
需使删除一个选项表时
*****************************************************************************/
DWORD CKeyWizzard::DelKeyTableReg(TaKeyRegisterTable *pKey)
{ int i;
int j;
if (pKey == NULL) //传入参数为NULL,返回0
{
return 0;
}
else
{
for (i = 0;i < int(m_nTableCount);i++)
{
if (m_KeyTable[i] == pKey)
{
for (j = i;j < int(m_nTableCount) - 1;j++)
{
m_KeyTable[j] = m_KeyTable[j+1];
}
m_nTableCount = m_nTableCount - 1; //m_nTableCount递减1
return 0;
}
}
return 1;
}
}
/*****************************************************************************
【函数名称】
DWORD ActiveKeyTableReg(TaKeyRegisterTable *pKey);
【函数功能】
激活一个选项表函数
【参数】
TaKeyRegisterTable *pKey [in/out] 传入参数的注册选项表地址
【返回值】
0 表示成功激活,
1 表示未找到这样的注册记录,
其他值 为其他失败代码
【使用情况】
需激活一个选项表时
*****************************************************************************/
DWORD CKeyWizzard::ActiveKeyTableReg(TaKeyRegisterTable *pKey)
{
int i;
if (pKey == NULL) //传入参数为NULL,返回0
{
return 0;
}
else
{
for (i = 0;i < int(m_nTableCount);i++)
{
if (m_KeyTable[i] == pKey)
{
m_KeyTable[i]->Status = 1;
return 0;
}
}
return 1;
}
}
/*****************************************************************************
【函数名称】
DWORD DeactiveKeyTableReg(TaKeyRegisterTable *pKey);
【函数功能】
使一个选项表失去活动状态函数
【参数】
TaKeyRegisterTable *pKey [in/out] 传入参数的注册选项表地址
【返回值】
0 表示成功失去活动状态
1 表示未找到这样的注册记录
其他值 为其他失败代码
【使用情况】
需使一个选项表失去活动状态时
*****************************************************************************/
DWORD CKeyWizzard::DeactiveKeyTableReg(TaKeyRegisterTable* pKey)
{
int i;
if (pKey == NULL) //传入参数为NULL,返回0
{
return 0;
}
else
{
for (i = 0;i < int(m_nTableCount);i++)
{
if (m_KeyTable[i] == pKey)
{
m_KeyTable[i]->Status = 0;
return 0;
}
}
return 1;
}
}
/*****************************************************************************
【函数名称】
DWORD CompareKeyStr(char* s,char* t)
【函数功能】
匹配一个字符串
【参数】
s [in] 用户输入串
t [in] 需要比较的另一个字符串,
【返回值】
0 匹配成功
其他值 为其他失败代码
【使用情况】 (必需)
在OnInitDialog() 被调用过三次
在OnChangeEdit() 被调用过三次
*****************************************************************************/
DWORD CKeyWizzard::CompareKeyStr(char* t,char* s)
{
int i,len = strlen(s)-strlen(t);
int clen = strlen(t);
for(i=0;i<=len;i++)
{
if( s[i]==t[0] || t[0]=='?' || (s[i]=='?' && isalpha(t[0])) )
{
for(int k=1;k<clen;k++)
{
if( t[k]=='?' || t[k]==s[i+k] || (s[i+k]=='?' && isalpha(t[k])) );
else
break;
}
if( k>=clen ) //表示从 s 的第 i 号字符开始匹配成功
{
if( len )
{
return i*20+2+(len-i); //2+开始匹配位置*20+s串多出的未匹配字符个数
}
else return (i+1); //完全匹配,因为len=0即s和t长度相同,返回1
}
}
}
return 0;
}
/*****************************************************************************
【函数名称】
DWORD CKeyWizzard::ConvertChineseStr(char* szIn,char* szOut,int alter)
【函数功能】
转换一个汉字字符串到拼音字母字符串
【参数】
szIn [in] 输入汉字字符串
szOut [out] 输出拼音字母字符串
alter [in] 表示是否用多音字.1:是;0
【返回值】
0 匹配成功
其他值 为其他失败代码
【使用情况】
在OnInitDialog() 被调用过两次
在OnChangeEdit() 被调用过两次
*****************************************************************************/
DWORD CKeyWizzard::ConvertChineseStr(char* szIn,char* szOut,int alter)
{
int i = 0;
int j = 0;
unsigned char ch;
unsigned quwei;
int nszInLen = strlen(szIn);
const unsigned int LetterInQuwei[]={
0xb0c4,//a
0xb2c0, 0xb4ed, 0xb6e9, 0xb7a1, 0xb8c0, //f
0xb9fd, 0xbbf6, 0xbbf6, 0xbfa5, 0xc0ab, //k
0xc2e7, 0xc4c2, 0xc5b5, 0xc5bd, 0xc6d9, //p
0xc8ba, 0xc8f5, 0xcbf9, 0xcdd9, 0xcdd9, //u
0xcdd9, 0xcef3, 0xd1b8, 0xd4d0, 0xd7f9 //z
}; //汉字拼音声母区位位置表
for(i = 0; i < nszInLen; i++)
{
ch = szIn[i];
if(ch == 32) continue;
if(ch < 0x80) szOut[j++] = toupper(ch);
else
{
quwei = ch * 256 + (unsigned char)szIn[++i];
if(!((quwei & 0xff00)^0xa300)) szOut[j++] = (unsigned char)(quwei & 0x7f); // ascii
else
{
int changed = 0;
if(alter)
{
for(int k=0; k<m_nTrilen; k++)
if(tri[k].quwei == quwei)
{
szOut[j++] = tri[k].ch;
changed = 1;
break;
}
}
if(!changed)
{
if( quwei<(unsigned int)0xB0A1 )
szOut[j++] = '?';
else
{
for(int k=0; k<26; k++)
{
if(quwei <= LetterInQuwei[k])
{
szOut[j++] = k + 0x41;
break;
}
}
if(k==26) szOut[j++] = '?';
}
}
}
}
}
szOut[j] = 0;
if (szOut[0] == '*')
{
for (i = 0;i < j-1;i++)
{szOut[i] = szOut[i+1];}
szOut[i] = 0;
}//若首个字符为"*",去掉"*".
return 0;
}
/*****************************************************************************
【函数名称】
DWORD InputFirstChar(char chIn)
【函数功能】
向键盘缓存区填写第一个字符
【参数】
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -