⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 f_drawform.c

📁 《unix/Linux下的Curses库开发指南》综合示例程序
💻 C
字号:
#define FULLNAME_MAX_LENGTH  20#define FIELD_MAX_NUM 50#include <stdio.h>#include <stdlib.h>#include <curses.h>#include <form.h>#include <menu.h>#include "f_menuhead.h"//#define QUIT (MAX_COMMAND+10)#define RETURNRECOVER (MAX_COMMAND+11)F_LABELLINK* labellink=NULL;F_FIELDLINK* fieldlink=NULL;FORM* MainForm;FIELD* 	f_field[FIELD_MAX_NUM];void DrawForm();void FreeForm();extern WINDOW* FormWin;//表单窗口extern MENU *SubMenu;extern RedrawMenuWin();extern errlog();extern menuarray[5];int MyFormDriver(FORM* form,int c){    switch(c)    {	case QUIT:	    if(form_driver(form,REQ_VALIDATION)==E_OK)	    	return TRUE;     	    break;	case RETURNRECOVER:    	    FreeForm(MainForm,f_field,labellink,fieldlink); 	    RedrawMenuWin(menuarray);	    ResponseToSelect(SubMenu);    }    return FALSE;}int GetFormRequest(WINDOW* formwin){    int c=wgetch(formwin);    switch(c)    {	case 13:        case KEY_DOWN:  return REQ_NEXT_FIELD;// Ctrl+N        case KEY_UP:   	return REQ_PREV_FIELD;// Ctrl+P        case KEY_LL:   	return REQ_LAST_FIELD;        case 0x05:   	return REQ_END_FIELD;//Ctrl+E        case KEY_LEFT:  return REQ_LEFT_CHAR;        case KEY_RIGHT: return REQ_RIGHT_CHAR;        case 0x16:   	return REQ_DEL_CHAR;//Ctrl+V        case 0x08:   	return REQ_DEL_PREV;//Ctrl+H        case 0x19:   	return REQ_DEL_LINE;//Ctrl+Y        case 0x07:   	return REQ_DEL_WORD;//Ctrl+G        //case KEY_F(1):  return RETURNRECOVER;//ESC按键         case 0x1b:  return RETURNRECOVER;//ESC按键     }    return c;}//根据xml_filename生成form界面void TranEngine(char* xml_filename,WINDOW* FormWin){    char* full_name;    FILE* fp;    int ret;char temp[100];    full_name=(char*)malloc(sizeof(char*)*FULLNAME_MAX_LENGTH);	    sprintf(full_name,"./%s.xml",xml_filename);    labellink=NULL;    fieldlink=NULL;	    if((fp=fopen(full_name,"r"))==NULL)    {	printf("无法打开给定的文件%s\n",full_name);	return;    }    /*载入标签链表*/    ret =  LoadLabelXML( full_name, &labellink );    if (ret){	printf("%s","载入XML文件%s出错!\n",full_name);	LabelFree(labellink);	return ;    }    /*载入域链表*/    ret =  LoadFieldXML( full_name, &fieldlink );    if (ret){	printf("%s","载入XML文件%s出错!\n",full_name);	FieldFree(fieldlink);	return ;    }    DrawForm();}void DrawForm(){    int i=0,j=0;    int ch;    int done=FALSE;	    for(i=0;i<labellink->label_num;i++)    {	f_field[i]=new_field(1,labellink->p_label[i].label_length,labellink->p_label[i].begin_y,labellink->p_label[i].begin_x,0,0);	if(f_field[i])	{     	    set_field_buffer(f_field[i],0,labellink->p_label[i].label_text);		field_opts_off(f_field[i],O_ACTIVE);	}    }    for(i=labellink->label_num,j=0;i<labellink->label_num+fieldlink->field_num;i++,j++)    {	f_field[i]=new_field(1,fieldlink->p_field[j].field_length,fieldlink->p_field[j].begin_y,fieldlink->p_field[j].begin_x,0,0);		set_field_back(f_field[i],A_REVERSE);	if(f_field[i])	{	    set_field_back(f_field[i],A_REVERSE);	    //set_field_back(f_field[i],A_UNDERLINE);	   set_field_buffer(f_field[i],0,fieldlink->p_field[j].field_def_value);	    if(fieldlink->p_field[j].field_adjust==0)//左对齐	        set_field_just(f_field[i],JUSTIFY_LEFT);	    else if(fieldlink->p_field[j].field_adjust==1)//右对齐	        set_field_just(f_field[i],JUSTIFY_RIGHT);	    else if(fieldlink->p_field[j].field_adjust==2)//居中对齐	        set_field_just(f_field[i],JUSTIFY_CENTER);	    if(fieldlink->p_field[j].field_visible==0)	        field_opts_off(f_field[i],O_VISIBLE);	    else    field_opts_on(f_field[i],O_VISIBLE);	    if(fieldlink->p_field[j].field_optional==0)//可选	        field_opts_on(f_field[i],O_NULLOK);	    if(fieldlink->p_field[j].field_autoexit==0)//不自动跳转	        field_opts_off(f_field[i],O_AUTOSKIP);	    if(fieldlink->p_field[j].field_secret==1)//正常显示	        field_opts_off(f_field[i],O_PUBLIC);	    if(fieldlink->p_field[j].field_enable==0)//正常显示	        field_opts_off(f_field[i],O_ACTIVE);	}    }    f_field[i]=(FIELD*)0;    MainForm=new_form(f_field);    box(FormWin, 0, 0);    keypad(FormWin, TRUE);    set_form_win(MainForm, FormWin);    set_form_sub(MainForm, derwin(FormWin,17,COLS-4, 2,2));    post_form(MainForm);    refresh();    wrefresh(FormWin);    touchwin(FormWin);        while(!done)    {       	switch(form_driver(MainForm,ch=GetFormRequest(FormWin)))    	{      	    case E_OK:            	break;            case E_UNKNOWN_COMMAND:            	done=MyFormDriver(MainForm,ch);        	break;      	    default:        	break;    	}    }    //FreeForm(MainForm,f_field,labellink,fieldlink); }void FreeForm(FORM* MainForm, FIELD* f_field[],F_LABELLINK *labellink,F_FIELDLINK *fieldlink){    int i;    unpost_form(MainForm);    free_form(MainForm);    for(i=0;i<labellink->label_num;i++)        free_field(f_field[i]);    LabelFree(labellink);    FieldFree(fieldlink);    labellink=NULL;    fieldlink=NULL;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -