【问题标题】:SetWindowText with a single dimensional array具有一维数组的 SetWindowText
【发布时间】:2013-03-11 23:05:33
【问题描述】:

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

【问题讨论】:

  • 不,它只会显示一个字符串。您必须先将数组转换为字符串。
  • 我不认为您可以提供 (a) 执行您提到的多个转换步骤的代码,以及 (b) 尝试使用 @ 将所述结果设置为窗口文本的代码987654322@?另外,您是在 Windows 下执行此操作的,所以您有没有费心调试这个?
  • 循环是干什么用的?

标签: c++ c


【解决方案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 *) 与您的设置兼容。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 2016-10-30
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      相关资源
      最近更新 更多