得到字母和英文的代码如下:
BOOL CData ::OnKeyPressGrid(short FAR* KeyAscii) 
{    switch ( (int) * KeyAscii)
 {case  VK_BACK : //Backspace - delete the last character
   m_Data.Delete  (m_Data.GetLength ()-1,1);
      break;
default :
m_Data = m_Data + (TCHAR *) KeyAscii;
                   break;
   }}
请问,我要如何做才能得到输入的汉字,现在这样得到的是乱码,望高手指点,200分奉上

解决方案 »

  1.   

    是我定义的一个变量
    CString m_Data;
      

  2.   

    我想應該處理 onchar而不是key。
      

  3.   

    我估计KeyAscii只是半个汉字,m_Data = m_Data + (TCHAR *) KeyAscii;这里把它当成一个完整的字符,所以错了
    char cnchar[3];BOOL CData ::OnKeyPressGrid(short FAR* KeyAscii) 
    {    switch ( (int) * KeyAscii)
     {case  VK_BACK : //Backspace - delete the last character
       m_Data.Delete  (m_Data.GetLength ()-1,1);
          break;
    default :
    if(*KeyAscii<0 && cnchar[0]!=0)
    {
    //这是汉字的第二个字节
    cnchar[1]=(*KeyAscii)&0xff;
    cnchar[2]=0;
    m_Data = m_Data + (char *)cnchar;
    cnchar[0]=0;}
    else
    {
    cnchar[0]=(*KeyAscii)&0xff;
    }                   break;
       }}
      

  4.   

    下面一段代码你可参考一下: while(!feof(infile))
    {
    p=0;
    ch=fgetc(infile);
    if((ch>=0xa1)&&(ch<=0xfe))   /*汉字*/
    {
    high_byte=ch;
    low_byte=fgetc(infile);
    ASCII[nWord][0] = high_byte;
    ASCII[nWord][1] = low_byte;
    p=high_byte-0xa1;         /*计算汉字位置*/
    p=p*94+low_byte-0xa1;     /*计算汉字位置*/
    fseek(cclibfile,(long)p*24,SEEK_SET);
    fread(buf,sizeof(unsigned char),24,cclibfile);
     
    }
    else
    {
    if((ch>=32)&&(ch<=126))    /*半角字符*/
    {
    p=ch+155;              /*计算字符位置*/
    ASCII[nWord][0] = ch;
    ASCII[nWord][1] = 0x00;
    }
    else 
    continue;
    fseek(cclibfile,(long)p*24,SEEK_SET);
    fread(buf,sizeof(unsigned char),24,cclibfile);
    fprintf(outfile,"/*");
    fwrite(&ch,sizeof(unsigned char),1,outfile);
    }
    count++;
    fprintf(outfile,"*/static unsigned char code STRING%d[24]={\n",count);
    for(i=0;i<12;i++)
    {
    //  outbuf[i]=buf[i];
    outbuf[2*i]=(buf[2*i]>>4)+0x90;
    outbuf[2*i+1]=(buf[2*i]<<4)+(buf[2*i+1]>>4);
    }
    for(i=0;i<24;i++)
    {
    if(i==23) 
    fprintf(outfile,"0x%x",outbuf[i]);
    else
    fprintf(outfile,"0x%x, ",outbuf[i]);
    if(((i%12)==0)&&(i!=0))
    fprintf(outfile,"\n");
    TxData_word[nWord][i]=outbuf[i];
    }
    fprintf(outfile,"};\n");
    nWord++;
    if(nWord==8)
    break;
    }
    totalWord=nWord;
      

  5.   

    else if(*KeyAscii>127)// please try to compare *KeyAscii with 127 and 0, one of them should work, but I don't know which one:)
    {
    cnchar[0]=(*KeyAscii)&0xff;
    }
    else
    m_Data = m_Data + (TCHAR *) KeyAscii;
      

  6.   

    to masterz() 很遗憾,还是不行:(
      

  7.   

    whatapig(好一头猪)说得很对
    试试看
      

  8.   

    WM_IME_CHAR,我使用的控件没有这个消息
      

  9.   

    我使用的是MSFlexGrid,没这个消息
      

  10.   

    用下面的方法,给控件加上对WM_IME_CHAR的处理.LRESULT CALLBACK (*OldWinProc)(HWND hwnd,
        UINT uMsg, WPARAM wParam, LPARAM lParam);LRESULT CALLBACK NewWinProc(HWND hwnd,
        UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        if (uMsg==WM_IME_CHAR) {
            m_Data = m_Data + (char)(wParam>>8);
            m_Data = m_Data + (char)wParam;
            return 0;
        }
        else //调用以前的窗口消息处理函数
            return OldWinProc(hwnd, uMsg, wParam, lParam);
    }//假设控件的句柄为hWnd:
    OldWinProc = (WNDPROC)::GetWindowLong(hWnd, GWL_WNDPROC);
    ::SetWindowLong(hWnd, GWL_WNDPROC, (LPARAM)NewWinProc);
      

  11.   

    WM_CHAR应该可以,
    函数afx_msg void OnChar(UINT nChar,UINT nRepCnt,UINT nFlags);
    nChar 是输入的ASCII码
    nRepCnt 是重复个数
    nFlags 为:
    0-7位 扫描码
    //一下与本题无关,略
    当输入汉字时,系统会产生连续两个WM_CHAR,第一个时低字节,第二个时高字节
    扫描码为零
    知道了这些,剩下的就看你的了。
      

  12.   

    To 0313700000(不知道为什么):
    还没有搞定吗,上面的代码我是实际测试过的。最后的2行
    //假设控件的句柄为hWnd:
    OldWinProc = (WNDPROC)::GetWindowLong(hWnd, GWL_WNDPROC);
    ::SetWindowLong(hWnd, GWL_WNDPROC, (LPARAM)NewWinProc);
    需要放在窗口已经创建之后写,因为需要用到控件的窗口句柄。
      

  13.   

    TO jishiping(JSP 季世平) ,你的方式可以
    另,我想知道使用KeyPress的方式怎么解决这个问题,masterz() 的分析应该是对的,怎么实际解决呢,苦恼中~~
      

  14.   

    是不是处理KeyPress就得不到正确结果,谁能给个答案
      

  15.   

    KeyPress消息被输入法程序接受了,每个汉字都收到2个WM_CHAR(也许是WM_IME_CHAR)消息,KeyPress大概不行.
      

  16.   

    我做了测试。对于一个一般的窗口来说,对于每个汉字,窗口会收到两次消息
    WM_CHAR,可是对于一个Edit来说,每个汉字,只能收到一次WM_CHAR消息,消
    息的参数wParam存放的就只是汉字的第一个字节。对于可接受键盘输入的控件来说,Windows故意做了一些手脚,让程序来区别对待WM_CHAR和WM_IME_CHAR.
    在我的测试当中,发现Edit还可以收到半个汉字的WM_CHAR消息,而RichEdit
    连半个汉字的WM_CHAR都收不到。所以,我的结论就是,对于Edit来说,不能
    用KeyPress事件(也就是WM_CHAR消息)处理输入的汉字。而一般窗口,即使
    输入汉字,也可以用WM_CHAR拦截到输入的汉字,而不一定要用WM_IME_CHAR
    来拦截。