纽特的按钮

时间:2015-01-16 09:32:04

标签: c linux terminal widget window

我需要一个简单的基于终端的窗口/窗口小部件库,在Linux中使用C或C ++接口。我找到了newt,这似乎足以满足我的需求,但我只有一个问题,我无法解决这个问题并且谷歌没有帮助: 如何确定按下了哪个按钮?下面是一个带有2个按钮的简单按钮示例 - " Ok"和"取消"。如何确定按下哪个?

#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();
}

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

#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();
}

3 个答案:

答案 0 :(得分:1)

您必须查看有关回调的指南

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*)data) = 4;

回调后,InitVal将为4。

你必须先学习指针才能继续,我猜......

答案 1 :(得分:1)

我的解决方案是:

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

答案 2 :(得分:0)

您使用的是已弃用的函数 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
    }
}

检查 form.c newt.c newt.h 源文件中的常量和更多详细信息。