1

是否可以在 windows api 的文本框中使用 SetWindowsText() 显示一维值数组?

例如。SetWindowText(hwndStatic3, sArray);

** * ** * ** * ** * ** * ** *编辑* ** * ** * ** * **

我在 windows api 上有一个文本框,我在其中使用 GetWindowText() 检索写入文本框中的字符串,然后将字符串转换为十进制数组。然后,当我尝试在另一个文本框中使用 SetwindowsText 打印这些值时,我将此十进制数组值转换为十六进制值。但是,只有数组的最后一个值正在打印。如何打印所有值?

** * ** * ** * ** * ** * ** *编辑* ** * ** * ** * **

代码:

                    GetWindowText(hwndtext1, value, 256);

                    for (i = 15; i >= 0; i--)
                   {
                          temp[i] = atoll(value);       //converts sting to decimal
                          ulltoa(temp[i] , sArray, 16); //converts decimal to hexadecimal
                          buf[i] = temp[i];  

                    }
                          SetWindowText(hwndStatic3, sArray);
4

2 回答 2

1

SetWindowText只是一个带有签名的宏:

BOOL SetWindowText(HWND, const TCHAR*);

根据您的构建设置,它将调用以下之一:

BOOL SetWindowTextA(HWND, const char*);    //ansi version
BOOL SetWindowTextW(HWND, const wchar_t*); //unicode version

其中TCHAR定义为:

#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif

因此,字符串数组与您的设置不兼容,SetWindowText但字符数组可以使用,前提是该数组的类型为,或与您的设置兼容TCHAR *的类型 (char *或)。wchar_t *

于 2013-03-11T23:13:34.640 回答
0

首先,atoll并且ulltoa没有使用 Microsoft Visual C/C++ (这是我用于 Windows 的)记录,所以我正在使用我在网上找到的文档。要么你的版本比我发现的文档做得更多,要么你的示例中遗漏了一些重要的代码。

基于循环控件,我猜您希望始终在从第一个控件读取的字符串中找到 15 个值。但是...... atollandulltoa函数一次只对一个值进行操作,并且不做任何事情来推进输入列表。因此,您的循环将第一个数字从字符串转换为 64 位 int,然后将其转换为字符串 15 次。

由于您说最后一个值是您看到的唯一值,因此您的函数实际上必须value以某种在您的示例中不明显的方式解析字符串。但是,ulltoa似乎总是将值放在同一个字符串变量的同一个位置,循环中的每个后续调用都会覆盖前一个调用。我懒惰的自我会添加一点这样的:

int len = 0;
char szOutput[15*20];     // enough space for 15 64 bit hex strings

GetWindowText(hwndtext1, value, 256);

for (i = 15; i >= 0; i--)
{
    temp[i] = atoll(value);       //converts sting to decimal
    ulltoa(temp[i] , sArray, 16); //converts decimal to hexadecimal
    buf[i] = temp[i];
    len += sprintf( szOutput+len, "%s ", sArray );
}
szOutput[len-1] - '\0'; // remove the final space
SetWindowText(hwndStatic3, szOutput);

当然,sprintf您也可以ulltoa完全跳过调用并将sprintf行更改为:

    len += sprintf( szOutput+len, "%16.16I64X", temp[i] );

(或您想要的任何风格/形式的十六进制输出(printf有关详细信息,请参阅格式文档。)如果您希望您的列表每行一个项目,则用换行符替换尾随空格。哦,里面I64%16.16I64XMicrosoft在其他编译器/库中可能有所不同的东西。

仅供参考,sprintf我使用的技术让函数继续附加到缓冲区的末尾,但将缓冲区(len)的偏移量增加刚刚附加的字符串的长度,即sprintf. 这是组装字符串列表(例如您的字符串列表)的一种快速简便的方法。

于 2013-03-12T12:15:11.213 回答