繁体   English   中英

具有一维数组的SetWindowText

[英]SetWindowText with a single dimensional array

是否可以在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);

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 * )与您的设置兼容即可。

首先,没有在Microsoft Visual C / C ++(这是我在Windows中使用的文件)中记录atollulltoa ,因此我使用的是我在网上找到的文档。 要么您的版本做得比我发现的要多,要么您的示例中遗漏了一些重要的代码。

基于循环控件,我猜您希望在从第一个控件读取的字符串中始终找到15个值。 但是... atollulltoa函数一次只能对一个值进行操作,无助于输入列表。 因此,循环将第一个数字从字符串转换为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格式文档。)如果您希望列表为每行一项,请用换行符替换尾随空格。哦, %16.16I64XI64 %16.16I64X是Microsoft的东西,在其他编译器/库中可能有所不同。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM