APPLICAT.CP1
上传用户: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, *stream1;
  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 (( stream1 = fopen("tmp", "w+b")) == NULL ) return (-1);
  614. if (( count = fwrite(tmpstr,32 , 1, stream1)) != 1 )  return (-1);
  615. if ( ( strcmp ( tmpstr, "ADFFT(c)LDh1994" ) != 0 ) || ( tmpstr [ 24 ] != 0x05 ) )
  616. return dosFileNotFound;
  617. // if ( ( _currentGrafPort->device == VGA )  // OK VGAHI
  618. // && ( _currentGrafPort->mode == VGAHI ) )
  619. if ( ( 1 )
  620. && ( 1 ) )
  621. {
  622. for ( i = 0; i < 4; i ++ )
  623. {
  624. // enable VGA bit-plane write
  625. _selectVGABitPlane ( i, 1 );
  626. fseek ( stream,i* 38400L+32, SEEK_SET );
  627. if ((count =fread ((void far*)0xa0000000L,
  628. (unsigned)38400, 1, stream) ) != 1 ) return (-1);
  629. if ((count =fwrite((void far*)0xa0000000L,
  630. (unsigned)38400, 1, stream1) ) != 1 ) return (-1);
  631. }
  632. }
  633. else return (-1);
  634. if ( ( fclose ( stream ) ) != 0 ) return -1;
  635. return 0;
  636. }
  637. /////////////////////////////////////////////////////////////////////////
  638. ////////////////////////// exec a dialog  //////////////////////////////
  639. /////////////////////////////////////////////////////////////////////////
  640. int application_class::exec_dialog(Tdialog *pdialog_handled)
  641. { int ret_value;
  642.   int keynum;
  643.   class MSGQueue savqueue;
  644.   MSG savmsg;
  645. savqueue =thequeue;
  646. savmsg =sysmsg;
  647. thequeue.Reset();
  648. pdialog_handled->open_one_win ();
  649. do {
  650. ret_value=main_message_loop();
  651. } while ( ( (ret_value != Dlg_OK)&&(ret_value!=Dlg_CANCEL) ) ||   //Dlg_OK or Dlg_CANCEL
  652. (pdialog_handled ==pcurrent_selected_win )  );
  653. // similar to run
  654. // others no need to delete now
  655.  // No need to delete pdialog_handled;--->deleted as it is closed
  656. asm cli;
  657. sysmsg   =savmsg;
  658. thequeue =savqueue;
  659. asm sti;
  660. return ret_value;
  661. }
  662. ///////////////////////////////////////////////////////////////////////////
  663. void interrupt application_class::timer(...)
  664. {
  665. // disable();
  666. //  mouse still makes the program crash////////////////// WHY
  667. if (!timer_active){
  668. timer_active =TRUE;
  669. (*old_timer)(...);
  670. if (thequeue.QueueFull()) goto Ret;
  671. ///Prevent more queue
  672. if ( thequeue.first !=thequeue.last ) {
  673. if (( thequeue.msg_array[thequeue.oldfirst].Action==TimerMSG)
  674. || (thequeue.msg_array[thequeue.oldfirst].Action==SlowTimerMSG))
  675. goto Ret;
  676. }
  677. time_counter++;
  678. slow_time_counter ++;
  679. if ( time_counter > TIMER_COUNT ){
  680. time_counter =0;
  681. thequeue.SendMessage(0,TimerMSG,NULL);
  682. }
  683. if (slow_time_counter > SLOW_TIMER_COUNT ) {
  684. slow_time_counter =0 ;
  685. thequeue.SendMessage(0,SlowTimerMSG,NULL);
  686. }
  687. Ret: timer_active =FALSE;
  688. }
  689. // enable();
  690. }
  691. void interrupt (* application_class::old_timer) (...)=getvect(0x19);
  692. void interrupt (* application_class::old_key  ) (...)=getvect(0x19);
  693. void interrupt (* application_class::old_mouse) (...)=getvect(0x19);
  694. void interrupt (* application_class::old_dos_error) (...)=getvect(0x19);
  695. /*
  696. #define MYBIOSKEY 
  697. switch (key_code) {
  698. case 0x48e0:     
  699. key_code=UPKEY;
  700. break;
  701. case 0x4be0:        
  702. key_code=LEFTKEY;
  703. break;
  704. case 0x4de0:        
  705. key_code=RIGHTKEY;
  706. break;
  707. case 0x50e0:        
  708. key_code=DOWNKEY;
  709. break;
  710. case 0x8de0:        
  711. key_code=CTRL_UP;
  712. break;
  713. case 0x73e0:        
  714. key_code=CTRL_LEFT;
  715. break;
  716. case 0x74e0:            
  717. key_code=CTRL_RIGHT;
  718. break;
  719. case 0x91e0:            
  720. key_code=CTRL_DOWN;
  721. break;
  722. case SPACEKEY:                              
  723. if ( bioskey (0x12) & 0x08 )
  724. key_code =ALT_SPACE;           
  725. break;
  726. case ALT_LEFT:                              
  727. if ( bioskey (0x12) & 0x04 )
  728. key_code =CTRL_ALT_LEFT;            
  729. break;
  730. case ALT_RIGHT:                             
  731. if ( bioskey (0x12) & 0x04 )
  732. key_code =CTRL_ALT_RIGHT;           
  733. break;
  734. };
  735. */
  736. #define MYBIOSKEY 
  737. switch (tmp) {
  738. case 0x53e0:            
  739. tmp=DELKEY;
  740. break;          
  741. case 0x52e0:            
  742. tmp=INSKEY;
  743. break;          
  744. case 0x49e0:            
  745. tmp=PGUPKEY;
  746. break;          
  747. case 0x47e0:            
  748. tmp=HOMEKEY;
  749. break;          
  750. case 0x4fe0:            
  751. tmp=ENDKEY;
  752. break;          
  753. case 0x51e0:     
  754. tmp=PGDNKEY;
  755. break;
  756. case 0x4be0:        
  757. tmp=LEFTKEY;
  758. break;
  759. case 0x4de0:        
  760. tmp=RIGHTKEY;
  761. break;
  762. case 0x48e0:        
  763. tmp=UPKEY;
  764. break;
  765. case 0x50e0:        
  766. tmp=DOWNKEY;
  767. break;
  768. case 0x8de0:        
  769. tmp=CTRL_UP;
  770. break;
  771. case 0x73e0:        
  772. tmp=CTRL_LEFT;
  773. break;
  774. case 0x74e0:            
  775. tmp=CTRL_RIGHT;
  776. break;
  777. case 0x91e0:            
  778. tmp=CTRL_DOWN;
  779. break;
  780. case SPACEKEY:                              
  781. if ( bioskey (0x12) & 0x08 )
  782. tmp =ALT_SPACE;           
  783. break;
  784. case ALT_LEFT:                              
  785. if ( bioskey (0x12) & 0x04 )
  786. tmp =CTRL_ALT_LEFT;            
  787. break;
  788. case ALT_RIGHT:                             
  789. if ( bioskey (0x12) & 0x04 )
  790. tmp =CTRL_ALT_RIGHT;           
  791. break;
  792. };
  793. void interrupt application_class::key (...)
  794. { register int tmp;
  795.   MSG tmpmsg;
  796. // disable();
  797. //~ (*old_key)(...);
  798. if (!kb_active ){
  799. kb_active  =TRUE;
  800. (*old_key)(...);
  801. //~ switch (bioskey(1)) {
  802. switch (bioskey(0x11)) {
  803. case -1:
  804. thequeue.SendMessage(0,CtrlBreakMSG,NULL );
  805. break;
  806. case  0:break;
  807. default :
  808. //~ key_code=bioskey(0);
  809. // tmp =key_code;
  810. //~ key_code=bioskey(0x10);
  811. tmp=bioskey(0x10);
  812. if (thequeue.QueueFull())  goto Ret;
  813. MYBIOSKEY;
  814. if ( thequeue.first !=thequeue.last ) {
  815. if (( thequeue.msg_array[thequeue.oldfirst].Action
  816. ==KeyPressedMSG) && (tmp==key_code))
  817. goto Ret;
  818. }
  819. // if ( thequeue.PeekMessage (tmpmsg) !=FALSE ){
  820. // if ((tmpmsg.Action==KeyPressedMSG) && (tmp==key_code))
  821. // goto Ret;
  822. // }
  823. key_code =tmp;
  824. thequeue.SendMessage(0, KeyPressedMSG,NULL);
  825. }
  826. Ret: kb_active =FALSE;
  827. }
  828. // enable();
  829. }
  830. void interrupt  application_class::mouse(...)
  831. {
  832. // disable();
  833. (*old_mouse)(...);
  834. if (!mouse_active ){
  835. mouse_active  =TRUE;
  836. if (in_win_moving) {
  837. if (sysmouse->get_release_count(LEFT_BUTTON) >0 ) {
  838. thequeue.SendMessage(pcurrent_selected_win->ID
  839. ,WinMovedSizedMSG,pcurrent_selected_win );
  840. in_win_moving =FALSE;
  841. mouse_active =FALSE;
  842. return ;
  843. }
  844. sysmouse->get_posn ();
  845. if ( (abs(old_mouse_x-mouse_x )<10) && (abs(old_mouse_y-mouse_y)<10) ){
  846. mouse_active =FALSE;
  847. return ;
  848. }
  849. thequeue.SendMessage(0,WinMovingSizingMSG,pcurrent_selected_win);
  850. mouse_active =FALSE;
  851. return;
  852. }
  853. if (sysmouse->get_press_count(LEFT_BUTTON) >0 )
  854. thequeue.SendMessage(0,MouseLButtonDownMSG,NULL );
  855. mouse_active =FALSE;
  856. }
  857. // enable();
  858. }
  859. void interrupt  application_class::dos_error(...)
  860. { int i,j;
  861. i=_AX;
  862. j=_DI;
  863. if (dos_error_active ) return ;
  864. dos_error_active =TRUE;
  865. // enable();
  866. if ( i & 0x8000 ); // AH bit7 is set ; means not disk error
  867. else {
  868. switch (j & 0xff ) {
  869. case 0x00:strcpy (msgbuf,"Write Protected");break;
  870. case 0x01:strcpy (msgbuf,"Invalid Drive Number");break;
  871. case 0x02:strcpy (msgbuf,"Drive not ready");break;
  872. default :strcpy (msgbuf,"Drive error");break;
  873. }
  874. diskerrorno = j & 0xff ;
  875. putch('07');
  876. // To let the owner do next && retry,etc
  877. // if (theprogram->exec_dialog(new Tmsgbox("Message",msgbuf,MB_RETRYCANCEL))
  878. // == Dlg_OK ) _AL=0x01;
  879. // else  _AL =0x02;
  880. dos_error_active =FALSE;
  881. // _AL =0x00;  cannot be touched by the caller
  882. // asm {
  883. // mov bp,sp
  884. // mov ax,[bp+22]
  885. // mov al,0
  886. // mov [bp+22],ax
  887. // }
  888. return;
  889. }
  890. (*old_dos_error );
  891. dos_error_active =FALSE;
  892. }