APPLICAT.B
上传用户:wtrl82617
上传日期:2007-01-07
资源大小:187k
文件大小:30k
源码类别:

界面编程

开发平台:

DOS

  1. // 1993 (c) ALL RIGHTS RESERVED
  2. // AUTHOR:  XuYongYong
  3. /*  applicat.cpp
  4. */
  5. #include "applicat.h"
  6. #include "yyxmain.h"
  7. #include "msgbox.h"
  8. #include <process.h>
  9. #include <dos.h>
  10. #include <alloc.h>
  11. #include "mouse.h"
  12. #include <malloc.h>
  13. #include <string.h>
  14. #include <fcntl.h>
  15. #include <stdio.h>
  16. extern "C" far _selectVGABitPlane ( int planeNo, int cmd );
  17. enum dosErr { dosInvalidFuncCode = 1, dosFileNotFound, dosPathNotFound,
  18. dosTooManyOpenFiles, dosAccessDenied, dosInvalidHandle,
  19. dosMemCtrlBkDestryed, dosInsufficientMem, dosInvalidMemBkAddr,
  20. dosInvalidEnvir, dosInvalidFormat, dosInvalidAccessCode,
  21. dosInvalidDate, dosUnKnownErr, dosInvalidDrv, dosAttemptRDCurDir,
  22. dosNotSameDevice, dosNoMoreFiles, dosDiskIsWriteProtected,
  23. dosBadDiskUnit, dosDriveNotReady, dosInvalidDiskCom, dosCRCErr,
  24. dosInvalidLeninDiskOp, dosSeekErr, dosNotDosDisk, dosSectorNotFound,
  25. dosOutofPaper, dosWriteFault, dosReadFault, dosGeneralFailt,
  26. dosSharingViolation, dosLockViolation, dosWrongDisk };
  27. application_class::application_class (int menu_num,char *title)
  28. { int i;
  29. this->menu_num =menu_num;
  30. if (this->menu_num<40) this->menu_num=40;
  31. my_menu=(Tmenu **) farmalloc( (sizeof (Tmenu*)) * (menu_num+1) );
  32. for (i=0;i<menu_num;i++ ) my_menu[i]=NULL;
  33. for (i=0;i<=5;i++ )  sub_sysmenu[i]=NULL;
  34. for (i=0;i<=5;i++ )  sub_win_sysmenu[i]=NULL;
  35. start_menu =NULL;
  36. this->title =title;
  37. // /interrupt/interrupt/interrupt/interrupt/interrupt/interrupt/interrupt
  38. // timer_active =FALSE;
  39. // kb_active=FALSE;
  40. // TIMER_COUNT =10;
  41. // SLOW_TIMER_COUNT =20;
  42. init_msg(); //MUST DO IT FIRST,in case clock send msg
  43. old_timer =getvect (TIMER_VECTOR);
  44. setvect (TIMER_VECTOR,application_class::timer);
  45. key_code =0;
  46. old_key =getvect (KEY_VECTOR);
  47. setvect (KEY_VECTOR,application_class::key  );
  48. old_dos_error =getvect (DOS_ERROR_VECTOR );
  49. setvect (DOS_ERROR_VECTOR ,application_class::dos_error  );
  50. old_mouse =getvect (MOUSE_VECTOR);  //MUST INIT LATER
  51. // setvect (MOUSE_VECTOR,application_class::mouse  );
  52. }
  53. BOOL application_class::timer_active =FALSE;
  54. BOOL application_class::kb_active=FALSE;
  55. BOOL application_class::mouse_active=FALSE;
  56. BOOL application_class::dos_error_active=FALSE;
  57. int  application_class::TIMER_COUNT =20;
  58. int  application_class::SLOW_TIMER_COUNT =40;
  59. //int  application_class::key_code =0;
  60. int  application_class::time_counter =0;
  61. int  application_class::slow_time_counter =0;
  62. application_class::~application_class ()
  63. { int i;
  64. // my_menu[0]->dispose_all_submenus();
  65. // delete (my_menu[0]);
  66. for (i=0;i<menu_num;i++ ) if (my_menu[i]!=NULL ) delete (my_menu[i]);
  67. // delete (my_menu[39]);
  68. delete (sysmenu);
  69. for (i=0;i<=5;i++ ) if (sub_sysmenu[i]!=NULL )delete (sub_sysmenu[i]);
  70. delete (win_sysmenu);
  71. for (i=0;i<=5;i++ )if(sub_win_sysmenu[i]!=NULL )delete (sub_win_sysmenu[i]);
  72. //
  73. if (start_menu !=NULL) delete (start_menu);
  74. farfree (my_menu);
  75. //   restore old int1c
  76. if (getvect(TIMER_VECTOR)==application_class::timer )
  77. setvect (TIMER_VECTOR,old_timer);
  78. if (getvect(KEY_VECTOR)==application_class::key )
  79. setvect (KEY_VECTOR,old_key);
  80. if (getvect(MOUSE_VECTOR)==application_class::mouse)
  81. setvect (MOUSE_VECTOR,old_mouse);
  82. if (getvect(DOS_ERROR_VECTOR)==application_class::dos_error)
  83. setvect (DOS_ERROR_VECTOR,old_dos_error);
  84. if (sysmouse) delete sysmouse;
  85. }
  86. void application_class::get_my_menu()
  87. {
  88. my_menu[0] =new Tmenu (0,title,main_help_text,NULL );
  89. sysmenu =new Tsysmenu (101,"& ","ALT_SPACE",my_menu[0]); {
  90. sysmenu->bounds.left =my_menu[0]->bounds.left+1;
  91. sysmenu->bounds.top =my_menu[0]->bounds.top+1;
  92. sysmenu->bounds.right=sysmenu->bounds.left+bar_height-2;
  93. sysmenu->bounds.bottom =my_menu[0]->bounds.bottom-1;
  94. }
  95. sub_sysmenu[0]=new Tmenu(SYS_RESTOREID,"&Restore","Restore windnow ",sysmenu);
  96. sub_sysmenu[1]=new Tmenu(SYS_MOVEID,"&Move","Move window",sysmenu);
  97. sub_sysmenu[2]=new Tmenu(SYS_SIZEID,"&Size","Change window size",sysmenu);
  98. sub_sysmenu[3]=new Tmenu(SYS_MINIMIZEID,"Mi&nimize","Iconinize window",sysmenu);
  99. sub_sysmenu[4]=new Tmenu(SYS_MAXIMIZEID,"Ma&ximize","Streatch window",sysmenu);
  100. sub_sysmenu[5]=new Tmenu(SYS_CLOSEID,"Close","Close window",sysmenu);
  101.  int i;
  102. for (i=0;i<5;i++) sub_sysmenu[i]->status |= DISABLE;
  103. // the order is important
  104. win_sysmenu =new Tsysmenu (100,"","",my_menu[0]); {
  105. win_sysmenu->bounds.left =my_menu[0]->bounds.left+1;
  106. win_sysmenu->bounds.top =my_menu[0]->bounds.top+1;
  107. win_sysmenu->bounds.right=win_sysmenu->bounds.left+bar_height-LINE_WIDTH+1;
  108. win_sysmenu->bounds.bottom =my_menu[0]->bounds.bottom-1;
  109. // OffsetRect (&win_sysmenu->bounds ,100,100 );
  110. win_sysmenu->status =INVISIBLE;
  111. }
  112. sub_win_sysmenu[0]=new Tmenu(WIN_SYS_RESTOREID,"&Restore","Restore windnow to ",win_sysmenu);
  113. sub_win_sysmenu[1]=new Tmenu(WIN_SYS_MOVEID,"&Move","Move window",win_sysmenu);
  114. sub_win_sysmenu[2]=new Tmenu(WIN_SYS_SIZEID,"&Size","Change window size",win_sysmenu);
  115. sub_win_sysmenu[3]=new Tmenu(WIN_SYS_MINIMIZEID,"Mi&nimize","Iconinize window",win_sysmenu);
  116. sub_win_sysmenu[4]=new Tmenu(WIN_SYS_MAXIMIZEID,"Ma&ximize","Streatch window",win_sysmenu);
  117. sub_win_sysmenu[5]=new Tmenu(WIN_SYS_CLOSEID,"Close","Close window",win_sysmenu);
  118. //  Set Imme_key
  119. Imme_Menu_ID[0]= SYS_CLOSEID ;  Immediate_key[0]=ALT_F4; Imme_Menu_fptr[0]=sub_win_sysmenu[5];
  120. Max_Imme_key_nums=2;
  121. }
  122. BOOL application_class::echo_to_menu(long menu_ID) // utter virtual
  123. {
  124. switch (menu_ID ){
  125. case SYS_CLOSEID    :thequeue.SendMessage(0
  126. ,SysQuitMSG,NULL );
  127. break;
  128. case WIN_SYS_CLOSEID :
  129. thequeue.SendMessage(pcurrent_selected_win->ID
  130. ,WinSysCloseMSG,pcurrent_selected_win );
  131. break;
  132. case DOSSHELL : DosShell (); break;
  133. case WIN_SYS_MOVEID :
  134. case WIN_SYS_SIZEID :
  135. key_code=CTRL_F5;
  136. thequeue.SendMessage(0, KeyPressedMSG,NULL);
  137. break;
  138. default :return FALSE;
  139. }
  140. return TRUE; // handled
  141. }
  142. /* ********************************************************************* */
  143. /* ****************************   KEY    ******************************* */
  144. /* ********************************************************************* */
  145. int  application_class::key_pressed_handler ( int key_scan_num )
  146. {
  147. return FALSE;
  148. }
  149. /* ********************************************************************* */
  150. /* ****************************   MSG    ******************************* */
  151. /* ********************************************************************* */
  152. void application_class::show_status(int kind)
  153. {// disable();
  154. getviewsettings (&current_viewport );
  155. setport (menu_viewport);
  156. setcolor (HELP_TEXT_COLOR);
  157. switch ( kind ) {
  158. case SYS_STATUS:
  159. FillRect ( sys_status_rect,HELP_RECT_COLOR );
  160. outtextxy(sys_status_rect.left+10,sys_status_rect.top,sys_status_string);
  161. break;
  162. case STATUS:
  163. FillRect ( status_rect,HELP_RECT_COLOR );
  164. outtextxy(status_rect.left+10,status_rect.top,status_string);
  165. break;
  166. case HELP_STATUS:
  167. FillRect ( on_line_help_rect,HELP_RECT_COLOR );
  168. outtextxy( on_line_help_rect.left+10,on_line_help_rect.top,main_help_text);
  169. break;
  170. }
  171. // disable();
  172. setport (current_viewport );
  173. // enable();
  174. }
  175. int application_class::first_class_msg_handler ( MSG& message )
  176. {
  177. switch ( message .Action){
  178. // case MouseLButtonDownMSG:
  179. // break;
  180. case MenuActionMSG:
  181. return echo_to_menu(sysmsg.ID);
  182. case DlgOkedMSG:
  183. return Dlg_OK;
  184. case DlgCanceledMSG:
  185. return Dlg_CANCEL;
  186. /* case TimerMSG:
  187.   static unsigned int i=0;
  188. switch (i++ %8) {
  189. case 0:
  190. sprintf (status_string,"_stklen:%ux",_stklen);
  191. break;
  192. case 2:
  193. sprintf (status_string,"s:%up:%ux",stackavail(),_SP);
  194. break;
  195. case 4:
  196. sprintf(status_string,"heaptop:%lux", (unsigned long) coreleft());
  197. break;
  198. case 6:
  199. sprintf(status_string,"Fhtop:%lux", (unsigned long) farcoreleft());
  200. break;
  201. }
  202. show_status(STATUS);
  203. return FALSE;
  204.  */ case SlowTimerMSG:
  205.   static int heap;
  206.   static unsigned int j=0;
  207. switch (j++ %3) {
  208. case 0:
  209. if (getvect(MOUSE_VECTOR) !=application_class:: mouse ){
  210. strcpy (sys_status_string,"MOUSE UNOK");
  211. if (!sysmouse) strcat (sys_status_string," !!");
  212. else {
  213. setvect (MOUSE_VECTOR,application_class::mouse );
  214. sysmouse->on(0);
  215. }
  216. }
  217. else strcpy (sys_status_string,"MOUSE OK");
  218. break;
  219. case 1:
  220. //~ if  ((heap=heapcheckfree(0xff)) == _HEAPOK ) strcpy (sys_status_string,"HEAP OK");
  221. //~ else if (heap==_BADVALUE) strcpy (sys_status_string,"BAD VALUE");
  222. //~ else strcpy (sys_status_string,"HEAP CORRUPT");
  223. if  ((heap=heapfillfree(0xff)) == _HEAPOK ) strcpy (sys_status_string,"HEAP OK");
  224. else if (heap==_HEAPEMPTY) strcpy (sys_status_string,"EMPTY");
  225. else strcpy (sys_status_string,"HEAP CORRUPT");
  226. break;
  227. case 2:
  228. if  ((heap=farheapfillfree(0x88)) == _HEAPOK ) strcpy (sys_status_string,"FARH OK");
  229. else if (heap==_HEAPEMPTY) strcpy (sys_status_string,"EM FARH");
  230. else strcpy (sys_status_string,"FARH RUPT");
  231. break;
  232. }
  233. show_status(SYS_STATUS);
  234. return FALSE;
  235. case SysQuitMSG:
  236. return Sys_QUIT;
  237. case KeyPressedMSG:
  238. return key_pressed_handler( key_code );
  239. case WinMovingSizingMSG: //for mouse only
  240. pcurrent_selected_win-> draw_size_rect();
  241. if (in_win_moving ==TRUE) //moving
  242. OffsetRect (&pcurrent_selected_win->newbounds,
  243.  mouse_x-old_mouse_x,mouse_y-old_mouse_y );
  244. else { //sizing
  245. pcurrent_selected_win->newbounds.right +=mouse_x-old_mouse_x;
  246. pcurrent_selected_win->newbounds.bottom +=mouse_y-old_mouse_y;
  247. }
  248. if (pcurrent_selected_win->newbounds.right>
  249. win_living_viewport.right-win_living_viewport.left-2)
  250. pcurrent_selected_win->newbounds.right
  251. =win_living_viewport.right-win_living_viewport.left-2;
  252. if (pcurrent_selected_win->newbounds.bottom>
  253. win_living_viewport.bottom-win_living_viewport.top-2)
  254. pcurrent_selected_win->newbounds.bottom
  255. =win_living_viewport.bottom-win_living_viewport.top-2;
  256. if (pcurrent_selected_win->newbounds.left<2)
  257. pcurrent_selected_win->newbounds.left=2;
  258. if (pcurrent_selected_win->newbounds.top<2)
  259. pcurrent_selected_win->newbounds.top=2;
  260. old_mouse_x=mouse_x;
  261. old_mouse_y=mouse_y;
  262. pcurrent_selected_win-> draw_size_rect();
  263. return TRUE;
  264. case WinSysCloseMSG:
  265. if (! (((Twin*)message.fptr)->canclose||
  266.   (((Twin*)message.fptr)->func_canclose()) ))  return FALSE;
  267.   int x,y;
  268. if (((Twin*)(message.fptr)) !=pcurrent_selected_win)
  269. ((Twin*)(message.fptr))->select();
  270. x=((Twin*)message.fptr)->bounds.left+win_living_viewport.left-menu_viewport.left+LINE_WIDTH;
  271. y=((Twin*)message.fptr)->bounds.top+win_living_viewport.top -menu_viewport.top+LINE_WIDTH;
  272. win_sysmenu->offsetmenu(-x,-y);
  273. win_sysmenu->status |=INVISIBLE;
  274. delete ((Twin*)message.fptr );
  275. // delete message.fptr;
  276. return TRUE ;
  277. case CtrlBreakMSG:
  278. error ("Ctrl  Break Pressed");
  279. break;
  280. default: ;//thequeue.GetMessage(sysmsg);
  281. }
  282. return FALSE;
  283. }
  284. int application_class::second_class_msg_handler ( MSG& message )
  285. {
  286. return FALSE;
  287. }
  288. int application_class::main_message_loop()
  289. { int ret_value=FALSE;
  290. while ( thequeue.GetMessage(sysmsg) )
  291. {
  292. if ((ret_value =first_class_msg_handler(sysmsg))!=FALSE) return ret_value;
  293. // This is the messages MUST be handled; && No more msg should
  294. // converted to the menu && dialog && win moving
  295. // && including messages must be shown in ret_value;
  296. if ( ( pcurrent_selected_win ==NULL )||
  297.  ((!in_win_moving)&&(!(pcurrent_selected_win->type & DIALOG_WIN)))
  298.    )
  299. ret_value =pcurrent_menu->msg_handler(sysmsg);
  300. if ( (in_menu_trap)||(ret_value!=FALSE) ) return ret_value;
  301. if ( pcurrent_selected_win !=NULL )
  302. pcurrent_selected_win->msg_handler(sysmsg);
  303. second_class_msg_handler(sysmsg);
  304. ////////////////!!!!!!!!!!!! New
  305. /////////// if ( sysmsg.Action == KeyPressedMSG ) key_code =0;
  306. }
  307. if  (
  308. (!in_menu_trap) &&
  309. ( ( pcurrent_selected_win ==NULL )||((!in_win_moving)&&(!(pcurrent_selected_win->type & DIALOG_WIN))))
  310. )
  311. anything_in_the_loop();
  312. return ret_value;
  313. }
  314. void application_class::anything_in_the_loop(){};
  315. void application_class::run()
  316. {
  317.  int keynum;
  318. Begin_Program:
  319. init();
  320. while (1) {
  321. /* if( (keynum=bioskey(1) )== -1 ) break;
  322. else if (keynum !=0 ) {
  323. keynum=bioskey(0);
  324. key_pressed_handler( keynum );
  325. }
  326. */ if (main_message_loop()==Sys_QUIT) break;
  327. // if (RE_START != 0) init_screen(); //goto Begin_Program;
  328. }
  329. }
  330. /* ********************************************************************* */
  331. /* ****************************   INIT   ******************************* */
  332. /* ********************************************************************* */
  333. void application_class::init()
  334. {
  335. init_screen();
  336. init_menu();  // the order is important
  337. draw_application_win();
  338. //  settextstyle (DEFAULT_FONT,HORIZ_DIR,1 );
  339. init_win();
  340. init_ctrl();
  341.   void far *mouse_addr;
  342. mouse_addr =getvect (0x33);
  343. if (  (!((mouse_addr==NULL )||(*(unsigned char *)mouse_addr==0xcf))) &&
  344.  !nomouse
  345.    )  { sysmouse=new Tmouse();
  346. old_mouse =getvect (MOUSE_VECTOR);
  347. setvect (MOUSE_VECTOR,application_class::mouse  );
  348. }
  349. else sysmouse =NULL;
  350. }
  351. //#include "tvga256.h" // Needs More MEMORY
  352. void application_class::init_screen()
  353. {
  354.   int gdriver = DETECT, gmode, errorcode;
  355. // gdriver = installuserdriver("TVGA256",DETECTTVGA);/* Request auto-detection */
  356. // gmode = TVGA640x480;
  357. initgraph(&gdriver, &gmode, "");
  358. errorcode = graphresult();
  359. if (errorcode != grOk)  /* an error occurred */ {
  360. printf("Graphics error: %sn", grapherrormsg(errorcode));
  361. printf("Press any key to halt:");
  362. getch();
  363. error("graphics error exit");      /* return with error code */
  364. }
  365. // RE_START =0;
  366. screen_viewport.left=0; screen_viewport.top =0;
  367. screen_viewport.right =getmaxx(); screen_viewport.bottom=getmaxy();
  368. screen_viewport.clip =CLIP_ON;
  369. setusercharsize (10,10,10,10);
  370. settextstyle (DEFAULT_FONT+SMALL_FONT,HORIZ_DIR, /*USER_CHAR_SIZE*/6 );
  371. setport (screen_viewport);
  372. setfillstyle (SOLID_FILL, LIGHTGRAY );
  373. bar (screen_viewport.left,screen_viewport.top,screen_viewport.right,screen_viewport.bottom);
  374. font_height =textheight ("HjklMq") +8;
  375. bar_height =20;
  376. menu_viewport =screen_viewport;
  377. menu_viewport.left  +=5; menu_viewport.top   +=5;
  378. menu_viewport.right -=5;    menu_viewport.bottom-=5;
  379. }
  380. void application_class::draw_application_win()
  381. {
  382. /////////////////////////////INIT MENUS PART/////////////////////////////////
  383. /////////////////////////////INIT MENUS PART/////////////////////////////////
  384. /////////////////////////////INIT MENUS PART/////////////////////////////////
  385. // draw Frame rect of the screen
  386. pcurrent_menu =start_menu;
  387. pcurrent_menu->psub_menu_selected =my_menu[0];
  388. setport (screen_viewport);
  389. setlinestyle ( SOLID_LINE,1,THICK_WIDTH );
  390. setcolor(LIGHTGRAY);
  391. Rect temp_rect;
  392. SetRect (&temp_rect,menu_viewport.left,menu_viewport.top,
  393. menu_viewport.right,menu_viewport.bottom );
  394. InsetRect (&temp_rect, -LINE_WIDTH,-LINE_WIDTH);
  395. draw_win_frame_rect ( temp_rect );
  396. //  change menu_viewport
  397. setfillstyle (SOLID_FILL, WHITE );
  398. bar (menu_viewport.left,menu_viewport.top,menu_viewport.right,menu_viewport.bottom);
  399. //  draw help_rect
  400. /* SetRect (&on_line_help_rect,0,
  401. menu_viewport.bottom-menu_viewport.top-bar_height-10,
  402. menu_viewport.right-menu_viewport.left,
  403. menu_viewport.bottom-menu_viewport.top);
  404. */
  405. SetRect (&on_line_help_rect,0,
  406. menu_viewport.bottom-menu_viewport.top-bar_height-10,
  407. 250,
  408. menu_viewport.bottom-menu_viewport.top);
  409. SetRect (&sys_status_rect,270,
  410. menu_viewport.bottom-menu_viewport.top-bar_height-10,
  411. 400,
  412. menu_viewport.bottom-menu_viewport.top);
  413. SetRect (&status_rect,420,
  414. menu_viewport.bottom-menu_viewport.top-bar_height-10,
  415. menu_viewport.right-menu_viewport.left,
  416. menu_viewport.bottom-menu_viewport.top);
  417. setport (menu_viewport);
  418. FillRect (on_line_help_rect, HELP_RECT_COLOR );
  419. InsetRect (&on_line_help_rect, -5, -5 );
  420. draw_in_button (on_line_help_rect );
  421. InsetRect (&on_line_help_rect, -1, -1 );
  422. FillRect (sys_status_rect, HELP_RECT_COLOR );
  423. InsetRect (&sys_status_rect, -5, -5 );
  424. draw_in_button (sys_status_rect );
  425. InsetRect (&sys_status_rect, -1, -1 );
  426. FillRect (status_rect, HELP_RECT_COLOR );
  427. InsetRect (&status_rect, -5, -5 );
  428. draw_in_button (status_rect );
  429. InsetRect (&status_rect, -1, -1 );
  430. if (pcurrent_menu ->psub_menu_selected !=NULL ) {
  431. pcurrent_menu ->psub_menu_selected->pfather_menu=pcurrent_menu;
  432. pcurrent_menu ->psub_menu_selected->select();
  433. pcurrent_menu ->psub_menu_selected->pfather_menu=NULL;
  434. // this makes MOUSE DEAD
  435. }
  436. pcurrent_menu ->enter_menu();
  437. //  draw sys menu
  438. setcolor (BLACK);
  439. if (pcurrent_menu != NULL ) {
  440. Rect tmprect;
  441. setport (menu_viewport);
  442. tmprect = pcurrent_menu->save_bitmap.bounds;
  443. InsetRect (&tmprect ,0,1);
  444. FrameRect (tmprect);
  445. }
  446. FillRect (sysmenu->bounds,LIGHTGRAY );
  447. setcolor (BLACK );
  448. FrameRect (sysmenu->bounds);
  449. sysmenu->bounds.bottom -=1;
  450. sysmenu->bounds.right -=1;
  451. sysmenu->draw (); //Not Very Good
  452. //  draw up & down rect;
  453.   Rect up_rect,down_rect;
  454. down_rect =my_menu[0]->bounds;
  455. down_rect.left=down_rect.right -bar_height+1;
  456. down_rect.right -=1;
  457. down_rect.bottom -=1;
  458. OffsetRect (&down_rect,LINE_WIDTH-1,0 );
  459. up_rect=down_rect;
  460. OffsetRect (&up_rect, -bar_height+1,0 );
  461. draw_out_button (down_rect);
  462. draw_out_button (up_rect);
  463. }
  464. void application_class::init_msg()
  465. {
  466. thequeue.Reset();
  467. }
  468. void application_class::init_menu()
  469. {   in_menu_trap =FALSE;
  470. start_menu =new Tmenu ("INIT","");
  471. MENU_ITEM_ENABLED_COLOR  =BLACK     ;
  472. MENU_ITEM_SELECTED_COLOR =WHITE ; // for text
  473. MENU_ITEM_DISABLED_COLOR =DARKGRAY;
  474. MENU_ITEM_SELECT_COLOR  =BLUE     ; // for bar
  475. HELP_RECT_COLOR  =LIGHTGRAY ;
  476. HELP_TEXT_COLOR = BLACK;
  477. MENU_RECT_COLOR = WHITE ;
  478. get_my_menu();
  479. // show menus
  480. }
  481. void application_class::init_win ()
  482. {
  483. win_living_viewport=menu_viewport;
  484. win_living_viewport.top +=2*bar_height;
  485. win_living_viewport.bottom -=2*bar_height;
  486. pfirst_win_of_all =NULL;
  487. pcurrent_selected_win =NULL;
  488. WIN_TITLEBAR_SELECTED_COLOR =BLUE;
  489. WIN_TITLEBAR_UNSELECTED_COLOR =LIGHTGRAY;
  490. WIN_TITLE_SELECTED_COLOR   =WHITE;
  491. WIN_TITLE_UNSELECTED_COLOR =BLACK;
  492. WIN_BACKGROUND_COLOR    =WHITE;
  493. }
  494. void application_class::init_ctrl ()
  495. {
  496. }
  497. //////////////////////////////////////////////////////////////////////////
  498. ///////////////////////////////DOSSHELL///////////////////////////////////
  499. //////////////////////////////////////////////////////////////////////////
  500. /* // OLD VERSION
  501. void application_class::DosShell(void)
  502. {
  503.   int result;
  504. if (pcurrent_selected_win != NULL ) {
  505. exec_dialog(new Tmsgbox("Message","MUST CLOSE ALL WINDOWS",MB_OK));
  506. // thequeue.SendMessage(pcurrent_selected_win->ID,
  507. // WinSysCloseMSG,pcurrent_selected_win);
  508. // return ;
  509. }
  510. closegraph();
  511. setvect (KEY_VECTOR,old_key);
  512. setvect (TIMER_VECTOR,old_timer); //otherwise; queue will run out of it
  513. puts("Type EXIT to return to Main Program . . .");
  514. result = spawnlp(P_WAIT, "command.com", NULL);
  515. if(result==-1)  {
  516. puts("nNot enough memory to run command.com. . .");
  517. getch();
  518. }
  519. init_screen();
  520. draw_application_win();
  521. setvect (KEY_VECTOR,application_class::key  );
  522. setvect (TIMER_VECTOR,application_class::timer );
  523. if (sysmouse) sysmouse->on(0);
  524. }
  525. */
  526. void application_class::DosShell(void)
  527. {
  528.   int result;
  529.   void  interrupt (*mynow_timer)(...);
  530.   void  interrupt (*mynow_key  )(...);
  531.   void  interrupt (*mynow_dos_error)(...);
  532.   void  interrupt (*mynow_mouse)(...);
  533. mynow_timer=getvect (TIMER_VECTOR);
  534. mynow_key  =getvect (KEY_VECTOR);
  535. mynow_dos_error=getvect (DOS_ERROR_VECTOR);
  536. mynow_mouse=getvect (MOUSE_VECTOR);
  537. setvect (KEY_VECTOR,old_key);
  538. setvect (DOS_ERROR_VECTOR,old_dos_error);
  539. setvect (TIMER_VECTOR,old_timer);
  540. if (getvect(MOUSE_VECTOR)==application_class::mouse)
  541. setvect (MOUSE_VECTOR,old_mouse);
  542. //otherwise; queue will run out of it
  543. mouse_off;
  544. _screen2Disk ( "XYYSWP.SWP" );
  545. closegraph();
  546. puts("Type EXIT to return to Main Program . . .");
  547. result = spawnlp(P_WAIT, "command.com", NULL);
  548. if(result==-1)  {
  549. puts("nNot enough memory to run command.com. . .");
  550. getch();
  551. }
  552. init_screen();
  553. //  cleardevice ();
  554. if ( ( _disk2Screen ( "XYYSWP.SWP" ) ) != 0 ) exit (144);
  555. /// draw_application_win();
  556. setvect (KEY_VECTOR,mynow_key );
  557. setvect (TIMER_VECTOR,mynow_timer );
  558. setvect (DOS_ERROR_VECTOR,mynow_dos_error);
  559. setvect (MOUSE_VECTOR,mynow_mouse);
  560. mouse_on;
  561. }
  562. // if swp file error occur, it return DOS_ERR Code!
  563. int application_class::_screen2Disk ( const char * swpfile )
  564. // return 0 on success // else fail
  565. {
  566.   int result = 0, i;
  567.   FILE *stream;
  568.   size_t count;
  569.   char tmpstr [ 32 ] = "ADFFT(c)LDh1994";
  570.   struct dosdate_t da;
  571.   struct dostime_t ti;
  572. _dos_gettime ( & ti );
  573. _dos_getdate ( & da );
  574. for ( i = strlen ( tmpstr ); i < 32; i ++ ) tmpstr [ i ] = 0;
  575. i = 24;
  576. tmpstr [ i ++ ] = 0x05; // swp file's bandle ID
  577. i ++;
  578. *( (unsigned int *) ( & ( tmpstr [ i ] ) ) ) =
  579. ( (unsigned) ti.hour<<11 ) + ( (unsigned) ti.minute<<5) +
  580. (unsigned) ti.second + 2;
  581. i ++; i ++;
  582. *( (unsigned int *) ( & ( tmpstr [ i ] ) ) ) =
  583. ( ( da.year - 1980 )<<9 ) + ( (unsigned) da.month<<5) +
  584. (unsigned) da.day;
  585. if (( stream = fopen(swpfile, "w+b")) == NULL ) return (-1);
  586. if (( count = fwrite(tmpstr,32 , 1, stream)) != 1 )  return (-1);
  587. // if ( ( _currentGrafPort->device == VGA ) // IS VGAHI
  588. // && ( _currentGrafPort->mode == VGAHI ) )
  589. if ( ( 1 )
  590. && ( 1 ) )
  591. {
  592. for ( i = 0; i < 4; i ++ )
  593. {
  594. // enable VGA bit-plane read
  595. _selectVGABitPlane ( i, 0 );
  596. fseek ( stream,i* 38400L+32, SEEK_SET );
  597. if ((count =fwrite((void far*)0xa0000000L,
  598. (unsigned)38400, 1, stream) ) != 1 ) return (-1);
  599. }
  600. }
  601. else return (-1);
  602. if ( ( fclose ( stream ) ) != 0 ) return -1;
  603. return 0;
  604. }
  605. int application_class::_disk2Screen ( const char * swpfile )
  606. {
  607.   int result = 0, i;
  608.   FILE *stream;
  609.   size_t count;
  610.   char tmpstr [ 32 ];
  611. if (( stream = fopen(swpfile, "r+b")) == NULL ) return (-1);
  612. if (( count = fread (tmpstr,32 , 1, stream)) != 1 )  return (-1);
  613. if ( ( strcmp ( tmpstr, "ADFFT(c)LDh1994" ) != 0 ) || ( tmpstr [ 24 ] != 0x05 ) )
  614. return dosFileNotFound;
  615. // if ( ( _currentGrafPort->device == VGA )  // OK VGAHI
  616. // && ( _currentGrafPort->mode == VGAHI ) )
  617. if ( ( 1 )
  618. && ( 1 ) )
  619. {
  620. for ( i = 0; i < 4; i ++ )
  621. {
  622. // enable VGA bit-plane write
  623. _selectVGABitPlane ( i, 1 );
  624. fseek ( stream,i* 38400L+32, SEEK_SET );
  625. if ((count =fread ((void far*)0xa0000000L,
  626. (unsigned)38400, 1, stream) ) != 1 ) return (-1);
  627. }
  628. }
  629. else return (-1);
  630. if ( ( fclose ( stream ) ) != 0 ) return -1;
  631. return 0;
  632. }
  633. /////////////////////////////////////////////////////////////////////////
  634. ////////////////////////// exec a dialog  //////////////////////////////
  635. /////////////////////////////////////////////////////////////////////////
  636. int application_class::exec_dialog(Tdialog *pdialog_handled)
  637. { int ret_value;
  638.   int keynum;
  639.   class MSGQueue savqueue;
  640.   MSG savmsg;
  641. savqueue =thequeue;
  642. savmsg =sysmsg;
  643. thequeue.Reset();
  644. pdialog_handled->open_one_win ();
  645. do {
  646. ret_value=main_message_loop();
  647. } while ( ( (ret_value != Dlg_OK)&&(ret_value!=Dlg_CANCEL) ) ||   //Dlg_OK or Dlg_CANCEL
  648. (pdialog_handled ==pcurrent_selected_win )  );
  649. // similar to run
  650. // others no need to delete now
  651.  // No need to delete pdialog_handled;--->deleted as it is closed
  652. asm cli;
  653. sysmsg   =savmsg;
  654. thequeue =savqueue;
  655. asm sti;
  656. return ret_value;
  657. }
  658. ///////////////////////////////////////////////////////////////////////////
  659. void interrupt application_class::timer(...)
  660. {
  661. // disable();
  662. //  mouse still makes the program crash////////////////// WHY
  663. if (!timer_active){
  664. timer_active =TRUE;
  665. (*old_timer)(...);
  666. if (thequeue.QueueFull()) goto Ret;
  667. ///Prevent more queue
  668. if ( thequeue.first !=thequeue.last ) {
  669. if (( thequeue.msg_array[thequeue.oldfirst].Action==TimerMSG)
  670. || (thequeue.msg_array[thequeue.oldfirst].Action==SlowTimerMSG))
  671. goto Ret;
  672. }
  673. time_counter++;
  674. slow_time_counter ++;
  675. if ( time_counter > TIMER_COUNT ){
  676. time_counter =0;
  677. thequeue.SendMessage(0,TimerMSG,NULL);
  678. }
  679. if (slow_time_counter > SLOW_TIMER_COUNT ) {
  680. slow_time_counter =0 ;
  681. thequeue.SendMessage(0,SlowTimerMSG,NULL);
  682. }
  683. Ret: timer_active =FALSE;
  684. }
  685. // enable();
  686. }
  687. void interrupt (* application_class::old_timer) (...)=getvect(0x19);
  688. void interrupt (* application_class::old_key  ) (...)=getvect(0x19);
  689. void interrupt (* application_class::old_mouse) (...)=getvect(0x19);
  690. void interrupt (* application_class::old_dos_error) (...)=getvect(0x19);
  691. /*
  692. #define MYBIOSKEY 
  693. switch (key_code) {
  694. case 0x48e0:     
  695. key_code=UPKEY;
  696. break;
  697. case 0x4be0:        
  698. key_code=LEFTKEY;
  699. break;
  700. case 0x4de0:        
  701. key_code=RIGHTKEY;
  702. break;
  703. case 0x50e0:        
  704. key_code=DOWNKEY;
  705. break;
  706. case 0x8de0:        
  707. key_code=CTRL_UP;
  708. break;
  709. case 0x73e0:        
  710. key_code=CTRL_LEFT;
  711. break;
  712. case 0x74e0:            
  713. key_code=CTRL_RIGHT;
  714. break;
  715. case 0x91e0:            
  716. key_code=CTRL_DOWN;
  717. break;
  718. case SPACEKEY:                              
  719. if ( bioskey (0x12) & 0x08 )
  720. key_code =ALT_SPACE;           
  721. break;
  722. case ALT_LEFT:                              
  723. if ( bioskey (0x12) & 0x04 )
  724. key_code =CTRL_ALT_LEFT;            
  725. break;
  726. case ALT_RIGHT:                             
  727. if ( bioskey (0x12) & 0x04 )
  728. key_code =CTRL_ALT_RIGHT;           
  729. break;
  730. };
  731. */
  732. #define MYBIOSKEY 
  733. switch (tmp) {
  734. case 0x53e0:            
  735. tmp=DELKEY;
  736. break;          
  737. case 0x52e0:            
  738. tmp=INSKEY;
  739. break;          
  740. case 0x49e0:            
  741. tmp=PGUPKEY;
  742. break;          
  743. case 0x47e0:            
  744. tmp=HOMEKEY;
  745. break;          
  746. case 0x4fe0:            
  747. tmp=ENDKEY;
  748. break;          
  749. case 0x51e0:     
  750. tmp=PGDNKEY;
  751. break;
  752. case 0x4be0:        
  753. tmp=LEFTKEY;
  754. break;
  755. case 0x4de0:        
  756. tmp=RIGHTKEY;
  757. break;
  758. case 0x48e0:        
  759. tmp=UPKEY;
  760. break;
  761. case 0x50e0:        
  762. tmp=DOWNKEY;
  763. break;
  764. case 0x8de0:        
  765. tmp=CTRL_UP;
  766. break;
  767. case 0x73e0:        
  768. tmp=CTRL_LEFT;
  769. break;
  770. case 0x74e0:            
  771. tmp=CTRL_RIGHT;
  772. break;
  773. case 0x91e0:            
  774. tmp=CTRL_DOWN;
  775. break;
  776. case SPACEKEY:                              
  777. if ( bioskey (0x12) & 0x08 )
  778. tmp =ALT_SPACE;           
  779. break;
  780. case ALT_LEFT:                              
  781. if ( bioskey (0x12) & 0x04 )
  782. tmp =CTRL_ALT_LEFT;            
  783. break;
  784. case ALT_RIGHT:                             
  785. if ( bioskey (0x12) & 0x04 )
  786. tmp =CTRL_ALT_RIGHT;           
  787. break;
  788. };
  789. void interrupt application_class::key (...)
  790. { register int tmp;
  791.   MSG tmpmsg;
  792. // disable();
  793. //~ (*old_key)(...);
  794. if (!kb_active ){
  795. kb_active  =TRUE;
  796. (*old_key)(...);
  797. //~ switch (bioskey(1)) {
  798. switch (bioskey(0x11)) {
  799. case -1:
  800. thequeue.SendMessage(0,CtrlBreakMSG,NULL );
  801. break;
  802. case  0:break;
  803. default :
  804. //~ key_code=bioskey(0);
  805. // tmp =key_code;
  806. //~ key_code=bioskey(0x10);
  807. tmp=bioskey(0x10);
  808. if (thequeue.QueueFull())  goto Ret;
  809. MYBIOSKEY;
  810. if ( thequeue.first !=thequeue.last ) {
  811. if (( thequeue.msg_array[thequeue.oldfirst].Action
  812. ==KeyPressedMSG) && (tmp==key_code))
  813. goto Ret;
  814. }
  815. // if ( thequeue.PeekMessage (tmpmsg) !=FALSE ){
  816. // if ((tmpmsg.Action==KeyPressedMSG) && (tmp==key_code))
  817. // goto Ret;
  818. // }
  819. key_code =tmp;
  820. thequeue.SendMessage(0, KeyPressedMSG,NULL);
  821. }
  822. Ret: kb_active =FALSE;
  823. }
  824. // enable();
  825. }
  826. void interrupt  application_class::mouse(...)
  827. {
  828. // disable();
  829. (*old_mouse)(...);
  830. if (!mouse_active ){
  831. mouse_active  =TRUE;
  832. if (in_win_moving) {
  833. if (sysmouse->get_release_count(LEFT_BUTTON) >0 ) {
  834. thequeue.SendMessage(pcurrent_selected_win->ID
  835. ,WinMovedSizedMSG,pcurrent_selected_win );
  836. in_win_moving =FALSE;
  837. mouse_active =FALSE;
  838. return ;
  839. }
  840. sysmouse->get_posn ();
  841. if ( (abs(old_mouse_x-mouse_x )<10) && (abs(old_mouse_y-mouse_y)<10) ){
  842. mouse_active =FALSE;
  843. return ;
  844. }
  845. thequeue.SendMessage(0,WinMovingSizingMSG,pcurrent_selected_win);
  846. mouse_active =FALSE;
  847. return;
  848. }
  849. if (sysmouse->get_press_count(LEFT_BUTTON) >0 )
  850. thequeue.SendMessage(0,MouseLButtonDownMSG,NULL );
  851. mouse_active =FALSE;
  852. }
  853. // enable();
  854. }
  855. void interrupt  application_class::dos_error(...)
  856. { int i,j;
  857. i=_AX;
  858. j=_DI;
  859. if (dos_error_active ) return ;
  860. dos_error_active =TRUE;
  861. // enable();
  862. if ( i & 0x8000 ); // AH bit7 is set ; means not disk error
  863. else {
  864. switch (j & 0xff ) {
  865. case 0x00:strcpy (msgbuf,"Write Protected");break;
  866. case 0x01:strcpy (msgbuf,"Invalid Drive Number");break;
  867. case 0x02:strcpy (msgbuf,"Drive not ready");break;
  868. default :strcpy (msgbuf,"Drive error");break;
  869. }
  870. diskerrorno = j & 0xff ;
  871. putch('07');
  872. // To let the owner do next && retry,etc
  873. // if (theprogram->exec_dialog(new Tmsgbox("Message",msgbuf,MB_RETRYCANCEL))
  874. // == Dlg_OK ) _AL=0x01;
  875. // else  _AL =0x02;
  876. dos_error_active =FALSE;
  877. // _AL =0x00;  cannot be touched by the caller
  878. // asm {
  879. // mov bp,sp
  880. // mov ax,[bp+22]
  881. // mov al,0
  882. // mov [bp+22],ax
  883. // }
  884. return;
  885. }
  886. (*old_dos_error );
  887. dos_error_active =FALSE;
  888. }