输入法第一版:
http://wenku.baidu.com/view/04906204eff9aef8941e06ac.html
http://download.csdn.net/detail/yql1990115/3944309
输入法第二版源码:【以后有空的话在写输入法的系统架构】【本来是要写C版本的输入法,后面发现麻烦就直接写了C++版的】
C版本:【没写完】
http://blog.csdn.net/yql1990115/article/details/8316408
声明:本人原创,只限于交流学习,欢迎转载这里我只是实现了核心算法,UI有空的时候在实现O(∩_∩)O~
第二版实现的时候时间仓促,如有问题,欢迎发邮件给我:942690451@qq.com
第二版输入法源码下载:
http://download.csdn.net/detail/yql1990115/5101527
http://pan.baidu.com/share/link?shareid=374764&uk=2449640175
http://www.pudn.com/downloads517/sourcecode/windows/ime/detail2144960.html
接下来上代码:
字接口
#if !defined(_ICODE_H_)
#define _ICODE_H_
class ICode
{
public:
ICode(){};
virtual ~ICode(){};
public:
virtual CString GetData() = 0;
virtual bool SetData(CString strValue) = 0;
//
virtual bool SvaeData(CFile &mCFile) = 0;
virtual bool ReadData(CFile &mCFile) = 0;
};
#endif
字接口实现
#if !defined(_CLSCODE_H_)
#define _CLSCODE_H_
#include "ICode.h"
class ClsCode:public ICode
{
public:
ClsCode(){};
~ClsCode(){};
//
public:
CString GetData();
bool SetData(CString strValue);
//
bool SvaeData(CFile &mCFile);
bool ReadData(CFile &mCFile);
private:
CString m_strCode;
};
#endif
#include "StdAfx.h"
#include "ClsCode.h"
//默认字码长度[一个汉字]
#define CLSCODE_CODELENGTH 2
//获取数据
CString ClsCode::GetData()
{
return this->m_strCode;
}
//设置数据
bool ClsCode::SetData(CString strValue)
{
//处理数据[对数据进行检验]
int mLength = strValue.GetLength();
assert(CLSCODE_CODELENGTH == mLength);
//
if (CLSCODE_CODELENGTH == mLength)
{
this->m_strCode = strValue;
return true;
}
return false;
}
bool ClsCode::ReadData(CFile &mCFile)
{
UCHAR szBuff[3] = {0};
int mLength = mCFile.Read(szBuff, CLSCODE_CODELENGTH);
assert(CLSCODE_CODELENGTH == mLength);
//
if (CLSCODE_CODELENGTH == mLength)
{
m_strCode = szBuff;
return true;
}
TRACE(_T("Error: 错误信息: %s; 文件: %s; 行: %d\n"), "ReadData出错", __FILE__, __LINE__);
return false;
}
bool ClsCode::SvaeData(CFile &mCFile)
{
int mLength = m_strCode.GetLength();
assert(CLSCODE_CODELENGTH == mLength);
if ((this->m_strCode.IsEmpty() == FALSE) && (CLSCODE_CODELENGTH == mLength))
{
mCFile.Write(m_strCode.GetBuffer(mLength), mLength);
m_strCode.ReleaseBuffer();
return true;
}
TRACE(_T("Error: 错误信息: %s; 文件: %s; 行: %d\n"), "SvaeData出错", __FILE__, __LINE__);
return false;
}
#if !defined(_ClsGuideTreeNode_H_)
#define _ClsGuideTreeNode_H_
#include "list"
#include "ICode.h"
//
using namespace std;
//
template <class TICode> class ClsGuideTreeNode;
//
template <class TICode>
class ClsGuideTreeNode{
public:
ClsGuideTreeNode(){ Init(); };
virtual ~ClsGuideTreeNode(){ Unit(); };
//
public:
bool Init(){ List_Iterator = m_CodeList.begin(); return true; };
void Unit(){};
//
bool MoveFirst()
{
List_Iterator = m_CodeList.begin();
if (List_Iterator != m_CodeList.end())
{
return true;
}
TRACE(_T("Error: 错误信息: %s; 文件: %s; 行: %d\n"), "MoveFirst失败", __FILE__, __LINE__);
return false;
};
//
bool MoveLast()
{
List_Iterator = m_CodeList.end();
List_Iterator--;
if (List_Iterator != m_CodeList.end())
{
return true;
}
TRACE(_T("Error: 错误信息: %s; 文件: %s; 行: %d\n"), "MoveLast失败", __FILE__, __LINE__);
return false;
};
//
bool MoveNext()
{
List_Iterator++;
if (List_Iterator != m_CodeList.end())
{
return true;
}
TRACE(_T("Error: 错误信息: %s; 文件: %s; 行: %d\n"), "MoveNext失败", __FILE__, __LINE__);
return false;
};
//
bool MovePrec()
{
List_Iterator--;
if (List_Iterator != m_CodeList.end())
{
return true;
}
TRACE(_T("Error: 错误信息: %s; 文件: %s; 行: %d\n"), "MovePrec失败", __FILE__, __LINE__);
return false;
};
//
bool HasData(){ return true != m_CodeList.empty(); };
//
bool GetData(TICode &GetCode)
{
if (HasData())
{
GetCode = *List_Iterator;
return true;
}
return false;
};
//
bool AddData(TICode SetCode)
{
m_CodeList.push_back(SetCode);
return true;
};
//
bool RemoveData()
{
if (HasData())
{
list<TICode>::iterator Temp_Iterator;
Temp_Iterator = List_Iterator;
List_Iterator++;
m_CodeList.erase(Temp_Iterator);
return true;
}
TRACE(_T("Error: 错误信息: %s; 文件: %s; 行: %d\n"), "RemoveData失败", __FILE__, __LINE__);
return false;
};
//
private:
list<TICode> m_CodeList;
list<TICode>::iterator List_Iterator;
};
#endif
树节点的管理,树本身的实现:
#if !defined(_CLSGUIDETREE_H_)
#define _CLSGUIDETREE_H_
#include "list"
#include "ClsCode.h"
#include "ClsGuideTreeNode.h"
//
using namespace std;
//
class ClsGuideTree;
//
#define CLSGUIDETREE_READLENGTH 1
//
//枚举 指令码
enum Enum_GuideTree_OrderCode{
//创建孩子节点[创建成功、节点移到孩子节点]
Enum_GuideTree_OrderCode_CreateChild = '1',
//创建兄弟节点[创建成功、节点移到兄弟节点]
Enum_GuideTree_OrderCode_CreateBrother = '2',
//添加数据[添加的数据追加到末尾]
Enum_GuideTree_OrderCode_AddListCode = '3',
//读取Key
Enum_GuideTree_OrderCode_ReadKey = '4',
//移到孩子节点
Enum_GuideTree_OrderCode_MoveChild = '5',
//移到下一个兄弟节点
Enum_GuideTree_OrderCode_MoveBrother = '6',
//移动到双亲结点
Enum_GuideTree_OrderCode_MoveParent = '7',
//移动到头结点
Enum_GuideTree_OrderCode_MoveHead = '8',
};
//
//树节点
typedef struct _SParGuideTree_Node{
//映射值
UCHAR m_KeyValue;
//节点数据区
ClsGuideTreeNode<ClsCode> m_NodeData;
//孩子节点
struct _SParGuideTree_Node *pNextChild;
//兄弟节点
struct _SParGuideTree_Node *pNextBrother;
//父亲节点
struct _SParGuideTree_Node *pParent;
}SParGuideTree_Node, *pSParGuideTree_Node;
//
//树节点公用计数
typedef struct SParGuideTree_Share{
//头节点
SParGuideTree_Node m_HeadNode;
//引用计数
UINT m_Count;
//标记
UINT m_Flags;
}SParGuideTree_Share, *pSParGuideTree_Share;
//
//引导树参数
typedef s