📄 keywizzard.cpp
字号:
m_yPos = top;
m_cPosState = 0;
m_EditOnTop = bEditOnTop;
}
void CKeyWizzard::SetPosRB(int right, int bottom, BOOL bEditOnTop)
{
//m_xPos = right-175;
//m_yPos = bottom-211-45;
m_xPos = right;
m_yPos = bottom;
m_cPosState = 3;
m_EditOnTop = bEditOnTop;
}
void CKeyWizzard::SetEditBoxSize(SIZE size)
{
m_sEditBox = size;
}
void CKeyWizzard::SetEditBoxSize(int cx, int cy)
{
m_sEditBox.cx = cx;
m_sEditBox.cy = cy;
}
void CKeyWizzard::Compare(char *strEdit)
{
int i, k = 0;
char strPinyin[20];
m_nResultCount = 0;
for (i = 0;i < int(m_nTableCount);i++)
{
if (m_KeyTable[i]->Status == 1)
{
for (int j = 0; j < m_KeyTable[i]->Count; j++)
{
if( m_nInputType == 0 )
{
int grade1 = 0;
int grade2 = 0;
int grade3 = 0;
//modified by _L_K at 2003/11/17 因为strEdit已经全部转换成大写的了,然而比较函数没有进行忽略大小写的比较,
//所以在比较code的时候,把code也转换成大写进行匹配处理.
grade1 = CompareKeyStr(strEdit,strupr(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 )
{
int 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++;
}//若匹配成功,记录最匹配级别,将结果放到记录集中
}
if( 1 == m_nInputType ) //汉字匹配 2004/06/11 _L_K
{
CString strOutput;
CString strMapName( m_KeyTable[i]->pDate[j].Name ), strBuf( strEdit );
if( strBuf.IsEmpty() ) break;
if( strMapName.Find( strBuf ) == 0 )
{
if (strcmp(m_KeyTable[i]->pDate->Code, "") == 0)
strOutput.Format("%s", m_KeyTable[i]->pDate[j].Name);
else
{
int n = 17 - strlen(m_KeyTable[i]->pDate[j].Name)-strlen(m_KeyTable[i]->pDate->Code );
if (n<1) n=1;
strOutput.Format("%s%*s%s", m_KeyTable[i]->pDate[j].Name,n ," ",m_KeyTable[i]->pDate->Code);
}
m_pResult[k].index = i*10000+j;
m_pResult[k].grade = 1;
k++;
}
}
}
}//只查询处于激活状态的注册表
}
m_nResultCount = k ;
SetList();
}
/*****************************************************************************
【函数名称】
SetList()
【函数功能】
//设置LIST内容
【使用情况】
在OnInitDialog() 被调用过一次
在OnChangeEdit() 被调用过一次
*****************************************************************************/
void CKeyWizzard::SetList()
{
int i;
int j;
int min;
int tempindex;
int tempgrade;
bool flag;
int itemdate;
char strNameCode[50];
UpdateData(true);
m_List.ResetContent();
if (m_nResultCount > 0 )
{
for (j=0 ; j < m_nResultCount-1; j++)
{ flag = false;
for (i=0 ;i < m_nResultCount-j-1; i++)
{
min = m_pResult[i].grade ;
if (min > m_pResult[i+1].grade)
{ flag = true;
tempgrade = m_pResult[i].grade ;
tempindex = m_pResult[i].index ;
m_pResult[i].grade = m_pResult[i+1].grade;
m_pResult[i].index = m_pResult[i+1].index;
m_pResult[i+1].grade = tempgrade;
m_pResult[i+1].index = tempindex;
}
}
if (! flag)
{break;}
}//对结果集进行排序
/* //对同一级别下的code进行排序
SORTDATA SortData[MAX_COMPATIBLE_NUM];
memset(&SortData, 0, sizeof(SORTDATA)*MAX_COMPATIBLE_NUM);
int nOldGrade = m_pResult[0].grade;
int nOldPos = 0, nNum=0;
for (i=0 ;i < m_nResultCount; i++)
{
itemdate = m_pResult[i].index;
SortData[i].nItemData = itemdate;
//sprintf(strNameCode,"%-10s%10s", m_KeyTable[(int)(itemdate/10000)]->pDate[(int)(itemdate%10000)].Name,m_KeyTable[(int)(itemdate/10000)]->pDate[(int)(itemdate%10000)].Code);
//sprintf(strNameCode, "%-12s %10s", m_KeyTable[itemdate/10000]->pDate[itemdate%10000].Name, m_KeyTable[itemdate/10000]->pDate[itemdate%10000].Code);
sprintf(SortData[i].szCode, "%s", m_KeyTable[itemdate/10000]->pDate[itemdate%10000].Code);
sprintf(SortData[i].szName, "%s", m_KeyTable[itemdate/10000]->pDate[itemdate%10000].Name);
nNum ++;
if(nOldGrade != m_pResult[i].grade)
{
if(1 < nNum)
{
qsort(&SortData+nOldPos, nNum, sizeof(SORTDATA), SortCompare);
}
for(j=nOldPos;j<nOldPos+nNum;j++)
{
sprintf(strNameCode, "%-10s%-10s", SortData[j].szCode, SortData[j].szName);
m_List.SetItemData( m_List.AddString(strNameCode), SortData[j].nItemData);
}
nNum = 0;
nOldGrade = m_pResult[i].grade;
nOldPos = i;
}
}//放入LIST*/
for (i=0 ;i < m_nResultCount; i++)
{
itemdate = m_pResult[i].index;
//sprintf(strNameCode,"%-10s%10s", m_KeyTable[(int)(itemdate/10000)]->pDate[(int)(itemdate%10000)].Name,m_KeyTable[(int)(itemdate/10000)]->pDate[(int)(itemdate%10000)].Code);
//sprintf(strNameCode, "%-12s %10s", m_KeyTable[itemdate/10000]->pDate[itemdate%10000].Name, m_KeyTable[itemdate/10000]->pDate[itemdate%10000].Code);
sprintf(strNameCode, "%-10s%-10s", m_KeyTable[itemdate/10000]->pDate[itemdate%10000].Code, m_KeyTable[itemdate/10000]->pDate[itemdate%10000].Name);
m_List.SetItemData( m_List.AddString(strNameCode),itemdate);
}//放入LIST
m_nResultCount = 0;
m_List.SetCurSel(0);
}
UpdateData(false);
}
/*****************************************************************************
【函数名称】
PutIntoResult(int IndexOfKeyTable, int IndexOfKeyPdate, int IndexOfResultPdate,int type)
【函数功能】
将匹配记录添加到结果集中
【参数】
int IndexOfKeyTable //KeyTable的下标
int IndexOfKeyPdate //KeyTable->pDate的下标
int IndexOfResultPdate //Result->pDate的下标
int type //结果集初始化的FLAG.0:初始化;1:追加记录
【使用情况】
在OnInitDialog() 被调用过三次
在OnChangeEdit() 被调用过九次
*****************************************************************************/
/*CKeyWizzard::PutIntoResult(int IndexOfKeyTable, int IndexOfKeyPdate, int IndexOfResultPdate,int type)
{
char strNameCode[50];
if(IndexOfResultPdate==0)
{
m_pResult[m_nResultCount].pDate = (TaKeyTable *)malloc( (1) *(sizeof(TaKeyTable)) );
::ZeroMemory(m_pResult[m_nResultCount].pDate,sizeof(TaKeyTable)*1);
m_nResultCount++;
}
else
{
m_pResult[m_nResultCount-1].pDate = (TaKeyTable *)realloc(m_pResult[m_nResultCount-1].pDate, (IndexOfResultPdate+1) * (sizeof(TaKeyTable)) );
strcpy(m_pResult[m_nResultCount-1].pDate[IndexOfResultPdate].Code,"");
strcpy(m_pResult[m_nResultCount-1].pDate[IndexOfResultPdate].Name,"");
}//为m_Result[m_nResultCount-1].pDate分配空间结束
switch (type)
{
case 0:
//将匹配记录添加到结果集中
m_pResult[0].pDate[IndexOfResultPdate].lParam = IndexOfKeyTable*10000+IndexOfKeyPdate;
strcpy(m_pResult[0].value , m_EditStr.Right(1));
strcpy(m_pResult[0].pDate[IndexOfResultPdate].Code , m_KeyTable[IndexOfKeyTable]->pDate[IndexOfKeyPdate].Code);
strcpy(m_pResult[0].pDate[IndexOfResultPdate].Name , m_KeyTable[IndexOfKeyTable]->pDate[IndexOfKeyPdate].Name);
//将匹配记录添加到列表中,记录一个数字标示到列表项的数据
sprintf(strNameCode,"%-10s%10s",m_pResult[m_nResultCount-1].pDate[IndexOfResultPdate].Name,m_pResult[m_nResultCount-1].pDate[IndexOfResultPdate].Code);
m_List.SetItemData( m_List.AddString(strNameCode),IndexOfKeyTable*10000+IndexOfKeyPdate);
break;
case 1:
//将匹配记录添加到结果集中
m_pResult[m_nResultCount - 1].pDate[IndexOfResultPdate].lParam = m_pResult[IndexOfKeyTable].pDate[IndexOfKeyPdate].lParam;
strcpy(m_pResult[m_nResultCount - 1].value , m_EditStr.Right(1));
strcpy(m_pResult[m_nResultCount - 1].pDate[IndexOfResultPdate].Code , m_pResult[IndexOfKeyTable].pDate[IndexOfKeyPdate].Code);
strcpy(m_pResult[m_nResultCount - 1].pDate[IndexOfResultPdate].Name, m_pResult[IndexOfKeyTable].pDate[IndexOfKeyPdate].Name);
//将匹配记录添加到列表中,记录一个数字标示到列表项的数据
sprintf(strNameCode,"%-10s%10s",m_pResult[m_nResultCount - 1].pDate[IndexOfResultPdate].Name,m_pResult[m_nResultCount - 1].pDate[IndexOfResultPdate].Code);
m_List.SetItemData( m_List.AddString(strNameCode),m_pResult[m_nResultCount - 1].pDate[IndexOfResultPdate].lParam);
break;
}
}
*/
void CKeyWizzard::OnClose()
{
// TODO: Add your message handler code here and/or call default
if( m_pResult!=NULL )
{
delete [] m_pResult;
m_pResult = NULL;
}
m_nResultCount = 0;
CDialog::OnClose();
}
BOOL CKeyWizzard::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if( pMsg->message==WM_KEYDOWN )
{
switch( pMsg->wParam )
{
case VK_UP:
case VK_DOWN:
case VK_PRIOR:
case VK_NEXT:
pMsg->hwnd = m_List.GetSafeHwnd();
break;
default:
pMsg->hwnd = m_Edit.GetSafeHwnd();
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
// CMyListBox is my owner-drawn list box derived from CListBox. This
// example draws an item's text centered vertically and horizontally. The
// list box control was created with the following code:
// pmyListBox->Create(
// WS_CHILD|WS_VISIBLE|WS_BORDER|WS_HSCROLL|WS_VSCROLL|
// LBS_SORT|LBS_MULTIPLESEL|LBS_OWNERDRAWVARIABLE,
// myRect, pParentWnd, 1);
//
/*void CMyListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
ASSERT(lpDrawItemStruct->CtlType == ODT_LISTBOX);
LPCTSTR lpszText = (LPCTSTR) lpDrawItemStruct->itemData;
ASSERT(lpszText != NULL);
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
// Save these value to restore them when done drawing.
COLORREF crOldTextColor = dc.GetTextColor();
COLORREF crOldBkColor = dc.GetBkColor();
// If this item is selected, set the background color
// and the text color to appropriate values. Also, erase
// rect by filling it with the background color.
if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&
(lpDrawItemStruct->itemState & ODS_SELECTED))
{
dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));
dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));
dc.FillSolidRect(&lpDrawItemStruct->rcItem,
::GetSysColor(COLOR_HIGHLIGHT));
}
else
dc.FillSolidRect(&lpDrawItemStruct->rcItem, crOldBkColor);
// If this item has the focus, draw a red frame around the
// item's rect.
if ((lpDrawItemStruct->itemAction | ODA_FOCUS) &&
(lpDrawItemStruct->itemState & ODS_FOCUS))
{
CBrush br(RGB(255, 0, 0));
dc.FrameRect(&lpDrawItemStruct->rcItem, &br);
}
// Draw the text.
dc.DrawText(
lpszText,
strlen(lpszText),
&lpDrawItemStruct->rcItem,
DT_CENTER|DT_SINGLELINE|DT_VCENTER);
// Reset the background color and the text color back to their
// original values.
dc.SetTextColor(crOldTextColor);
dc.SetBkColor(crOldBkColor);
dc.Detach();
}
*/
//暂时不用
static int SortCompare( const void *arg1, const void *arg2 )
{
SORTDATA *pSort1 = (SORTDATA *)arg1;
SORTDATA *pSort2 = (SORTDATA *)arg2;
return(strcmp(pSort1->szCode, pSort2->szCode));
}
//当m_nType为1时,键盘经历即使没有输入任何字符也不关闭;同理,要求
//KeyWizzard对话框弹出时即使没有输入任何字符,也要显示内容。于是,
//我们就把说有内容都显示出来吧 20040421
void CKeyWizzard::NothingCompareButShow()
{
int i, k = 0;
m_nResultCount = 0;
for (i = 0;i < int(m_nTableCount);i++)
{
if (m_KeyTable[i]->Status == 1)
{
for (int j = 0; j < m_KeyTable[i]->Count; j++)
{
if ( k<MAX_COMPATIBLE_NUM )
{
m_pResult[k].index = i*10000+j;
m_pResult[k].grade = 0;
k++;
}//把所有条目都认为时匹配的,结果放到记录集中
}
}//只查询处于激活状态的注册表
}
m_nResultCount = k ;
SetList();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -