“outtextxy”: 2 个重载中没有一个可以转换所有参数类型

0

参考 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;
}

ava
张津瑞

2021-12-12

0

用 EasyX 写文本框,请参考:https://qa.codebus.cn/question/127

你遇到的问题是字符集设置的问题。针对你的代码,请确保你的项目使用 Unicode 字符集设置。

ava
慢羊羊

2021-12-12

技术讨论社区