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

📄 keywizzard.cpp

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