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

界面编程

开发平台:

DOS

  1. // 1993 (c) ALL RIGHTS RESERVED
  2. // AUTHOR  BY XuYongYong
  3. /*  scroll.cpp
  4. */
  5. #include "scroll.h"
  6. #include "applicat.h"
  7. /**************************************************************************/
  8. scroll_class::scroll_class
  9. (int ID,char *title_hotkey,  int left,int top,int width,int height,
  10.  int min_value,int max_value,int current_value )
  11.  :control_class
  12. (ID,title_hotkey,NORMAL ,SCROLL,left,top,width,height,
  13. min_value,max_value,current_value  )
  14. {
  15. title_pos_x =left ;
  16. title_pos_y =top -bar_height-1 ;
  17. is_hscroll = ((width >height) ? TRUE:FALSE );
  18. if (is_hscroll) bar_x =min(height-1,bar_height);
  19. else bar_x=width-1;
  20. if (is_hscroll) bar_y =height-1;
  21. else bar_y=min(width-1,bar_height);
  22. SetRect (&begin_box,left,top,left+bar_x,top+bar_y);
  23. end_box =begin_box;
  24. if (is_hscroll) OffsetRect (&end_box,width-bar_x,0);
  25. else OffsetRect (&end_box,0,height-bar_y);
  26. begin_end_box =bounds;
  27. if (is_hscroll) InsetRect (&begin_end_box,-bar_x,0);
  28. else InsetRect (&begin_end_box,0,-bar_y);
  29. thumb_box =begin_end_box;
  30. if (is_hscroll) thumb_box.right=thumb_box.left+bar_x;
  31. else  thumb_box.bottom=thumb_box.top+bar_y;
  32. begin_thumb_box =begin_end_box;
  33. thumb_end_box =begin_end_box;
  34. }
  35. /**************************************************************************/
  36. void scroll_class::draw ( )
  37. {
  38. if ( status & INVISIBLE) return;    // INVISIBLE
  39. FillRect (bounds, LIGHTGRAY);
  40. setcolor (BLACK);
  41. control_class::draw();
  42. draw_out_button (begin_box);
  43. draw_out_button (end_box  );
  44. if (is_hscroll) {
  45. draw_arrow (begin_box.left,begin_box.top,begin_box.right-LINE_WIDTH,
  46. begin_box.bottom,LEFT,BLACK);
  47. draw_arrow (end_box.left,end_box.top,end_box.right-LINE_WIDTH,
  48. end_box.bottom,RIGHT,BLACK);
  49. }  else {
  50. draw_arrow (begin_box.left,begin_box.top,begin_box.right-LINE_WIDTH,
  51. begin_box.bottom,UP,BLACK);
  52. draw_arrow (end_box.left,end_box.top,end_box.right-LINE_WIDTH,
  53. end_box.bottom,DOWN,BLACK);
  54. }
  55. }
  56. /**************************************************************************/
  57. void scroll_class::select( )
  58. { Trect tmprect =thumb_box;
  59. InsetRect (&tmprect,-2,-2);
  60. tmprect.right -=3; tmprect.bottom-=3;
  61. FillRect (tmprect, DARKGRAY);
  62. }
  63. void scroll_class::unselect( )
  64. { Trect tmprect =thumb_box;
  65. InsetRect (&tmprect,-2,-2);
  66. tmprect.right -=3; tmprect.bottom-=3;
  67. FillRect (tmprect, LIGHTGRAY);
  68. }
  69. /**************************************************************************/
  70. void scroll_class::get_thumb_boxes (int thumb_value)
  71. { int i,j;
  72. if (is_hscroll) {
  73. i=(begin_end_box.right-begin_end_box.left-bar_x)
  74.  * thumb_value / (max_value-min_value);
  75. j=thumb_box.left-begin_end_box.left;
  76. OffsetRect(&thumb_box,i-j,0);
  77. begin_thumb_box.right =begin_thumb_box.left+i;
  78. thumb_end_box.left =i+bar_x;
  79. }   //HSCROLL
  80. else { //bar ==width -2
  81. i=(begin_end_box.bottom-begin_end_box.top-bar_y)
  82.  * thumb_value / (max_value-min_value);
  83. j=thumb_box.top-begin_end_box.top;
  84. OffsetRect(&thumb_box,0,i-j);
  85. begin_thumb_box.bottom =begin_thumb_box.top+i;
  86. thumb_end_box.top =i+bar_y;
  87. } //VSCROLL
  88. }
  89. /**************************************************************************/
  90. int scroll_class::control_change_value  (int new_value )
  91. {   if (control_class::control_change_value(new_value)==TRUE)
  92. return TRUE;
  93. FillRect (thumb_box,LIGHTGRAY);
  94. get_thumb_boxes (new_value);
  95. draw_out_button (thumb_box);
  96. setcolor(BLACK);
  97. FrameRect (bounds);
  98. current_value =new_value;
  99. thequeue.SendMessage(ID,ScrollValueChangedMSG,this);
  100. return TRUE;
  101. }
  102. /**************************************************************************/
  103. int scroll_class::key_pressed_handler (int key_scan_num )
  104. { int i;
  105. switch (key_scan_num ) {
  106. case  UPKEY:
  107. case    LEFTKEY  :
  108. control_change_value (current_value -1 );
  109. return TRUE;
  110. case  DOWNKEY:
  111. case    RIGHTKEY  :
  112. control_change_value (current_value +1 );
  113. return TRUE;
  114. case  HOMEKEY:
  115. control_change_value (min_value);
  116. return TRUE;
  117. case  ENDKEY:
  118. control_change_value (max_value);
  119. return TRUE;
  120. case PGDNKEY:
  121. i=current_value + ((max_value-min_value)/10+1) ;
  122. i=(i>max_value)? max_value:i;
  123. control_change_value (i);
  124. return TRUE;
  125. case  PGUPKEY:
  126. i=current_value - ((max_value-min_value)/10+1) ;
  127. i=(i<min_value)? min_value:i;
  128. control_change_value (i);
  129. return TRUE;
  130. }
  131. return control_class::key_pressed_handler (key_scan_num);
  132. }
  133. /**************************************************************************/
  134. int scroll_class::msg_handler (MSG& message )
  135. { static int flag;
  136.   int i;
  137. switch (message.Action){
  138. case TimerMSG:
  139. if (in_menu_trap) break;
  140. flag =!flag;
  141. if ( status & INVISIBLE) return TRUE;    // INVISIBLE
  142. if (flag) unselect();
  143. else select();
  144. break;
  145. case MouseLButtonDownMSG:
  146. if (PtInRect (win_mouse_x,win_mouse_y,begin_box)) {
  147. control_change_value (current_value -1 );
  148. }else
  149. if (PtInRect (win_mouse_x,win_mouse_y,end_box)) {
  150. control_change_value (current_value +1 );
  151. }else
  152. if (PtInRect (win_mouse_x,win_mouse_y,begin_thumb_box)) {
  153. i=current_value - ((max_value-min_value)/10+1) ;
  154. i=(i<min_value)? min_value:i;
  155. control_change_value (i);
  156. }else
  157. if (PtInRect (win_mouse_x,win_mouse_y,thumb_end_box)) {
  158. i=current_value + ((max_value-min_value)/10+1) ;
  159. i=(i>max_value)? max_value:i;
  160. control_change_value (i);
  161. }else break;
  162. return TRUE;
  163. }
  164. return control_class::msg_handler(message);
  165. }