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

界面编程

开发平台:

DOS

  1. /*        
  2. About       DOS_WIN
  3. This program is to generate a Windows - Like Graphical User Interface(GUI)
  4. in DOS. It is mainly for users to develop their own programs in DOS. 
  5. In DOS, the porogram has offered a lot of Windows-like facilities such as 
  6. Multi-Windows, DIalog, Button, CheckBox, Radios, ListBox, ScrollBar, and 
  7. PullDown Menus ( With no-limit SubMenus!) And a lot of Other Choices. 
  8. It also offer Mouse Functions for Menu selection and Window operation.
  9. With all SOURCE CODEs Included, You can  easily modify it for your own 
  10. purpose especially when you want to write a Graphics Program while you 
  11. donot like to use the Windows Programming !! Since the program is designed
  12. as a C++ downword system, some parts like GUI are completely indepentent. 
  13. You can easily modify the main program and insert your own codes to it.
  14. The package include a Example of Drawing a 3D-Object and viewing it in any
  15. way. To start it just type the exe file and the program will work. It will 
  16. work on a PC with EGA/VGA Monitor. It is Compiled by Borland C++ 3.1
  17. You can distribute the source code freely only together with this readme
  18. file. Since this is a shareware, you are required to register in order 
  19. to use it in your own program. It will cost $500. 
  20. However, if you do not like to pay so much, you can also pay as much as you 
  21. wish to register. Just think the time and energe you will save by this 
  22. program !
  23. After you register for this program, you will get permission to 
  24. include the source code to your own program. Besides,you will also 
  25. get more detailed comments of the source code and you can get answers 
  26. from author about any programming problems without extra fee.
  27. Money and Check should mail to: 
  28. <Current Address: Valid Since Sept. 1995>
  29. Mr. Yongyong Xu,
  30. 1940 Howard Street. Apt. 333,
  31. Kalamazoo, MI 49008
  32. U.S.A.
  33. Telephone: (616) 387-7569
  34. EMail:  yxu@cs.wmich.edu   (prefered)
  35. or 
  36. 99xu1@grog.lab.cc.wmich.edu
  37. When you cannot reach me by the above address, try the next:
  38. -----------------------------------------------------------------------
  39. <Permanet Home Address>
  40. Mr. Xu Yongyong,
  41. Building 34 Room 604,
  42. HuayuanXinCun , Chang Zhou
  43. Jiang Su Province 213016
  44. P.R.China
  45. Tel:(86)-(519)-(328-0177)
  46. */
  47. // 1993 (c) ALL RIGHTS RESERVED
  48. // AUTHOR: XuYongYong
  49. /*  yyxmain.cpp
  50. */
  51. #define __YYXMAIN
  52. #include <stdio.h>
  53. #include <math.h>
  54. #include <string.h>
  55. #include "mouse.h"
  56. #include "yyxmain.h"
  57. #include "dialog.h"
  58. #include "filedial.h"
  59. #include "msgbox.h"
  60. #include "3dmenu.h"
  61. #include "3dgbas.h"
  62. void error (char *error_message )
  63. {
  64. if (getvect(TIMER_VECTOR)==application_class::timer )
  65. setvect (TIMER_VECTOR,theprogram->old_timer);
  66. if (getvect(KEY_VECTOR)==theprogram->application_class::key )
  67. setvect (KEY_VECTOR,theprogram->old_key);
  68. if (getvect(MOUSE_VECTOR)==theprogram->application_class::mouse)
  69. setvect (MOUSE_VECTOR,theprogram->old_mouse);
  70. if (getvect(DOS_ERROR_VECTOR)==application_class::dos_error)
  71. setvect (DOS_ERROR_VECTOR,theprogram->old_dos_error);
  72. delete theprogram;
  73. puts(error_message);
  74. putch ('07');
  75. exit(1);
  76. }
  77. #include <signal.h>
  78. void Catcher(int *reglist);
  79. void Catcher(int *reglist)
  80. {
  81. theprogram->exec_dialog(new Tmsgbox("Message","Floating point error",MB_OK));
  82. error("");
  83. //  puts("Caught it!");
  84. // *(reglist + 8) = 3; /* make return AX = 3 */
  85. }
  86. int matherr (struct exception *a)
  87. {
  88.   if (a->type == DOMAIN) {
  89.   puts (a->name);
  90.   putch(0x07);
  91.   a->retval =1;
  92. return 1;
  93. }
  94.   return 0;
  95. }
  96. void myexit()  // Normal Exited message after main
  97. {
  98. if (bioskey(1) == 0)
  99. //  if  (bioskey(0) == SPACEKEY)
  100. {
  101. closegraph();
  102. }
  103. puts ("OK, Exited");
  104. }
  105. #pragma exit myexit
  106. ///theprogram_class:////theprogram_class:////theprogram_class:////theprogram_class://
  107. theprogram_class::theprogram_class(int menu_num,char *title)
  108. :application_class(menu_num,title){};
  109. void theprogram_class::get_my_menu()
  110. {
  111. application_class::get_my_menu();
  112. my_menu[SPECIAL_MENU] =new Tmenu (SPECIAL_MENU," ",
  113. "Special Function",my_menu[MAIN_MENU] );
  114. my_menu[GRAPH] =new Tmenu (GRAPH,"&Graph",
  115. "",my_menu[MAIN_MENU] );
  116. my_menu[ROTATE] =new Tmenu (ROTATE,"&Rotate",
  117. "    ",my_menu[MAIN_MENU] );
  118. my_menu[HELP] =new Tmenu (HELP,"&Helps",
  119. "Helps ",my_menu[MAIN_MENU] );
  120. my_menu[ABOUT_MENU_ITEM] =new Tmenu (ABOUT_MENU_ITEM,"About... ",
  121. "About the Program",my_menu[HELP] );
  122. // the order is important
  123. //  win_sysmenu =new Tsysmenu (100,"","",my_menu[0]);
  124. my_menu[NEW] =new Tmenu (NEW,"&New ",
  125. "new graph ",   my_menu[GRAPH] );
  126. my_menu[CLOSE] =new Tmenu (CLOSE,"&Close   ",
  127. "close current graph",my_menu[GRAPH] );
  128. my_menu[MYDOSSHELL] =new Tmenu (DOSSHELL,"&Dosshell",
  129. "return to dos",my_menu[GRAPH] );
  130. my_menu[QUIT] =new Tmenu (QUIT,"&Quit         ALT_X",
  131. "Quit the system",my_menu[GRAPH] );
  132. my_menu[LEFT] =new Tmenu (LEFT,"&Left",
  133. "Left", my_menu[ROTATE] );
  134. my_menu[RIGHT] =new Tmenu (RIGHT,"&Right",
  135. "Right",    my_menu[ROTATE] );
  136. my_menu[UP] =new Tmenu (UP,"&Up",
  137. "Up",   my_menu[ROTATE] );
  138. my_menu[DOWN] =new Tmenu (DOWN,"&Down",
  139. "Down", my_menu[ROTATE] );
  140. my_menu[NEAR] =new Tmenu (NEAR,"&Near  ...F2KEY",
  141. "Near  ....F2KEY",  my_menu[ROTATE] );
  142. my_menu[FAR ] =new Tmenu (FAR ,"&Far   ...F1KEY",
  143. "Far   ....F1KEY",  my_menu[ROTATE] );
  144. //  my_menu[DISTANCE ] =new Tmenu (DISTANCE,"D&istance",
  145. //      "Distance   ....F3KEY", my_menu[ROTATE] );
  146. my_menu[VIEWPOINT ] =new Tmenu (DISTANCE,"V&iewpoint",
  147. "VIEWPOINT  ....F4KEY", my_menu[ROTATE] );
  148. my_menu[X_VALUE ] =new Tmenu (X_VALUE ,"X&value   ",
  149. "X_Value   ....",   my_menu[VIEWPOINT] );
  150. my_menu[Y_VALUE ] =new Tmenu (Y_VALUE ,"Y&value   ",
  151. "Y_Value   ....",   my_menu[VIEWPOINT] );
  152. my_menu[Z_VALUE ] =new Tmenu (Z_VALUE ,"Zvalue   ",
  153. "Z_Value   ....",   my_menu[VIEWPOINT] );
  154. start_menu->psub_menu_selected =my_menu[MAIN_MENU];
  155. start_menu->pson_menu    =my_menu[MAIN_MENU];
  156. Imme_Menu_ID[0]= QUIT;   Immediate_key[0]=ALT_X;  Imme_Menu_fptr[0]=my_menu[QUIT];
  157. Max_Imme_key_nums=1; //
  158. }
  159. ////////////////////////////////////////////////////////////////////////
  160. #include <stdio.h>
  161. void theprogram_class::newgraph ()
  162. {
  163.   FILE *in;
  164.   char fileopen[100]="NONAME00.dat";
  165.   int izero;    // 0xff ===> Nrmgraph ; 0xfe ===>  Modgraph
  166. strcpy (msgbuf,"OK,You Opened a New Graph");
  167. exec_dialog(new Tmsgbox("Message",msgbuf,MB_OK));
  168.   Tgraphbas *agraph;
  169. if (pcurrent_selected_win ==NULL ) {
  170. agraph=new Tgraphbas(1,fileopen,UNRESERVE_WIN,ALT_1,5,5,540,340  );
  171. agraph->open_one_win ();
  172. }  else if ((pcurrent_selected_win->bounds.right+25<600) &&
  173.    (pcurrent_selected_win->bounds.bottom+25<400)){
  174. agraph=new Tgraphbas(1,fileopen,UNRESERVE_WIN,ALT_1,
  175. pcurrent_selected_win->bounds.left+25,
  176. pcurrent_selected_win->bounds.top +25,
  177. 540,340   );
  178. agraph->open_one_win ();
  179. }  else {
  180. agraph=new Tgraphbas(1,fileopen,UNRESERVE_WIN,ALT_1,5,5,550,340   );
  181. agraph->open_one_win ();
  182. }
  183. }
  184. void theprogram_class::close()
  185. {
  186. if ( pcurrent_selected_win  != NULL )
  187. thequeue.SendMessage(pcurrent_selected_win->ID,
  188. WinSysCloseMSG,pcurrent_selected_win);
  189. }
  190. ////////////////////////////////////////////////////////////////////////
  191. BOOL theprogram_class::echo_to_menu(long menu_ID)
  192. {
  193. if (application_class::echo_to_menu(menu_ID)) return TRUE;
  194. switch (menu_ID ){
  195. case MAIN_MENU      : ; break;
  196. case SPECIAL_MENU   : ; break;
  197. case ABOUT_MENU_ITEM    :
  198. strcpy (msgbuf,"NEW VERSION OF XYY 3D SYSTEM");
  199. exec_dialog(new Tmsgbox("HELP",msgbuf,MB_OK));
  200. break;
  201. case NEW:   newgraph(); break;
  202. case CLOSE: close(); break;
  203. case QUIT: thequeue.SendMessage(0,SysQuitMSG,NULL );break;
  204. default: return FALSE;
  205. }
  206. return TRUE;
  207. }
  208. //////////////////////////////////////////////////////////////////////////
  209. int  theprogram_class::second_class_msg_handler (MSG& message)
  210. { int ret_value;
  211. ret_value =application_class::second_class_msg_handler (message);
  212. return ret_value;
  213. }
  214. void theprogram_class::anything_in_the_loop()
  215. {
  216. }
  217. void theprogram_class::init_ctrl()
  218. {
  219. }
  220. //MAINMAINMAINMAINMAINMAINMAINMAINMAINMAINMAINMAINMAINMAINMAINMAINMAINMAIN /
  221. //extern unsigned _stklen = 543210U;
  222. //extern unsigned _stklen = 64000U;
  223. extern unsigned _stklen = 54000U;
  224. typedef void (*fptr)(int);
  225. int main(int argc,char *argv[])
  226. { int status;
  227. signal(SIGFPE, (fptr)Catcher);  /* cast Catcher to appropriate type */
  228. if (strcmpi (argv[1],"/NOMOUSE")==0 ) nomouse =TRUE;
  229. if (strcmpi (argv[1],"/MOUSECOM1")==0 ) MOUSE_VECTOR=0x0c;
  230. if (strcmpi (argv[1],"/MOUSECOM2")==0 ) MOUSE_VECTOR=0x0b;
  231. if (    (strcmpi (argv[1],"/?")==0 ) ||
  232. (strcmpi (argv[1],"/H")==0 ) ||
  233. (strcmpi (argv[1],"/HELP")==0 )
  234.    ) {
  235. printf ("n Usage: %s [/NOMOUSE /MOUSECOM1 /MOUSECOM2]", argv[0]);
  236. puts ("n Programed By Xu Yongyong 1994");
  237. return 0;
  238. }
  239. theprogram =new theprogram_class
  240. (99,"                    XYY 3-D SYSTEM             1994");
  241. theprogram->run();
  242. status =theprogram->status;
  243. delete ( theprogram );
  244. return status;
  245. }