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

📄 keywizzard.cpp

📁 程序经过了调试,直接运行就可以显示结果,为股市应用程序,VC++的
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/*****************************************************************************
【文件名】      
     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 + -