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

界面编程

开发平台:

DOS

  1. // 1993 (c) ALL RIGHTS RESERVED
  2. // AUTHOR: XuYongYong
  3. /*  yyxwin.cpp
  4. */
  5. #include "yyxwin.h"
  6. #include "sysmenu.h"
  7. #include "applicat.h"
  8. int win_class::make_it_and_above_invisible()
  9. {   struct pwin_list *temp;
  10. if ( pfirst_above  != NULL )   /* ? */
  11. for (temp=pfirst_above ;
  12. temp != NULL ; temp = temp ->pnext_list)
  13. temp->pthe_win->make_it_and_above_invisible ();
  14. if (visible == IN_VISIBLE ) return 0;
  15. if (visible == TEMP_IN_VISIBLE ) return 0;
  16. reserve_self_bitmap (  );
  17. restore_under_bitmap (  );
  18. visible =TEMP_IN_VISIBLE ;
  19. return 1;
  20. }
  21. int win_class::make_it_and_above_visible ()
  22. {   struct pwin_list *temp;
  23. if (visible ==VISIBLE ) return 0;
  24. if (visible ==IN_VISIBLE ) return 0;
  25. if (pfirst_under !=NULL )
  26. reserve_under_bitmap (  );
  27. restore_self_bitmap (  );
  28. visible = VISIBLE;
  29. if ( pfirst_above  != NULL )
  30. for (temp=pfirst_above ;
  31. temp != NULL ; temp = temp ->pnext_list)
  32. temp->pthe_win->make_it_and_above_visible ();
  33. return 1;
  34. }
  35. int win_class::invisible_one_win ()
  36. {
  37. // if (pwin_handled==NULL ) return 0;
  38. if (visible ==IN_VISIBLE ) return 0;
  39. make_it_and_above_invisible (  );        //invisible
  40. if (pfirst_above != NULL )
  41. pfirst_above->pthe_win->make_it_and_above_visible ();
  42. visible =IN_VISIBLE ;
  43. return 1;
  44. }
  45. int win_class::visible_one_win  ()
  46. {
  47. // if (pwin_handled==NULL ) return 0;
  48. if (visible ==VISIBLE ) return 0;
  49. make_it_and_above_invisible (  );
  50. visible=TEMP_IN_VISIBLE;
  51. make_it_and_above_visible (  );
  52. visible = VISIBLE ;
  53. return 1;
  54. }
  55. void win_class::select ()
  56. { Twin  *ptemp_win;
  57. if (this ==pcurrent_selected_win ) return ;
  58. unselect_current_selected_win ();
  59. if (visible == IN_VISIBLE ) return ;
  60. pcurrent_selected_win = this ;
  61. if (pfirst_above !=NULL ){
  62. make_it_and_above_invisible (  );
  63. if (pfirst_above != NULL )
  64. pfirst_above->pthe_win->make_it_and_above_visible ();
  65. if (pfirst_above !=NULL )
  66. reserve_under_bitmap (  );
  67. restore_self_bitmap ( );
  68. /* change_selected_win_links (  ); */
  69. kill_all_links (  );
  70. build_all_links ();
  71. }
  72. visible = VISIBLE;
  73. draw_win_frame ( );
  74. thequeue.SendMessage(ID,WinSelectedMSG,this);
  75. }
  76. void win_class::draw()
  77. {
  78. draw_win_frame ();
  79. draw_win_control ();
  80. draw_win_contents ();
  81. }
  82. int win_class::unselect_current_selected_win()
  83. { Twin   *ptemp_win;
  84. ptemp_win =pcurrent_selected_win;
  85. pcurrent_selected_win=NULL;
  86. if (ptemp_win !=NULL )
  87.  ptemp_win->draw_win_frame ();
  88. return 0;
  89. }
  90. int win_class::restore_self_bitmap ()
  91. {
  92. if ( type & UNRESERVE_WIN  ) {
  93. draw();
  94. return 1;
  95. }
  96. if (pself_bitmap != NULL ){
  97. setport(win_living_viewport);
  98. putimage (bounds.left,bounds.top
  99. ,pself_bitmap ,COPY_PUT);
  100. farfree (pself_bitmap );
  101. pself_bitmap=NULL;
  102. }
  103. return 0;
  104. }
  105. BOOL win_class::above_has_this (Twin *pwin)  //no recursion
  106. {
  107.   struct pwin_list *temp_list ;
  108. if (pwin == NULL ) return FALSE;
  109. if ( pwin->pfirst_above==NULL ) return FALSE;
  110. for (temp_list =pwin->pfirst_above; temp_list !=NULL;temp_list=temp_list->pnext_list ) {
  111. if ( temp_list->pthe_win == this) return TRUE;
  112. }
  113. return FALSE;
  114. }
  115. BOOL win_class::mark_above_win (Twin *pwin)              //no recursion
  116. {
  117.   struct pwin_list *temp_list ;
  118.   BOOL ret;
  119. if (pwin == NULL ) return FALSE;
  120. if ( pwin->pfirst_above==NULL ) return FALSE;
  121. ret =FALSE;
  122. for (temp_list =pwin->pfirst_above; temp_list !=NULL;temp_list=temp_list->pnext_list ) {
  123. if (!(temp_list->pthe_win->type & 0x40)) {
  124. temp_list->pthe_win->type |= 0x40;
  125. ret= TRUE;
  126. }
  127. }
  128. return ret;
  129. }
  130. BOOL win_class::under_all_redrawed (Twin *pwin)     // not include itself
  131. { Rect dstrect; // recurse
  132.   struct pwin_list *temp_list ;
  133. if (pwin==NULL ) return TRUE;
  134. if ( pwin->pfirst_under ==NULL  ) return TRUE;
  135. for (temp_list =pwin->pfirst_under; temp_list !=NULL;temp_list=temp_list->pnext_list ) {
  136.    if ( (temp_list->pthe_win->type & 0x40) &&
  137. (!(temp_list->pthe_win->type & 0x80))
  138.   ) return FALSE;
  139. else if (! under_all_redrawed(temp_list->pthe_win) ) return FALSE;
  140. }
  141. return TRUE;
  142. }
  143. int win_class::mark_need_redraw()
  144. { int no_more;
  145.   Twin *temp_win;
  146.  do{
  147. no_more= TRUE;
  148. for (temp_win=pfirst_win_of_all; temp_win !=NULL; temp_win=temp_win->pnext_win){
  149. if ( temp_win == this ) continue;
  150. if ( temp_win->visible==IN_VISIBLE ) continue;
  151. if ( temp_win->visible==TEMP_IN_VISIBLE ) continue;
  152. if ( temp_win->type & 0x40 )   {
  153. no_more=! mark_above_win(temp_win);
  154. continue;
  155. }
  156. if (above_has_this (temp_win)) {
  157. temp_win->type |= 0x40;
  158. no_more=FALSE;
  159. }
  160. }
  161.  }while (!no_more);
  162.  return 0;
  163. }
  164. int win_class::restore ()
  165. {
  166.   Twin *temp_win;
  167. mark_need_redraw();
  168.  int no_more;
  169.  do{
  170. no_more= TRUE;
  171. for (temp_win=pfirst_win_of_all; temp_win !=NULL; temp_win=temp_win->pnext_win){
  172. if (temp_win == this ) continue;
  173. if (!( temp_win->type & 0x40 )) continue;
  174. if( (under_all_redrawed (temp_win)) && (!(temp_win->type & 0x80) )) {
  175. temp_win->draw ();
  176. temp_win->type |= 0x80;
  177. no_more=FALSE;
  178. continue;
  179. }
  180. }
  181.  }while (!no_more);
  182. for (temp_win=pfirst_win_of_all; temp_win !=NULL; temp_win=temp_win->pnext_win)
  183. temp_win ->type &= 0x3f;
  184.   return 0;
  185. }
  186. int win_class::restore_under_bitmap ()
  187. {
  188. if (( type & UNRESERVE_WIN  ) && (pfirst_under != NULL )){
  189. setport (win_living_viewport );
  190. FillRect(bounds,WHITE);
  191. restore ();
  192. return 1;
  193. }
  194. setport(win_living_viewport);
  195. if (punder_bitmap != NULL ){
  196. putimage (bounds.left,bounds.top
  197. ,punder_bitmap ,COPY_PUT);
  198. farfree (punder_bitmap );
  199. punder_bitmap=NULL;
  200. } else  FillRect (bounds, SCREEN_BACK_COLOR );
  201. return 0;
  202. }
  203. int  win_class::reserve_self_bitmap ()
  204. {
  205. if ( type & UNRESERVE_WIN  ) return 1;
  206. if (pself_bitmap !=NULL )
  207. farfree(pself_bitmap);
  208. pself_bitmap = myfarmalloc
  209. ( (unsigned long) RectSize (bounds) );
  210. setport (win_living_viewport);
  211. getimage ( bounds.left,bounds.top,
  212. bounds.right ,bounds.bottom ,
  213. pself_bitmap );
  214. return 0;
  215. }
  216. int  win_class::reserve_under_bitmap()
  217. {
  218. if ( type & UNRESERVE_WIN  ) return 1;
  219. if (punder_bitmap !=NULL )
  220. farfree(punder_bitmap);
  221. punder_bitmap = myfarmalloc
  222. ( (unsigned long) RectSize (bounds) );
  223. setport(win_living_viewport);
  224. getimage ( bounds.left,bounds.top,
  225. bounds.right ,bounds.bottom ,
  226. punder_bitmap );
  227. return 0;
  228. }
  229. int win_class::open_one_win  ()
  230. {   Twin  *temp1;
  231. unselect_current_selected_win();
  232. if ( pfirst_win_of_all == NULL ) pfirst_win_of_all =this;
  233. else {
  234. for(temp1=pfirst_win_of_all;temp1->pnext_win!= NULL;temp1 =temp1 ->pnext_win);
  235. temp1->pnext_win=this ;
  236. }
  237. build_all_links (  );
  238. if (pfirst_under !=NULL )
  239. reserve_under_bitmap();
  240. pcurrent_selected_win =this ;
  241. draw();
  242. thequeue.SendMessage(pcurrent_selected_win->ID
  243. ,WinOpenedMSG,pcurrent_selected_win );
  244. thequeue.SendMessage(ID,WinSelectedMSG,this);
  245. return 0;
  246. }
  247. /* note : after a close it's users duty to NULL the ptr   */
  248. int win_class::close_one_win  ()
  249. { Twin  *temp_win, *front_temp_win;
  250. // if (pwin_handled==NULL ) return 0;
  251. if ( pfirst_above  == NULL ) {
  252. setport (win_living_viewport);
  253. restore_under_bitmap (  );
  254. } else  // only for reserve space
  255. invisible_one_win ( );
  256. kill_all_links ( );
  257. for (temp_win=pfirst_win_of_all ; 
  258. (( temp_win != NULL ) && (temp_win !=this ));
  259. temp_win=temp_win ->pnext_win ) front_temp_win =temp_win;
  260. if (pfirst_win_of_all == this )
  261. pfirst_win_of_all =pnext_win;
  262. else if (temp_win == this )
  263. front_temp_win->pnext_win = pnext_win ;
  264.     this->pnext_win =NULL;
  265. if (punder_bitmap != NULL )
  266. farfree (punder_bitmap);
  267. if (pself_bitmap != NULL )
  268. farfree (pself_bitmap);
  269. //????????????????????????????????
  270. // farfree (pwin_handled );
  271. /* now select the next window   */
  272. if (pfirst_win_of_all !=NULL ) {
  273. for (temp_win=pfirst_win_of_all ; 
  274. ( temp_win->pnext_win!= NULL ) && (temp_win->pfirst_above !=NULL);
  275. temp_win=temp_win ->pnext_win ) ;
  276. if (temp_win->pfirst_above ==NULL ) {
  277. pcurrent_selected_win =temp_win;
  278. temp_win-> visible = VISIBLE;
  279. temp_win->draw_win_frame ();
  280. }
  281. } else pcurrent_selected_win =NULL;
  282. if ( pcurrent_selected_win !=NULL )
  283. thequeue.SendMessage(pcurrent_selected_win->ID,WinSelectedMSG,pcurrent_selected_win);
  284. return 0;
  285. }
  286. int win_class::build_all_links ()
  287. {
  288. Twin  *temp_win;
  289. struct pwin_list *temp_list, *temp_under_list ;
  290. struct Rect dstrect ;
  291. /* condition pwin_handled is front-most in the screen   */
  292. for (temp_win=pfirst_win_of_all ; temp_win != NULL;
  293. temp_win=temp_win ->pnext_win ){
  294. if (( SectRect ( bounds ,
  295. temp_win->bounds,&dstrect ) == TRUE_SECT) &&
  296. ( temp_win !=this ) ) {
  297. if (temp_win->pfirst_above == NULL ) {
  298. temp_win->pfirst_above =(struct pwin_list *) myfarmalloc ( sizeof(struct pwin_list));
  299. temp_win->pfirst_above->pthe_win =this;
  300. temp_win->pfirst_above->pnext_list=NULL ;
  301. } else {
  302. for ( temp_list= temp_win->pfirst_above;
  303. temp_list->pnext_list!= NULL;temp_list =temp_list->pnext_list);
  304. temp_list->pnext_list= (struct pwin_list *)myfarmalloc ( sizeof(struct pwin_list));
  305. temp_list->pnext_list->pthe_win =this;
  306. temp_list->pnext_list->pnext_list =NULL ;
  307. };
  308. /* above is to set up a win's above_link */
  309. if (pfirst_under==NULL ) {
  310. pfirst_under= (struct pwin_list *)myfarmalloc ( sizeof(struct pwin_list));
  311. pfirst_under->pthe_win=temp_win;
  312. pfirst_under->pnext_list=NULL;
  313. temp_under_list =pfirst_under;
  314. } else {
  315. temp_under_list->pnext_list = (struct pwin_list *)myfarmalloc ( sizeof(struct pwin_list));
  316. temp_under_list->pnext_list->pthe_win=temp_win;
  317. temp_under_list->pnext_list->pnext_list=NULL;
  318. temp_under_list =temp_under_list->pnext_list;
  319. }
  320. /* above is set up its own under win_list */
  321. }
  322. }
  323. return 0;
  324. }
  325. int win_class::kill_all_links ()
  326. {
  327. Twin  *temp_win;
  328. struct pwin_list *temp_list, *front_temp_list ;
  329. struct Rect dstrect ;
  330. for (temp_win=pfirst_win_of_all ; temp_win!=NULL;
  331. temp_win=temp_win ->pnext_win ){
  332. if ( (temp_win->pfirst_above != NULL) && (temp_win !=this)){
  333. for ( temp_list= temp_win->pfirst_above;
  334.  ((temp_list->pnext_list!= NULL)&& (temp_list->pthe_win!=this)) ;
  335. temp_list =temp_list->pnext_list) 
  336. front_temp_list =temp_list;
  337. if (temp_list->pthe_win==this){
  338. if (temp_list==temp_win->pfirst_above) temp_win->pfirst_above=temp_list->pnext_list;
  339. else front_temp_list->pnext_list =temp_list->pnext_list;
  340. farfree (temp_list );
  341. }
  342. };
  343. /* above is to kill a win's above_link */
  344. if ( (temp_win->pfirst_under != NULL) && (temp_win !=this)){
  345. for ( temp_list= temp_win->pfirst_under;
  346.  ((temp_list->pnext_list!= NULL)&& (temp_list->pthe_win!=this)) ;
  347. temp_list =temp_list->pnext_list)
  348. front_temp_list =temp_list;
  349. if (temp_list->pthe_win==this ) {
  350. if (temp_list==temp_win->pfirst_under) temp_win->pfirst_under=temp_list->pnext_list;
  351. else front_temp_list->pnext_list =temp_list->pnext_list;
  352. farfree (temp_list );
  353. }
  354. };
  355. /* above is to kill a win's under_link */
  356. }
  357. if (pfirst_above !=NULL)  {
  358. temp_list =pfirst_above;
  359. while ( temp_list != NULL ) {
  360. front_temp_list =temp_list->pnext_list;
  361. farfree ( temp_list );
  362. temp_list=front_temp_list;
  363. }
  364. }
  365. if (pfirst_under !=NULL)  {
  366. temp_list =pfirst_under;
  367. while ( temp_list != NULL ) {
  368. front_temp_list =temp_list->pnext_list;
  369. farfree ( temp_list );
  370. temp_list=front_temp_list;
  371. }
  372. }
  373. pfirst_above =NULL;
  374. pfirst_under =NULL;
  375. return 0;
  376. }
  377. void win_class::draw_win_frame ()
  378. { struct Rect title_rect;
  379. // if (pwin_handled->type == DIALOG_WIN ) return 0;
  380. setport(win_living_viewport);
  381. if (pcurrent_selected_win == this ) {
  382. draw_win_frame_rect_and_others( bounds,
  383. title,WIN_TITLEBAR_SELECTED_COLOR,
  384. WIN_TITLE_SELECTED_COLOR );
  385. } else {
  386. draw_win_frame_rect_and_others( bounds,
  387. title,WIN_TITLEBAR_UNSELECTED_COLOR,
  388. WIN_TITLE_UNSELECTED_COLOR );
  389. }
  390. }
  391. void win_class::draw_win_control ()
  392. { struct Rect bound_rect;
  393. Tcontrol *ptemp_control;
  394. int i;
  395. setport(viewport);
  396. // SetRect (&bound_rect,1,1,viewport.right-viewport.left-LINE_WIDTH-1,
  397. // viewport.bottom-viewport.top-bar_height-LINE_WIDTH-1);
  398. SetRect (&bound_rect,1,1,viewport.right-viewport.left-1,
  399. viewport.bottom-viewport.top-bar_height-1);
  400. FillRect (bound_rect,WHITE);
  401. win_group_control ->draw ();
  402. }
  403. int win_class::draw_win_contents ()
  404. {
  405. getviewsettings (&current_viewport );
  406. setport(viewport);
  407. return 0;
  408. setport (current_viewport );
  409. }
  410. win_class::win_class
  411. (int ID,char *title,byte type,byte hotkey,
  412.  int left,int top,int width,int height
  413. ) :object_class (ID,title,NORMAL, type ,left,top,width,height )
  414. { Twin /*  *ptemp_win, */ *temp1;
  415. canclose =TRUE;
  416. // this->title =title;
  417. this->hotkey =hotkey;
  418. this->visible =VISIBLE ;
  419. // insert_control later !! OK !!
  420. this->punder_bitmap =NULL;
  421. this->pself_bitmap  =NULL;
  422. this->viewport.clip =CLIP_ON  ;
  423. this->win_group_control =new Tgroup(0,"",viewport.left,viewport.top,
  424. viewport.right-viewport.left,viewport.bottom-viewport.top);
  425. //======================================================================
  426. this->pnext_win=NULL;
  427. this->pfirst_above =NULL;
  428. this->pfirst_under =NULL;
  429. this->pother_info   = NULL  ;
  430. /*  now draw win frames & build needed links */
  431. // open_one_win (this ); used in the call func
  432. setup_window();
  433. }
  434. win_class::~win_class ()
  435. {
  436. delete (win_group_control);
  437. close_one_win ();
  438. if (pcurrent_selected_win!=NULL ) setport (pcurrent_selected_win->viewport);
  439. thequeue.SendMessage(ID,WinSysClosedMSG,this);
  440. }
  441. void win_class::draw_size_rect()
  442. {
  443. // disable();
  444. getviewsettings (&current_viewport );
  445. setwritemode (XOR_PUT);
  446. setcolor (GREEN);
  447. setport (win_living_viewport);
  448. setlinestyle ( DASHED_LINE,1,THICK_WIDTH );
  449. FrameRect(newbounds);
  450. /*
  451. #ifdef rectangle //(left,top,right,bottom)
  452. #undef rectangle
  453. // FrameRect(newbounds);
  454. mouse_off;
  455. disable();
  456. rectangle(newbounds.left,newbounds.top,newbounds.right,newbounds.bottom);
  457. mouse_on;
  458. #define rectangle(left,top,right,bottom)  mouse_off;rectangle((left),(top),(right),(bottom));mouse_on
  459. #endif
  460. disable();
  461. */ setlinestyle ( SOLID_LINE,1,NORM_WIDTH );
  462. setwritemode (COPY_PUT);
  463. setport (current_viewport );
  464. // enable();
  465. }
  466. int win_class::move_size_window (int key_scan_num )
  467. {
  468. draw_size_rect();
  469. switch (key_scan_num ) {
  470. // move
  471. case LEFTKEY :
  472. if (newbounds.left > 0) {newbounds.left--;newbounds.right--;}
  473. break;
  474. case RIGHTKEY :
  475. if (newbounds.right< win_living_viewport.right-win_living_viewport.left){newbounds.left++;newbounds.right++;}
  476. break;
  477. case UPKEY :
  478. if (newbounds.top  > 0) {newbounds.top--;newbounds.bottom--;}
  479. break;
  480. case DOWNKEY :
  481. if (newbounds.bottom  < win_living_viewport.bottom-win_living_viewport.top) {newbounds.top++;newbounds.bottom++;}
  482. break;
  483. // size
  484. case SHIFT_LEFT :
  485. if (newbounds.right>newbounds.left +100) {newbounds.right--;}//min_width
  486. break;
  487. case SHIFT_RIGHT:
  488. if (newbounds.right< win_living_viewport.right-win_living_viewport.left){newbounds.right++;}
  489. break;
  490. case SHIFT_UP :
  491. if (newbounds.bottom>newbounds.top +100) {newbounds.bottom--;}
  492. break;
  493. case SHIFT_DOWN :
  494. if (newbounds.bottom  < win_living_viewport.bottom-win_living_viewport.top) {newbounds.bottom++;}
  495. break;
  496. // move
  497. case HOMEKEY :
  498. if (newbounds.left > 10) {newbounds.left -=10;newbounds.right-=10;}
  499. if (newbounds.top  > 10) {newbounds.top-=10;newbounds.bottom-=10;}
  500. break;
  501. case PGUPKEY :
  502. if (newbounds.right< win_living_viewport.right-win_living_viewport.left-10){newbounds.left+=10;newbounds.right+=10;}
  503. if (newbounds.top  > 10) {newbounds.top-=10;newbounds.bottom-=10;}
  504. break;
  505. case ENDKEY :
  506. if (newbounds.left > 10) {newbounds.left -=10;newbounds.right-=10;}
  507. if (newbounds.bottom  < win_living_viewport.bottom-win_living_viewport.top-10) {newbounds.top+=10;newbounds.bottom+=10;}
  508. break;
  509. case PGDNKEY :
  510. if (newbounds.right< win_living_viewport.right-win_living_viewport.left-10){newbounds.left+=10;newbounds.right+=10;}
  511. if (newbounds.bottom  < win_living_viewport.bottom-win_living_viewport.top-10) {newbounds.top+=10;newbounds.bottom+=10;}
  512. break;
  513. // size
  514. case SHIFT_HOME :
  515. if (newbounds.right>newbounds.left +100 +10) {newbounds.right-=10;}//min_width
  516. if (newbounds.bottom>newbounds.top +100 +10) {newbounds.bottom-=10;}
  517. break;
  518. case SHIFT_PGUP:
  519. if (newbounds.right< win_living_viewport.right-win_living_viewport.left-10){newbounds.right+=10;}
  520. if (newbounds.bottom>newbounds.top +100 +10) {newbounds.bottom-=10;}
  521. break;
  522. case SHIFT_END:
  523. if (newbounds.right>newbounds.left +100 +10) {newbounds.right-=10;}//min_width
  524. if (newbounds.bottom  < win_living_viewport.bottom-win_living_viewport.top-10) {newbounds.bottom+=10;}
  525. break;
  526. case SHIFT_PGDN:
  527. if (newbounds.right< win_living_viewport.right-win_living_viewport.left-10){newbounds.right+=10;}
  528. if (newbounds.bottom  < win_living_viewport.bottom-win_living_viewport.top-10) {newbounds.bottom+=10;}
  529. break;
  530. case ENTERKEY:
  531. thequeue.SendMessage(pcurrent_selected_win->ID
  532. ,WinMovedSizedMSG,pcurrent_selected_win );
  533. draw_size_rect();
  534. in_win_moving =FALSE;
  535. return TRUE;
  536. case ESCKEY:
  537. in_win_moving =FALSE;
  538. getviewsettings (&current_viewport );
  539. setport (menu_viewport);
  540. FillRect ( on_line_help_rect,HELP_RECT_COLOR );
  541. setcolor (HELP_TEXT_COLOR);
  542. outtextxy( on_line_help_rect.left+10,on_line_help_rect.top,pcurrent_menu->help);
  543. setport (current_viewport );
  544. return TRUE;
  545. };
  546. draw_size_rect();
  547. return TRUE;
  548. }
  549. Twin* win_class::pnext=NULL;
  550. int win_class::key_pressed_handler  ( int key_scan_num )
  551. {   Twin  *ptemp_win;
  552.   // pnext  !  // used as CTRL_F6's link procedure
  553. if (pfirst_win_of_all == NULL ) return FALSE;
  554. if (pcurrent_selected_win->visible == IN_VISIBLE ) return FALSE;
  555. if (in_win_moving) {
  556. move_size_window(key_scan_num);
  557. return TRUE;
  558. }
  559. if (!(pcurrent_selected_win->type & DIALOG_WIN )) //not dialog
  560. switch (key_scan_num ) {
  561. case CTRL_F4 :
  562. thequeue.SendMessage(pcurrent_selected_win->ID
  563. ,WinSysCloseMSG,pcurrent_selected_win );
  564. pnext=NULL;
  565. return TRUE;
  566. case CTRL_F6 :
  567. if (pnext==NULL ) pnext =pfirst_win_of_all;
  568. if ( (pnext != NULL)&& (pnext !=pcurrent_selected_win)){
  569.  pnext->select ();
  570.  pnext =pnext->pnext_win;
  571.  return TRUE;
  572. }
  573. return FALSE;
  574. case CTRL_F5 :
  575. newbounds=bounds;
  576. in_win_moving =TRUE;
  577. getviewsettings (&current_viewport );
  578. setport (menu_viewport);
  579. FillRect ( on_line_help_rect,HELP_RECT_COLOR );
  580. setcolor (HELP_TEXT_COLOR);
  581. outtextxy( on_line_help_rect.left+10,on_line_help_rect.top,"MOVING WIN");
  582. setport (current_viewport );
  583. draw_size_rect();
  584. old_mouse_x=mouse_x;
  585. old_mouse_y=mouse_y;
  586. return TRUE;
  587. };
  588. if (pcurrent_selected_win->win_group_control != NULL)
  589. return pcurrent_selected_win->win_group_control->key_pressed_handler
  590. (key_scan_num );
  591. else return FALSE;
  592. }
  593. int win_class::msg_handler ( MSG& message )
  594. {   int x,y;
  595. int ret_val;
  596. switch (message.Action){
  597. case KeyPressedMSG:
  598. return key_pressed_handler( key_code );
  599. case WinOpenedMSG:
  600. return TRUE;
  601. case WinSelectedMSG:
  602. // if ((win_sysmenu != NULL ) && (  ((Twin*)message.fptr)->visible !=INVISIBLE ) ) {
  603. if ((win_sysmenu != NULL ) && (  ((Twin*)message.fptr)->visible !=2         ) ) {
  604. // x=((Twin*)message.fptr)->bounds.left+win_living_viewport.left-menu_viewport.left+LINE_WIDTH;
  605. // y=((Twin*)message.fptr)->bounds.top+win_living_viewport.top -menu_viewport.top+LINE_WIDTH;
  606. x=((Twin*)message.fptr)->bounds.left+win_living_viewport.left-menu_viewport.left+LINE_WIDTH-win_sysmenu->bounds.left+1;
  607. y=((Twin*)message.fptr)->bounds.top+win_living_viewport.top -menu_viewport.top+LINE_WIDTH-win_sysmenu->bounds.top+1;
  608. win_sysmenu->offsetmenu(x,y);
  609. win_sysmenu->status =NORMAL;
  610. }
  611. return TRUE;
  612. /* case WinMovingSizingMSG: //for speed
  613. pcurrent_selected_win-> draw_size_rect();
  614. OffsetRect (&pcurrent_selected_win->newbounds,
  615.  mouse_x-old_mouse_x,mouse_y-old_mouse_y );
  616. if (pcurrent_selected_win->newbounds.right>
  617. win_living_viewport.right-win_living_viewport.left-1)
  618. pcurrent_selected_win->newbounds.right
  619. =win_living_viewport.right-win_living_viewport.left-1;
  620. if (pcurrent_selected_win->newbounds.bottom>
  621. win_living_viewport.bottom-win_living_viewport.top-1)
  622. pcurrent_selected_win->newbounds.bottom
  623. =win_living_viewport.bottom-win_living_viewport.top-1;
  624. if (pcurrent_selected_win->newbounds.left<1)
  625. pcurrent_selected_win->newbounds.left=1;
  626. if (pcurrent_selected_win->newbounds.top<1)
  627. pcurrent_selected_win->newbounds.top=1;
  628. old_mouse_x=mouse_x;
  629. old_mouse_y=mouse_y;
  630. pcurrent_selected_win-> draw_size_rect();
  631. return TRUE;
  632. */
  633. case WinMovedSizedMSG:
  634.                 in_win_moving =FALSE;
  635. pcurrent_selected_win-> draw_size_rect();
  636. getviewsettings (&current_viewport );
  637. setport (menu_viewport);
  638. FillRect ( on_line_help_rect,HELP_RECT_COLOR );
  639. setcolor (HELP_TEXT_COLOR);
  640. outtextxy( on_line_help_rect.left+10,on_line_help_rect.top,pcurrent_menu->help);
  641. setport (current_viewport );
  642. case WinRedrawboundsMSG:
  643. ((Twin*)message.fptr)->close_one_win();
  644. bounds=newbounds;
  645. ((Twin*)message.fptr)->setup_window();
  646. ((Twin*)message.fptr)->open_one_win ();
  647. printf ("07");
  648. return TRUE;
  649. /* case WinSysCloseMSG:
  650. if (! (canclose|| ( func_canclose()) ))  return FALSE;
  651. x=((Twin*)message.fptr)->bounds.left+win_living_viewport.left-menu_viewport.left+LINE_WIDTH;
  652. y=((Twin*)message.fptr)->bounds.top+win_living_viewport.top -menu_viewport.top+LINE_WIDTH;
  653. win_sysmenu->offsetmenu(-x,-y);
  654. win_sysmenu->menu_status |=INVISIBLE;
  655. delete ((Twin*)message.fptr );
  656. return TRUE ;
  657. */// case ControlSelectedMSG: --->ListBoxControlSelectedMSG
  658. // return TRUE;     //NOW IT IN APPLICATION
  659. case MouseLButtonDownMSG:
  660. //  int win_mouse_x,win_mouse_y;
  661. sysmouse->get_posn();
  662. win_mouse_x=mouse_x; win_mouse_y=mouse_y;
  663. if (!Global2LocalPort(win_mouse_x,win_mouse_y,win_living_viewport)) return FALSE;
  664. if (!(pcurrent_selected_win->type & DIALOG_WIN )) { //not dialog
  665. if (!Global2Local(win_mouse_x,win_mouse_y,bounds)) {
  666. // see if in other windows's bounds;
  667. if (pfirst_win_of_all == NULL) return FALSE;
  668.   Twin *ptmp;
  669. ptmp =pfirst_win_of_all;
  670. while ((ptmp!=NULL) && !(PtInRect(win_mouse_x,win_mouse_y,ptmp->bounds)) ) ptmp=ptmp->pnext_win;
  671. if (ptmp==NULL) return FALSE;
  672. ptmp->select();
  673. return TRUE;
  674. } else {  // in title_box;
  675. if((PtInRect(win_mouse_x,win_mouse_y,title_box)) ||
  676.    (PtInRect(win_mouse_x,win_mouse_y,size_box))
  677.   ) {
  678. //MOVE win//MOVE win//MOVE win//MOVE win//MOVE win//MOVE win//MOVE win//MOVE win
  679. newbounds=bounds;
  680. if (PtInRect(win_mouse_x,win_mouse_y,size_box))
  681. in_win_moving =SIZING;
  682. else in_win_moving =TRUE;
  683. getviewsettings (&current_viewport );
  684. setport (menu_viewport);
  685. FillRect ( on_line_help_rect,HELP_RECT_COLOR );
  686. setcolor (HELP_TEXT_COLOR);
  687. outtextxy( on_line_help_rect.left+10,on_line_help_rect.top,"MOVING WIN");
  688. setport (current_viewport );
  689. draw_size_rect();
  690. sysmouse->get_release_count(LEFT_BUTTON);
  691. old_mouse_x=mouse_x;
  692. old_mouse_y=mouse_y;
  693. return TRUE;
  694. //MOVE win//MOVE win//MOVE win//MOVE win//MOVE win//MOVE win//MOVE win//MOVE win
  695. return TRUE;
  696. } else
  697. if (PtInRect(win_mouse_x,win_mouse_y,close_box)) {
  698. thequeue.SendMessage(pcurrent_selected_win->ID
  699. ,WinSysCloseMSG,pcurrent_selected_win );
  700. pnext=NULL;
  701. return TRUE;
  702. } else
  703. if (PtInRect(win_mouse_x,win_mouse_y,zoom_out_box)) {
  704. SetRect (&newbounds,
  705. 10,10,
  706. win_living_viewport.right-win_living_viewport.left-10,
  707. win_living_viewport.bottom-win_living_viewport.top-10);
  708. thequeue.SendMessage(this->ID
  709. ,WinRedrawboundsMSG, this );
  710. oldbounds=bounds;
  711. return TRUE;
  712. } else
  713. if (PtInRect(win_mouse_x,win_mouse_y,zoom_in_box)) {
  714. newbounds=oldbounds;
  715. thequeue.SendMessage(this->ID
  716. ,WinRedrawboundsMSG, this );
  717. return TRUE;
  718. }
  719. } //in this && other bounds
  720. } else { //is a dialog
  721. win_mouse_x=mouse_x; win_mouse_y=mouse_y;
  722. if (!Global2LocalPort(win_mouse_x,win_mouse_y,viewport)) {
  723. putch('07');
  724. return FALSE;
  725. } else break;
  726. }
  727. return FALSE; // unreachable
  728. // default:; //; // return FALSE;
  729. }
  730. if (win_group_control != NULL)   //Always true
  731. return win_group_control ->msg_handler(message);
  732. }
  733. BOOL win_class::func_canclose ()
  734. {
  735. return TRUE;
  736. }
  737. void win_class::insert_control (Tcontrol *pcontrol_handled)
  738. {
  739. win_group_control ->insert_control (pcontrol_handled);
  740. }
  741. void win_class::setup_window ()
  742. {
  743. if (bounds.right>win_living_viewport.right-win_living_viewport.left-2)
  744.  bounds.right=win_living_viewport.right-win_living_viewport.left-2;
  745. if (bounds.bottom>win_living_viewport.bottom-win_living_viewport.top-2)
  746.  bounds.bottom=win_living_viewport.bottom-win_living_viewport.top-2;
  747. if (bounds.left<2)bounds.left=2;
  748. if (bounds.top<2) bounds.top=2;
  749. if (bounds.right <=bounds.left ) bounds.right =bounds.left +1;
  750. if (bounds.bottom<=bounds.top  ) bounds.right =bounds.top +1;
  751. viewport.left  =bounds.left+win_living_viewport.left+LINE_WIDTH;
  752. viewport.top  =bounds.top +win_living_viewport.top +bar_height+LINE_WIDTH;
  753. viewport.right  =bounds.right-bounds.left+viewport.left-2*LINE_WIDTH;
  754. viewport.bottom =bounds.bottom-bounds.top+viewport.top-2*LINE_WIDTH;
  755. SetRect (&title_box,LINE_WIDTH+bar_height,LINE_WIDTH,
  756. bounds.right-bounds.left-2*LINE_WIDTH-2*bar_height,LINE_WIDTH+bar_height);
  757. SetRect (&close_box,LINE_WIDTH,LINE_WIDTH,
  758. LINE_WIDTH+bar_height,LINE_WIDTH+bar_height);
  759. //zoom_out_box;
  760. SetRect (&zoom_out_box,bounds.right-bounds.left-2*LINE_WIDTH-2*bar_height,
  761. LINE_WIDTH,
  762. bounds.right-bounds.left- 2*LINE_WIDTH- bar_height,
  763. LINE_WIDTH+bar_height);
  764. //zoom_in_box
  765. SetRect (&zoom_in_box,bounds.right-bounds.left-2*LINE_WIDTH-bar_height,
  766. LINE_WIDTH,
  767. bounds.right-bounds.left- 2*LINE_WIDTH,
  768. LINE_WIDTH+bar_height);
  769. SetRect (&size_box,bounds.right-bounds.left-2*LINE_WIDTH,
  770. bounds.bottom-bounds.top-2*LINE_WIDTH,
  771. bounds.right-bounds.left ,
  772. bounds.bottom-bounds.top );
  773. if (pcurrent_selected_win !=NULL)
  774. SetRect (&oldbounds,
  775. pcurrent_selected_win->bounds.left+20,
  776. pcurrent_selected_win->bounds.top +20,
  777. pcurrent_selected_win->bounds.left+310,
  778. pcurrent_selected_win->bounds.top +200);
  779. else SetRect (&oldbounds,20,20,310,210);
  780. };