【问题标题】:How to set text in Carbon textfield on OSX?如何在 OSX 上的 Carbon 文本字段中设置文本?
【发布时间】:2009-03-03 21:22:13
【问题描述】:

我正在尝试使用 Carbon API 设置文本字段的文本,如下所示:

ControlID editId = {'EDIT', 3};
ControlRef ctrl;
GetControlByID(GetWindowRef(), &editId, &ctrl);
CFStringRef title = CFSTR("Test");      
OSErr er = SetControlData(ctrl, kControlEntireControl, kControlEditTextTextTag, CFStringGetLength(title), title);
CFRelease(title);

我使用的是 XCode 的 C++ 代码模板,所以 GetWindowRef() 是对预定义的 TWindow 类的调用。 OSErr 返回值给了我 noErr,但我的文本字段只包含垃圾。 我是否将文本字段的属性设置为 Unicode 都没关系。

有什么想法吗?

【问题讨论】:

    标签: c++ macos macos-carbon


    【解决方案1】:

    GetControlID(...) 返回什么?是noErr吗?

    作为ControlRef也是HIViewRef,你也可以使用函数:

    HIViewSetText 设置文本。这被记录为与接受 kControlEditTextCFStringTag 的函数一起使用。

    顺便说一句,你写的那一行:

    CFRelease(title);
    

    会引起问题。应该只发布使用 API 名称中包含 Create 或 Copy 的函数制作的对象。您需要阅读:“Core Foundation 内存管理编程指南简介”——在 Xcode 文档中搜索。

    【讨论】:

    • HIViewSetText 有效吗?调用起来似乎比当前使用的调用简单很多。
    【解决方案2】:

    终于成功了:

    SetControlData(ctrl, kControlEditTextPart, kControlStaticTextCFStringTag, sizeof(title), &title);
    

    由于这似乎是一个非常古老的 API,一个更好的方法似乎是:

    HIViewSetText(ctrl, title);
    

    感谢 Lyndsey 提供的提示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 2019-12-14
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多