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

📄 keywizzard.cpp

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