stophin stophin
关注数: 70 粉丝数: 63 发帖数: 1,928 关注贴吧数: 145
输入中文问题 完美解决!! #include <easyx\graphics.h> #include <conio.h> #include <windows.h> #include <string> using namespace std; void GetIMEString(HWND hWnd,string& str) { HIMC hIMC=ImmGetContext(hWnd);//获取HIMC if (hIMC) { //这里先说明一下,以输入“中国”为例 //切换到中文输入法后,输入“zhongguo”,这个字符串称作IME组成字符串 //而在输入法列表中选择的字符串“中国”则称作IME结果字符串 static bool flag=false;//输入完成标记:在输入中时,IME组成字符串不为空,置true;输入完成后,IME组成字符串为空,置false DWORD dwSize=ImmGetCompositionStringW(hIMC,GCS_COMPSTR,NULL,0);//获取IME组成输入的字符串的长度 if (dwSize>0)//如果IME组成字符串不为空,且没有错误(此时dwSize为负值),则置输入完成标记为true { if (flag==false) { flag=true; } } else if (dwSize==0&&flag)//如果IME组成字符串为空,并且标记为true,则获取IME结果字符串 { int iSize;//IME结果字符串的大小 LPSTR pszMultiByte=NULL;//IME结果字符串指针 int ChineseSimpleAcp=936;//宽字节转换时中文的编码 WCHAR *lpWideStr=NULL;//宽字节字符数组 dwSize=ImmGetCompositionStringW(hIMC,GCS_RESULTSTR,NULL,0);//获取IME结果字符串的大小 if (dwSize>0)//如果IME结果字符串不为空,且没有错误 { dwSize+=sizeof(WCHAR);//大小要加上NULL结束符 //为获取IME结果字符串分配空间 if (lpWideStr) { delete []lpWideStr; lpWideStr=NULL; } lpWideStr=new WCHAR[dwSize]; memset(lpWideStr,0,dwSize);//清空结果空间 ImmGetCompositionStringW(hIMC,GCS_RESULTSTR,lpWideStr,dwSize);//获取IME结果字符串,这里获取的是宽字节 iSize=WideCharToMultiByte(ChineseSimpleAcp,0,lpWideStr,-1,NULL,0,NULL,NULL);//计算将IME结果字符串转换为ASCII标准字节后的大小 //为转换分配空间 if (pszMultiByte) { delete [] pszMultiByte; pszMultiByte=NULL; } pszMultiByte=new char[iSize+1]; WideCharToMultiByte(ChineseSimpleAcp,0,lpWideStr,-1,pszMultiByte,iSize,NULL,NULL);//宽字节转换 pszMultiByte[iSize]='\0'; str+=pszMultiByte;//添加到string中 //释放空间 if (lpWideStr) { delete []lpWideStr; lpWideStr=NULL; } if (pszMultiByte) { delete [] pszMultiByte; pszMultiByte=NULL; } } flag=false; } ImmReleaseContext(hWnd,hIMC);//释放HIMC } } void main() { initgraph(640, 480); // 创建绘图窗口HWND hWnd=GetHWnd(); BeginBatchDraw(); // 设置批绘图模式 string str; while(true) { if (kbhit())//如果是ASCII输入 { char c=getch(); if (c=='\b') { if (str.length()>0) { if (str.at(str.length()-1)&0x8000) str.erase(str.end()-1); str.erase(str.end()-1); } } else if (c==27) { } else { str+=c; } } else//除此之外,检测是否有IME输入,如果有,则将输入结果添加到string中 { GetIMEString(hWnd,str); } if (str.length()>100) str=""; outtextxy(0,0,str.c_str()); FlushBatchDraw(); // 延时 Sleep(15); cleardevice(); } closegraph(); }
1 下一页