如题
大一超市管理系统用,或者用easyx实现的中文输入也可以asjkhdhashjdjksahkdasjksdljsaldjlassjld
c语言如何调用windows中文输入框?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
关注easyx实现的中文输入,注释比较详细,可具体查看。
若有帮助,希望题主采纳#include <graphics.h> #include <conio.h> #include <windows.h> #include <string> #pragma comment(lib,"Imm32.lib") 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()); if (strcmp(str.c_str(), "司严豪最6") == 0) { str = ""; } FlushBatchDraw(); // 延时 Sleep(15); cleardevice(); } closegraph(); }若有帮助,希望题主采纳
解决 无用评论 打赏 举报 编辑记录