Winapi Win API错误的文本框输出

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

我一直在尝试使用代码块构建一个简单的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)&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。