Newt 中的按钮
Buttons in Newt
我需要一个简单的基于终端的 window/widget 库,在 Linux 中带有 C 或 C++ 接口。我找到了 newt,它似乎足以满足我的需求,但我只有一个问题无法解决并且 google 不是很有帮助:
如何确定按下了哪个按钮?下面是一个带有 2 个按钮的简单按钮示例 - "Ok" 和 "Cancel"。如何确定按下的是哪一个?
#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();
}
你必须看一个解释回调的指南
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。
你必须先研究指针才能继续,我猜...
我的解决方案是:
- 设置一个变量为
newtComponent answer
- 销毁表单后调用此函数
answer = newtFormGetCurrent(form);
- 并检查答案是否是我的 b1 按钮
if( answer == b1 )
。
您正在使用已弃用的函数 newtRunForm()。使用 newtFormRun()。 newtFormRun() 中的第二个参数是带有结果的结构,returns 您需要了解表单执行期间发生的一切。像这样使用它:
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 常量和更多详细信息的源文件。
我需要一个简单的基于终端的 window/widget 库,在 Linux 中带有 C 或 C++ 接口。我找到了 newt,它似乎足以满足我的需求,但我只有一个问题无法解决并且 google 不是很有帮助:
如何确定按下了哪个按钮?下面是一个带有 2 个按钮的简单按钮示例 - "Ok" 和 "Cancel"。如何确定按下的是哪一个?
#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();
}
你必须看一个解释回调的指南
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。
你必须先研究指针才能继续,我猜...
我的解决方案是:
- 设置一个变量为
newtComponent answer
- 销毁表单后调用此函数
answer = newtFormGetCurrent(form);
- 并检查答案是否是我的 b1 按钮
if( answer == b1 )
。
您正在使用已弃用的函数 newtRunForm()。使用 newtFormRun()。 newtFormRun() 中的第二个参数是带有结果的结构,returns 您需要了解表单执行期间发生的一切。像这样使用它:
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 常量和更多详细信息的源文件。