📄 keywizzard.cpp
字号:
chIn [in] 输入字符串
【返回值】
0 成功
其他值 为其他失败代码
【使用情况】
仅在OnInitDialog() 被调用过一次
*****************************************************************************/
DWORD CKeyWizzard::InputFirstChar(char chIn)
{
//strcpy(m_szKeyBuffer,""); //清空缓存区
if( chIn == 127 )
m_nInputType = 1;
else
m_nInputType = 0;
m_FirstChar = 0;
if ((chIn >= '0') && (chIn <= '9') ||(chIn >= 'A') && (chIn <= 'Z') || (chIn >= 'a') && (chIn <= 'z') || chIn == '*' || chIn == '?')
{
//itoa(chIn,m_szKeyBuffer,16); //向键盘缓存区填写第一个字符的ASCII
m_FirstChar = chIn; //记录传入的第一个字符
return 0;
}
return 1;
}
BOOL CKeyWizzard::OnInitDialog()
{
if( m_pResult==NULL )
m_pResult = new Result[MAX_COMPATIBLE_NUM];
m_nResultCount = 0;
//dbprintf("\nm_nResultCount %d , m_pResult %08x , m_nTableCount %d", m_nResultCount, m_pResult, m_nTableCount);
// TODO: Add extra initialization here
m_EditStr = m_FirstChar; //将传入的第一个字符带入"输入框"
UpdateData(false);
m_Edit.SetFocus(); //"输入框"得到"焦点"
m_Edit.SetSel(2,2,false); //使"焦点"停在"第一个字符"后面
char strEdit[20];
strcpy(strEdit, m_EditStr);
if(strlen(strEdit)<=0 && m_nType == 1)//strcpy(strEdit, "00");
{
NothingCompareButShow();
}
else
Compare(strEdit);
/*int i = 0; //m_KeyTable的记数标识
int j = 0; //m_KeyTable.pDate的记数标识
int k = 0; //m_pResult1的记数标识
int grade = 9999; //记录级别
int grade1 = 0; //记录code匹配级别
int grade2 = 0; //记录一般汉字匹配级别
int grade3 = 0; //记录多音字匹配级别
char strPinyin[20]; //汉字的拼音码
char FirstChar[]={toupper(m_FirstChar),'\0'}; //将字符m_FirstChar转换成字符串FirstChar
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_nResultCount = 0;
m_EditStr = m_FirstChar; //将传入的第一个字符带入"输入框"
UpdateData(false);
m_Edit.SetFocus(); //"输入框"得到"焦点"
m_Edit.SetSel(2,2,false); //使"焦点"停在"第一个字符"后面
//dbprintf("\n before comp ");
for (i = 0;i < int(m_nTableCount);i++)
{
if (m_KeyTable[i]->Status == 1)
{
//dbprintf("\nNo %d , count is %d ", i, m_KeyTable[i]->Count);
for (j = 0; j < m_KeyTable[i]->Count; j++)
{
if (((m_FirstChar >= '0') && (m_FirstChar <= '9')) || ( (m_FirstChar >= 'A') && (m_FirstChar <= 'Z') || (m_FirstChar >= 'a') && (m_FirstChar <= 'z') ))
{
grade1 = 0;
grade2 = 0;
grade3 = 0;
grade1 = CompareKeyStr(FirstChar,m_KeyTable[i]->pDate[j].Code); //和code匹配
if (ConvertChineseStr(m_KeyTable[i]->pDate[j].Name,strPinyin,0) == 0 )
{
grade2 = CompareKeyStr(strupr(FirstChar),strPinyin);
}//一般汉字匹配
if (ConvertChineseStr(m_KeyTable[i]->pDate[j].Name,strPinyin,1) == 0 )
{
grade3 = CompareKeyStr(strupr(FirstChar),strPinyin);
}//用多音字匹配
//dbprintf("\nComp %d result is %d %d %d k=%d", j, grade1,grade2,grade3,k);
if ((grade1+grade2+grade3) > 0 && k<MAX_COMPATIBLE_NUM )
{
grade = 9999;
if (grade > grade1 && (grade1!=0))
{ grade = grade1;}
if (grade > grade2 && (grade2!=0))
{ grade = grade2;}
if (grade > grade3 && (grade3!=0))
{ grade = grade3;}
m_pResult[k].index = i*10000+j;
m_pResult[k].grade = grade;
k++;
}//若匹配成功,记录最匹配级别,将结果放到记录集中
}//判断输入字符是否合法
}
}//只查询处于激活状态的注册表
}
m_nResultCount = k ;
//dbprintf("\n comp ok %d ", m_nResultCount);
SetList();*/
//this->SetWindowPos(&wndTop,m_xPos,m_yPos,0,0,SWP_NOSIZE );
if( m_cPosState )
{
CRect rect;
GetClientRect(rect);
if( m_cPosState&1 )
m_yPos -= rect.Height();
if( m_cPosState&2 )
m_xPos -= rect.Width();
}
this->SetWindowPos(&wndTop, m_xPos, m_yPos, 0, 0, SWP_NOSIZE);
if( m_EditOnTop )
{
CRect r1,r2,rect;
m_List.GetWindowRect(r1);
m_Edit.GetWindowRect(r2);
int y = r2.top-r1.bottom;
if( y<0 ) y = r1.top-r2.bottom;
GetClientRect(rect);
rect.DeflateRect(2,2);
rect.right = rect.left+r2.Width();
rect.bottom = rect.top+r2.Height();
if( m_sEditBox.cx>0 && m_sEditBox.cy>0 )
{
r2.CopyRect(rect);
r2.right = r2.left+m_sEditBox.cx;
r2.bottom = r2.top+m_sEditBox.cy;
m_Edit.MoveWindow(r2);
}
else
m_Edit.MoveWindow(rect);
rect.top = rect.bottom+y;
rect.right = rect.left+r1.Width();
rect.bottom = rect.top+r1.Height();
m_List.MoveWindow(rect);
}
/*else if( m_sEditBox.cx>0 && m_sEditBox.cy>0 )
{
CRect rect;
m_Edit.GetClientRect(rect);
rect.right = rect.left+m_sEditBox.cx;
rect.bottom = rect.top+m_sEditBox.cy;
m_Edit.MoveWindow(rect);
}*/
return false;
// EXCEPTION: OCX Property Pages should return FALSE
}
void CKeyWizzard::OnCancelMode()
{
CDialog::OnCancelMode();
EndDialog(IDCANCEL);
// TODO: Add your message handler code here
}
void CKeyWizzard::OnChangeEdit()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
int i = 0; //m_KeyTable的记数标识
int j = 0; //m_KeyTable.pDate的记数标识
int k = 0; //m_pResult的记数标识
int grade = 9999;
int grade1 = 0;
int grade2 = 0;
int grade3 = 0;
//int nstrEditLen;
//char strPinyin[20]; //汉字的拼音码
//char strEdit[20]; //字符串形式的编辑框内容
//char strAscii[10]; //编辑框字串的Ascii码
UpdateData(true);
//吴昊添加03/10/17
if((m_EditStr == "" || m_EditStr.GetLength()<=0) && m_nType == 0)
{
m_List.ResetContent();
OnCancel();
return;
}
char strEdit[20];
strcpy(strEdit, m_EditStr);
Compare(strEdit);
//strcpy(m_szKeyBuffer,"");
//strcpy(strEdit,m_EditStr); // 把编辑框中的内容转成字符串
//nstrEditLen = strlen(strEdit);
//for (i = 0; i < nstrEditLen; i++)
//{
// itoa(strEdit[i],strAscii,16);
// strcat(m_szKeyBuffer,strAscii);
//}
/*for (i = 0;i < int(m_nTableCount);i++)
{
if (m_KeyTable[i]->Status == 1)
{
for (j = 0; j < m_KeyTable[i]->Count; j++)
{
grade1 = 0;
grade2 = 0;
grade3 = 0;
grade1 = CompareKeyStr(strEdit,m_KeyTable[i]->pDate[j].Code); //和code匹配
if (ConvertChineseStr(m_KeyTable[i]->pDate[j].Name,strPinyin,0) == 0 )
{
grade2 = CompareKeyStr(strupr(strEdit),strPinyin);
}//一般汉字匹配
if (ConvertChineseStr(m_KeyTable[i]->pDate[j].Name,strPinyin,1) == 0 )
{
grade3 = CompareKeyStr(strupr(strEdit),strPinyin);
}//用多音字匹配
if ((grade1+grade2+grade3) > 0 && k<MAX_COMPATIBLE_NUM )
{
grade = 9999;
if (grade > grade1 && (grade1!=0))
{ grade = grade1;}
if (grade > grade2 && (grade2!=0))
{ grade = grade2;}
if (grade > grade3 && (grade3!=0))
{ grade = grade3;}
m_pResult[k].index = i*10000+j;
m_pResult[k].grade = grade;
k++;
}//若匹配成功,记录最匹配级别,将结果放到记录集中
}
}//只查询处于激活状态的注册表
}
m_nResultCount = k ;
SetList();*/
}
void CKeyWizzard::OnDblclkList()
{
// TODO: Add your control notification handler code here
int itemdate;
//根据列表框中的当前行获得选项,发送消息给选项对应的窗口
if (m_List.GetCurSel() == LB_ERR)
{
itemdate = -1;
}
else
{
itemdate = m_List.GetItemData(m_List.GetCurSel());
}
::PostMessage(m_KeyTable[(int)(itemdate/10000)]->hWnd,m_KeyTable[(int)(itemdate/10000)]->MsgId,m_KeyTable[(int)(itemdate/10000)]->pDate[(int)(itemdate%10000)].wParam,m_KeyTable[(int)(itemdate/10000)]->pDate[(int)(itemdate%10000)].lParam);
//strcpy(m_szKeyBuffer,""); //清空字符输入缓冲
m_List.ResetContent(); //清空列表框
this->SendMessage(WM_CLOSE,0,0); //结束会话,关闭窗口
}
/*****************************************************************************
【函数名称】
char* FilePath)
【函数功能】
初始化多音字列表
【参数】
char* FilePath //Tri.ini路径
【返回值】
0 表示成功
1 表示失败
【使用情况】
该类的Dlg初始化时使用
*****************************************************************************/
DWORD CKeyWizzard::Init(char* FilePath)
{
int linemax = 150;
int i = 0;
int j = 0;
char buff[150];
char temp1[2];
char temp2[3];
CString Tri;
FILE *rFile;
TCHAR Path_temp[128];
sprintf(Path_temp,"%s\\%s",FilePath,"Tri.INI");
if((rFile=fopen(Path_temp,"r")) != NULL)
{
if( fgets(buff,linemax,rFile) != NULL)
{
Tri = buff;
if( Tri.GetLength()>4 )
Tri = Tri.Mid(4);
else
Tri = "";
}
fclose(rFile);
}
else
{
return 1;
}
m_nTrilen = Tri.GetLength()/3; //多音字列表长度
while (i < m_nTrilen)
{
strcpy(temp1,"");
strcpy(temp1, Tri.Mid(j+2,1));
tri[i].ch = temp1[0];
strcpy(temp2,"");
strcpy(temp2, Tri.Mid(j,2));
tri[i].quwei =(unsigned char)temp2[0] * 256 + (unsigned char)temp2[1];
i++;
j = j + 3;
}
return 0;
}
void CKeyWizzard::OnOK()
{
// TODO: Add extra validation here
int itemdate;
//根据列表框中的当前行获得选项,发送消息给选项对应的窗口
if (m_List.GetCurSel() == LB_ERR)
{
itemdate = -1;
}
else
{
itemdate = m_List.GetItemData(m_List.GetCurSel());
::PostMessage(m_KeyTable[(int)(itemdate/10000)]->hWnd,m_KeyTable[(int)(itemdate/10000)]->MsgId,(WPARAM)m_KeyTable[(int)(itemdate/10000)]->pDate[(int)(itemdate%10000)].Code, (LPARAM)m_KeyTable[(int)(itemdate/10000)]->pDate[(int)(itemdate%10000)].Name);
}
//strcpy(m_szKeyBuffer,""); //清空字符输入缓冲
m_List.ResetContent(); //清空列表框
CDialog::OnOK();
}
/*****************************************************************************
【函数名称】
SetPos(int xPos,int yPos)
【函数功能】
//设置窗口的位置
【参数】
int xPos //窗口左上角的X坐标
int yPos //窗口左上角的Y坐标
【使用情况】
该类的Dlg初始化时使用
*****************************************************************************/
/*void CKeyWizzard::SetPos(int xPos,int yPos)
{
m_xPos=xPos;
m_yPos=yPos;
}*/
void CKeyWizzard::SetPosLT(int left, int top, BOOL bEditOnTop)
{
m_xPos = left;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -