SetWindowText具有单维数组

时间:2013-03-11 23:05:33

标签: c++ c

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

例如,

。 SetWindowText(hwndStatic3,sArray);

** * ** * ** * 的** * ** * ** * 修改 * < / EM> ** * ** * ** * **

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

** * ** * ** * 的** * ** * ** * 修改 * < / EM> ** * ** * ** * **

代码:

                    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);

2 个答案:

答案 0 :(得分: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 *)。

答案 1 :(得分:0)

首先,atollulltoa未记录Microsoft Visual C / C ++(我用于Windows),所以我正在使用我在网上找到的文档。你的版本比我发现的版本更多,或者你从你的例子中遗漏了一些重要的代码。

基于循环控制,我猜你总是会在第一个控件中读取的字符串中找到15个值。但是...... atollulltoa函数一次只能在一个值上运行,并且无法通过输入列表前进。所以你的循环是将第一个数字从字符串转换为64位int,然后将其转换为字符串15次。

由于您说 last 值是您看到的唯一值,因此您的函数实际上必须以某种方式解析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.16I64X是微软的东西,在其他编译器/库中可能会有所不同。

仅供参考,我使用的sprintf技术让函数继续附加到缓冲区的末尾,但是将偏移量增加到缓冲区(len)中,增加了刚刚附加的字符串的长度,这是sprintf返回的值。这是一种快速简便的方法来组合你的字符串列表。