我正在尝试使用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,但我的textfield只包含垃圾。 如果我将textfield的属性设置为Unicode无关紧要。
这里有什么问题吗?
答案 0 :(得分:2)
GetControlID
(...)返回什么?是noErr
吗?
由于ControlRef
也是HIViewRef
,您还可以使用以下功能:
HIViewSetText
设置文字。记录这些内容可以使用接受kControlEditTextCFStringTag
的函数。
顺便说一下,你写的这行:
CFRelease(title);
会引起问题。应该只释放使用API名称中具有“创建”或“复制”功能的对象。您将需要阅读:“Core Foundation内存管理编程指南简介” - 在Xcode文档中搜索。
答案 1 :(得分:0)
最后这就是诀窍:
SetControlData(ctrl, kControlEditTextPart, kControlStaticTextCFStringTag, sizeof(title), &title);
由于这似乎是一个非常古老的API,一个更好的方法似乎是:
HIViewSetText(ctrl, title);
向Lyndsey致谢,提示。