得到字母和英文的代码如下:
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分奉上
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分奉上
CString m_Data;
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;
}}
{
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;
{
cnchar[0]=(*KeyAscii)&0xff;
}
else
m_Data = m_Data + (TCHAR *) KeyAscii;
试试看
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);
函数afx_msg void OnChar(UINT nChar,UINT nRepCnt,UINT nFlags);
nChar 是输入的ASCII码
nRepCnt 是重复个数
nFlags 为:
0-7位 扫描码
//一下与本题无关,略
当输入汉字时,系统会产生连续两个WM_CHAR,第一个时低字节,第二个时高字节
扫描码为零
知道了这些,剩下的就看你的了。
还没有搞定吗,上面的代码我是实际测试过的。最后的2行
//假设控件的句柄为hWnd:
OldWinProc = (WNDPROC)::GetWindowLong(hWnd, GWL_WNDPROC);
::SetWindowLong(hWnd, GWL_WNDPROC, (LPARAM)NewWinProc);
需要放在窗口已经创建之后写,因为需要用到控件的窗口句柄。
另,我想知道使用KeyPress的方式怎么解决这个问题,masterz() 的分析应该是对的,怎么实际解决呢,苦恼中~~
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
来拦截。