Winapi Win API错误的文本框输出
我一直在尝试使用代码块构建一个简单的WinAPI程序,但遇到了一个奇怪的问题Winapi Win API错误的文本框输出,winapi,type-conversion,Winapi,Type Conversion,我一直在尝试使用代码块构建一个简单的WinAPI程序,但遇到了一个奇怪的问题 case WM_COMMAND:{ if (LOWORD(wParam) == Calculate) { int A=0, ArrayReset = 0; char textread[256]; SendMessage((HWND)Box1,(UINT) EM_GETLINE, (WPARAM)1, (LPARAM)&tex
case WM_COMMAND:{
if (LOWORD(wParam) == Calculate) {
int A=0, ArrayReset = 0;
char textread[256];
SendMessage((HWND)Box1,(UINT) EM_GETLINE, (WPARAM)1, (LPARAM)&textread);
A = atoi(textread);
itoa(ArrayReset, textread, 10);
itoa(A, textread, 10);
SendMessage((HWND)Box1,(UINT) WM_SETTEXT, (WPARAM)1,(LPARAM)&textread);
我的程序有点复杂,但这只是为了说明问题所在
现在,我希望代码所做的是读取Box1中的值,将其转换为整数,将其转换回char数组,然后将该数组打印回同一Box1中。基本上,一些转换在最终结果上没有差异。
然而,有一个奇怪的问题。该代码适用于单个数字,但如果我输入一个包含更多数字的数字,如12或356,则分别得到1200和3560。如果输入的数字大于1000,它会再次正常工作。
这是因为我将数组的值重置回0的方法造成的问题,还是因为它必须与转换过程有关 我想你有几个问题 首先,你没有告诉我们Parse1是什么。请注意,必须在缓冲区的第一个字中设置缓冲区的大小。另外,为什么要将1作为WPARAM传递?这是要从多行编辑控件检索的行的从零开始的索引,但如果编辑是单行,则忽略该索引 还有,第一个itoa电话是怎么回事 下面是一个有效的示例:
TCHAR textread[256] = {0};
*(reinterpret_cast<WORD*>(&textread)) = 256;
::SendMessage(hwnd, EM_GETLINE, 0, reinterpret_cast<LPARAM>(&textread));
auto n = _ttoi(textread);
_itot_s(n, textread, 256, 10);
::SendMessage(hwnd, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(&textread));
这段代码中有一些错误 对于初学者,LPARAM&textread应该是LPARAMtextread或LPARAM&textread[0] 但更重要的是,您没有正确准备信息: lParam 指向接收行副本的缓冲区的指针。在发送消息之前,将此缓冲区的第一个字设置为缓冲区的大小(以TCHARs为单位)。对于ANSI文本,这是字节数;对于Unicode文本,这是字符数。第一个字中的大小将被复制的行覆盖 请尝试以下方法:
case WM_COMMAND:{
if (LOWORD(wParam) == Calculate) {
int A = 0;
TCHAR textread[256];
*((LPWORD)&textread) = 256; // <-- add this
SendMessage(Box1, EM_GETLINE, 0, (LPARAM)textread);
_stscanf(textread, _T("%d"), &A);
_stprintf(textread, _T("%d"), A);
SendMessage(Box1, WM_SETTEXT, 0, (LPARAM)textread);
}
break;
Parse1实际上应该是文本读取。我复制了部分代码并更改了变量,以使它们更易于理解。我想我忽略了一个。我不确定WARAM做了什么,这有点新,第一个itoa调用是删除阵列中以前的所有数据。谢谢你的例子,但对我来说似乎不起作用。有错误告诉我,ISO C++禁止声明“n”没有类型,并且“iToTuSs”未声明第一次使用。这个函数AutoCube是C++ 11中新的,所以您必须使用旧的编译器。或者只使用GETDLGITEMT。