Junkoth15 2022-04-15 13:04 采纳率: 73.3%
浏览 165
已结题

c语言如何调用windows中文输入框?

如题
大一超市管理系统用,或者用easyx实现的中文输入也可以asjkhdhashjdjksahkdasjksdljsaldjlassjld

  • 写回答

1条回答 默认 最新

  • 陆海潘江小C 2020CSDN博客之星Top85 2022-04-15 19:44
    关注

    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();
    }
    
    

    若有帮助,希望题主采纳

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月19日
  • 修改了问题 4月15日
  • 修改了问题 4月15日
  • 创建了问题 4月15日