纽特纽扣 我需要一个简单的基于终端的窗口/窗口小程序库,在Linux中有C或C++接口。我找到了newt,它似乎足够满足我的需要,但我只有一个问题无法解决,而google也没有太大帮助: 如何确定按下了哪个按钮?下面是一个简单的按钮示例,有两个按钮-“确定”和“取消”。如何确定按下了哪个按钮 #include <newt.h> #include <stdlib.h> void main(void) { newtComponent form, b1, b2; newtInit(); newtCls(); newtOpenWindow(10, 5, 40, 6, "Button Sample"); b1 = newtButton(10, 1, "Ok"); b2 = newtCompactButton(22, 2, "Cancel"); form = newtForm(NULL, NULL, 0); newtFormAddComponents(form, b1, b2, NULL); newtRunForm(form); newtFormDestroy(form); newtFinished(); } #包括 #包括 真空总管(真空){ 新的组件形式,b1,b2; newinit(); newtCls(); NewOpenWindow(10,5,40,6,“按钮示例”); b1=新按钮(10,1,“正常”); b2=按钮(22,2,“取消”); form=newtForm(NULL,NULL,0); newtFormAddComponents(表格b1、b2、空); 纽特伦形式(形式); 新形式破坏(形式); newtFinished(); }

纽特纽扣 我需要一个简单的基于终端的窗口/窗口小程序库,在Linux中有C或C++接口。我找到了newt,它似乎足够满足我的需要,但我只有一个问题无法解决,而google也没有太大帮助: 如何确定按下了哪个按钮?下面是一个简单的按钮示例,有两个按钮-“确定”和“取消”。如何确定按下了哪个按钮 #include <newt.h> #include <stdlib.h> void main(void) { newtComponent form, b1, b2; newtInit(); newtCls(); newtOpenWindow(10, 5, 40, 6, "Button Sample"); b1 = newtButton(10, 1, "Ok"); b2 = newtCompactButton(22, 2, "Cancel"); form = newtForm(NULL, NULL, 0); newtFormAddComponents(form, b1, b2, NULL); newtRunForm(form); newtFormDestroy(form); newtFinished(); } #包括 #包括 真空总管(真空){ 新的组件形式,b1,b2; newinit(); newtCls(); NewOpenWindow(10,5,40,6,“按钮示例”); b1=新按钮(10,1,“正常”); b2=按钮(22,2,“取消”); form=newtForm(NULL,NULL,0); newtFormAddComponents(表格b1、b2、空); 纽特伦形式(形式); 新形式破坏(形式); newtFinished(); },c,linux,terminal,widget,window,C,Linux,Terminal,Widget,Window,更新: 收到反馈后,根据我的理解,我尝试添加回调函数: #include <newt.h> #include <stdlib.h> void b1Callback(newComponent co, void * data) { *((int*)data) = 4; } void main(void) { void* data; *((int*)data) = 0; newtComponent form, b1, b2; newt

更新:
收到反馈后,根据我的理解,我尝试添加回调函数:

#include <newt.h>
#include <stdlib.h>

void b1Callback(newComponent co, void * data)
{
    *((int*)data) = 4;
}

void main(void) {
    void* data;
    *((int*)data) = 0;
    newtComponent form, b1, b2;
    newtInit();
    newtCls();

    newtOpenWindow(10, 5, 40, 6, "Button Sample");

    b1 = newtButton(10, 1, "Ok");
    b2 = newtCompactButton(22, 2, "Cancel");
    newtComponentAddCallback(b1, b1Callback, data);
    form = newtForm(NULL, NULL, 0);
    newtFormAddComponents(form, b1, b2, NULL);

    newtRunForm(form);

    newtFormDestroy(form);
    newtFinished();
}
#包括
#包括
void b1回调(新组件公司,void*数据)
{
*((int*)数据)=4;
}
真空总管(真空){
作废*数据;
*((int*)数据)=0;
新的组件形式,b1,b2;
newinit();
newtCls();
NewOpenWindow(10,5,40,6,“按钮示例”);
b1=新按钮(10,1,“正常”);
b2=按钮(22,2,“取消”);
NewComponentAddCallback(b1、b1回调、数据);
form=newtForm(NULL,NULL,0);
newtFormAddComponents(表格b1、b2、空);
纽特伦形式(形式);
新形式破坏(形式);
newtFinished();
}

您必须看一本关于回调的指南

typedef void (*newtCallback)(newtComponent, void *);

void newtComponentAddCallback(newtComponent co, newtCallback f, void * data);
void newtComponentTakesFocus(newtComponent co, int val);
回调的示例

static void b1Callback(newtComponent co, void * data) 
{
// DO YOUR STUFF
}
然后添加您的代码:

newtComponentAddCallback(b1, b1Callback, NULL);
编辑:

更改回调:
*((int*)数据)=4

回调后,InitVal将为4

在继续之前,您必须研究指针,我想…

我的解决方案是:

  • 将变量设置为
    newcomponent answer
  • 销毁表单后调用此函数
    answer=newtFormGetCurrent(表单)
  • 并检查答案是否为我的b1按钮
    if(answer==b1)

您正在使用一个不推荐使用的函数newtRunForm()。使用newtFormRun()。newtFormRun()中的第二个参数是带有结果的结构,它返回您需要知道表单执行过程中发生了什么的所有信息。像这样使用它:

newtComponent form,b1,b2;
struct newtExitStruct exit_status;  
newtFormRun(form,&exit_status);                                                              
if (exit_status.reason==NEWT_EXIT_COMPONENT) {                                                                                                                                                     
    if (exit_status.u.co==b1) {  // ok button
        your code here
    }
    if (exit_status.u.co==b2) {  // cancel button
        your code here
    }
}

查看.c newt.c和newt.h格式的源文件以了解常量和更多详细信息。

并且newt不使用事件驱动的体系结构。非常感谢。你有关于这方面的指南的链接吗?正如你们所描述的,我试图添加一个回调函数,但它似乎根本并没有被调用。一定是大脑停了下来——不知道我在想什么,但没什么意义。当然,它应该像*((int*)data)=4无论我做什么,我都无法让它工作。如果我选择“Ok”按钮并按Enter键,我希望调用回调函数,但这永远不会发生。有人知道为什么吗?可能是数据问题。它被声明为void指针,但从未被分配到地址。然后,首先,尝试添加没有数据的回调:
newComponentAddCallback(b1,b1Callback,NULL)我编辑我的答案。别忘了检查最后的回答。只是尝试一下,这就像我希望它做的:)。。。并且可以轻松添加更多按钮。谢谢你的回答