📄 f_drawform.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 + -