我需要一个简单的基于终端的窗口/窗口小部件库,在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();
}
答案 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);
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 源文件中的常量和更多详细信息。