参考 https://qa.codebus.cn/question/1935 代码,发现在运行时始终会在80,81行的outtextxy报错。经上网查询,是字符集的问题,但是在属性中改为使用多字符字符集也未能解决问题。
编译环境 VS2019+Easyx_20210730
报错如下:
错误(活动) E0304 没有与参数列表匹配的 重载函数 "textwidth" 实例 PBLF C:\Users\Prokaroty\source\repos\PBLF\源.cpp 81
错误(活动) E0304 没有与参数列表匹配的 重载函数 "outtextxy" 实例 PBLF C:\Users\Prokaroty\source\repos\PBLF\源.cpp 80
错误 C2665 “outtextxy”: 2 个重载中没有一个可以转换所有参数类型 PBLF C:\Users\Prokaroty\source\repos\PBLF\源.cpp 82
错误 C2665 “textwidth”: 2 个重载中没有一个可以转换所有参数类型 PBLF C:\Users\Prokaroty\source\repos\PBLF\源.cpp 83
#include <easyx.h>
#include <conio.h>
#include <string>
#pragma comment(lib,"Imm32.lib")
using namespace std;
wstring GetIMEString()
{
// 术语说明:以输入“中国”为例
// 切换到中文输入法后,输入“zhongguo”,这个字符串称作“IME 组成字符串”
// 而在输入法列表中选择的字符串“中国”则称作“IME 结果字符串”
wstring str; // 返回的字符串
HWND hWnd = GetHWnd();
HIMC hIMC = ImmGetContext(hWnd); // 获取 IMC 句柄
if (hIMC == NULL)
return str;
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 结果字符串
{
dwSize = ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, NULL, 0); // 获取 IME 结果字符串的大小
if (dwSize > 0) // 如果 IME 结果字符串不为空,且没有错误
{
// 为获取 IME 结果字符串分配空间
wchar_t* lpWideStr = new WCHAR[dwSize / sizeof(wchar_t) + 1];
ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, lpWideStr, dwSize); // 获取 IME 结果字符串
lpWideStr[dwSize / sizeof(wchar_t)] = '\0'; // 补充字符串结尾 0 字符
str = lpWideStr; // 添加到 string 中
delete[]lpWideStr; // 释放空间
}
flag = false;
}
ImmReleaseContext(hWnd, hIMC); // 释放 HIMC
return str;
}
int main()
{
initgraph(640, 480, EW_SHOWCONSOLE); // 创建绘图窗口
// 画文本框
rectangle(10, 18, 630, 42);
int x = 12; // 文字输出的位置。每输出一个,坐标相应增加
int ncursor = 0; // 实现光标闪烁的计数器
while (true)
{
// 输出文字
if (_kbhit()) // ASCII 字符输入
{
wchar_t c = _getwch();
outtextxy(x, 22, c);
x += textwidth(c);
}
else // 除此之外,检测是否有 IME 输入,如果有,输出
{
wstring s = GetIMEString();
if (s.size() > 0)
{
这里会报错 outtextxy(x, 22, s.c_str());
这里会报错 x += textwidth(s.c_str());
}
}
// 绘制光标
setlinecolor((ncursor++ / 10 % 2 == 0) ? WHITE : BLACK);
line(x + 2, 23, x + 2, 37);
// 延时
Sleep(20);
}
closegraph();
return 0;
}