/********************************************************************** int input_color(window_t *oldw, char *prompt, int chr, int x, int y) { int i,j; unsigned ch; char str[2]={0,0}; static int x0=8,y0=4; window_t wnd; *str=chr; hide_cursor(); show_window(&wnd,x,y,x+17,y+11,LIGHTGRAY,MK_COL(MAGENTA,BLUE), DOUBLE_BORDER," Выберите цвет ",prompt); for(i=0; i <= WHITE; i++) for(j=BLACK; j <= LIGHTGRAY; j++) winfwritexy(i,j,MK_COL(i,j),str); writelongstrxy(0,8,"Норм - ENTER\n\rМерц - ^ENTER"); i=x0; j=y0; do{ winfwritexy(i,j,MK_COL(i,j)+BLINK,str); ch=wait(); winfwritexy(i,j,MK_COL(i,j),str); if(GETK0(ch)==_UP && j > 0) j--; else if(GETK0(ch)==_DOWN && j < LIGHTGRAY) j++; else if(GETK0(ch)==_LEFT && i > 0) i--; else if(GETK0(ch)==_RIGHT && i < WHITE) i++; } while(ch != _ENTER && ch != _CTRL_ENTER); erase_window(&wnd); if(oldw) set_active_window(oldw); x0=i; y0=j; if(ch==_ENTER) return MK_COL(i,j); else return MK_COL(i,j)+BLINK; } int check_shift(void) { union REGS r; r.h.ah=2; int86(0x16,&r,&r); return r.h.al & 3; } char *str_col(char *buf, int col) { char *colors[]={ "BLACK","BLUE","GREEN","CYAN","RED","MAGENTA","BROWN", "LIGHTGRAY","DARKGRAY","LIGHTBLUE","LIGHTGREEN", "LIGHTCYAN","LIGHTRED","LIGHTMAGENTA","YELLOW","WHITE" }; sprintf(buf,"MK_COL(%s,%s)",colors[col & 0x07], colors[(col >> 4) & 0x07]); if(col & BLINK) strcat(buf,"+BLINK"); return buf; } #define bor_width ((border != NO_BORDER) ? 2: 0) #define act MK_COL(MAGENTA,BLUE) #define pas MK_COL(BLACK,LIGHTGRAY) void _designer(window_t *wnd, char *wnd_name, int x1, int y1, int x2, int y2, int col, int bor_col, border_t border, char *up_name, char *down_name) { unsigned ch; FILE *F; static string up,down,buf,buf1; static char *s[]={ "NO_BORDER", "SIMPLE_BORDER", "DOUBLE_BORDER" , "THICK_BORDER", "VERY_THICK_BORDER" }; static char hk[]={_ENTER,0}, hk0[]={_UP,_DOWN,0 }; static edit_field_t edfs[]={ {0,0,60,act,pas,"",STRING,hk,hk0,up }, {0,0,60,act,pas,"",STRING,hk,hk0,down } }; static menu_item_t items[]={ {""," Введите верхнюю строку меню ",edfs,0,0,act,pas,BLACK,1,0,hk,""}, {""," Введите нижнюю строку меню ",edfs+1,0,1,act,pas,BLACK,1,1,hk,""}, }; menu_t emnu; int ox1=x1,oy1=y1,ox2=x2,oy2=y2,ocol=col,obor_col=bor_col,oborder=border,i; string oup,odown; window_t hwnd,ewnd; strcpy(oup,up_name); strcpy(odown,down_name); strcpy(up,up_name); strcpy(down,down_name); do{ show_window(wnd,x1,y1,x2,y2,col,bor_col,border,up,down); cprintf("Редактирование окна...\n\rF1 - help"); ch=wait(); erase_window(wnd); if(GETK0(ch)==_UP) { if(check_shift()) { if(y2 > y1 + bor_width) y2--; } else if(y1 > 0) { y1--; y2--; } } else if(GETK0(ch)==_DOWN) { if(check_shift()) { if(y2 < INTERFACE_VOID(getmaxY)) y2++; } else if(y2 < INTERFACE_VOID(getmaxY)) { y1++; y2++; } } else if(GETK0(ch)==_LEFT) { if(check_shift()) { if(x2 > x1 + bor_width + 1) x2--; } else if(x1 > 0) { x1--; x2--; } } else if(GETK0(ch)==_RIGHT) { if(check_shift()) { if(x2 < INTERFACE_VOID(getmaxX)) x2++; } else if(x2 < INTERFACE_VOID(getmaxX)) { x1++; x2++; } } else if(GETK0(ch)==_F1) { show_window(&hwnd,8,6,72,19,MK_COL(LIGHTGRAY,BLACK),GREEN, THICK_BORDER," Помощь "," Прочитав, нажмите любую клавишу "); cprintf( " Помощь\n\r" " \x18 \x19 \x1A \x1B - двигать окно\n\r" " Shift- \x18 \x19 \x1A \x1B - сжимать и расширять окно\n\r" " F1 - Помощь(Вы в ней находитесь)\n\r" " Alt-E - Edit (редактирование строк заголовков)\n\r" " ^B - Изменить вид бордюра\n\r" " ^I - Изменить цвет текста\n\r" " ^E - Изменить цвет бордюра\n\r" " Enter - утвердить\n\r" " ESC - выйти без изменений\n\r" " Потом посмотрите результат в файле R1.C, там записан вызов\n\r" " функции show_window, соответствующий построенному Вами окну" ); wait(); erase_window(&hwnd); } else if(GETK0(ch)==_ALT_E) { show_window(&ewnd,0,10,78,15,GREEN,pas, DOUBLE_BORDER," Введите верхнюю и нижнюю строку меню ", " Enter - утвердить "); show_menu(&emnu,0,1,0,3,0,items,2,hk,""); choose_from_menu(&emnu); erase_window(&ewnd); } else if(ch==_CTRL_B) { i=border; if(i==NO_BORDER) { if(x2-x1 < 2){ if(x1 != 0) if(x2 < INTERFACE_VOID(getmaxX)) x1--,x2++; else x1-=2; else x2+=2; } if(y2-y1 < 2){ if(y1 != 0) if(y2 < INTERFACE_VOID(getmaxY)) y1--,y2++; else y1-=2; else y2+=2; } } loop_inc(&i,VERY_THICK_BORDER+1); border=i; } else if(ch==_CTRL_I) col=input_color(NULL,"Цвет текста",'A',0,0); else if(ch==_CTRL_E) bor_col=input_color(NULL,"Цвет бордюра",206,0,0); } while(ch != _ENTER && ch != _ESC ); if(ch==_ENTER){ if(!(F=fopen("R1.c","r+"))) F=Fopen("R1.c","w"); else { /* Отъедаем ^Z */ i=fseek(F,0,SEEK_END); if(ftell(F) > 2) i=fseek(F,ftell(F)-2,SEEK_SET); else fseek(F,0,SEEK_SET); fprintf(F," "); } fprintf(F, "\n/* Вызов процедуры show_window после дизайнера */\n" "/* Вы можете перетащить этот вызов и вставить вместо вызова designer */\n" " show_window(%s,%d,%d,%d,%d,%s,%s,\n" " %s,\"%s\",\"%s\");\n\n\n", wnd_name,x1,y1,x2,y2, str_col(buf,col),str_col(buf1,bor_col), s[border],up,down); fclose(F); show_window(wnd,x1,y1,x2,y2,col,bor_col,border,up,down); } else show_window(wnd,ox1,oy1,ox2,oy2,ocol,obor_col,oborder,oup,odown); } #undef act #undef pas #undef bor_width **********************************************************************/