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

界面编程

开发平台:

DOS

  1. // 1993 (c) ALL RIGHTS RESERVED
  2. // AUTHOR:  XuYongYong
  3. /*  listbox.cpp
  4. */
  5. #include "listbox.h"
  6. /**************************************************************************/
  7. listbox_class::listbox_class(int ID,char *title_hotkey,
  8. int left,int top,int width,int height,
  9. int therow ,int thecolumn, int string_num, char ** thestring_list)
  10. : control_class(ID,title_hotkey,NORMAL ,LISTBOX,
  11. left,top,width,height,0, string_num-1, -1 )
  12. //current_value=-1::because no more blue at first
  13. {
  14. title_pos_x =left ;
  15. title_pos_y =top -bar_height;
  16. // max_value =string_num +1 ;
  17. row=therow;
  18. column=thecolumn;
  19. if ((row== -1)||(column==-1) ) {
  20. column=1;
  21. row =( height -2) / bar_height;
  22. }
  23. string_list =thestring_list;
  24. box.left  =left+1;
  25. box.top   =top +1;
  26. box_width =( width - 2  ) /column;
  27. box_height=( height- 2  ) / row ;
  28. box.right =box.left+box_width ;
  29. box.bottom=box.top +box_height;
  30. setup_control();
  31. }
  32. void listbox_class::setup_control()  //used for every update controls
  33. // max_value changed  // setup inner variables
  34. {
  35. itemnum =max_value+1;
  36. begin_show =0;
  37. }
  38. /**************************************************************************/
  39. void listbox_class::draw ( )
  40. {
  41.    if ( status & INVISIBLE) return;    // INVISIBLE
  42. control_class::draw();
  43.   int k;
  44.   Trect tmprect;
  45. FillRect (bounds,WHITE);
  46. setcolor (BLACK);
  47. FrameRect (bounds);
  48. setcolor (BLACK);
  49. for (k=begin_show;(k<begin_show+column*row)&&(k<itemnum) ;k++) {
  50. tmprect =get_string_rect (k);
  51. outtextxy (tmprect.left+2, tmprect.top +2, string_list[k] );
  52. }
  53. }
  54. /**************************************************************************/
  55. Trect listbox_class::get_string_rect(int k)
  56. { Trect tmprect =box;
  57.   int  i,j;
  58. k=k-begin_show;
  59. j =k % row;
  60. i =k / row;
  61. InsetRect (&tmprect,-2,-2);
  62. OffsetRect (&tmprect,i* box_width , j* box_height);
  63. return tmprect;
  64. }
  65. /**************************************************************************/
  66. void listbox_class::select ( )
  67. { Rect tmprect;
  68. if ((current_value<min_value )||(current_value>max_value)) return ;
  69. tmprect =get_string_rect (current_value);
  70. FillRect (tmprect,BLUE );
  71. setcolor (WHITE);
  72. outtextxy (tmprect.left+2, tmprect.top +2, string_list[current_value]);
  73. setcolor (WHITE);
  74. setlinestyle( DOTTED_LINE,1,NORM_WIDTH );
  75. FrameRect (get_string_rect(current_value));
  76. setlinestyle( SOLID_LINE,1,NORM_WIDTH );
  77. }
  78. /**************************************************************************/
  79. void listbox_class::unselect ( )
  80. { Rect tmprect;
  81. if ((current_value<min_value )||(current_value>max_value)) return ;
  82. tmprect =get_string_rect (current_value);
  83. FillRect (tmprect,WHITE );
  84. setcolor (BLACK);
  85. outtextxy (tmprect.left+2, tmprect.top +2, string_list[current_value]);
  86. setcolor (WHITE);
  87. setlinestyle( DOTTED_LINE,1,NORM_WIDTH );
  88. FrameRect (get_string_rect(current_value));
  89. setlinestyle( SOLID_LINE,1,NORM_WIDTH );
  90. }
  91. /**************************************************************************/
  92. int listbox_class::control_change_value (int new_value  )
  93. {   if (control_class::control_change_value(new_value)==TRUE)
  94. return TRUE;
  95.   Trect tmprect;
  96. if (new_value < begin_show) {
  97. begin_show =new_value;
  98. draw();
  99. } else if ( (new_value >=begin_show+column*row) ) {
  100. begin_show= new_value -column*row+1;
  101. draw();
  102. }  else {
  103. if (!( status & INVISIBLE))  unselect ();
  104. }
  105. current_value =new_value;
  106. if (!( status & INVISIBLE)) select();
  107. thequeue.SendMessage(ID,ListBoxValueChangedMSG,this);
  108. return TRUE;
  109. }
  110. /**************************************************************************/
  111. int listbox_class::key_pressed_handler
  112. (int key_scan_num )
  113. { int new_value;
  114. switch (key_scan_num ) {
  115. case LEFTKEY:
  116. new_value =current_value -row;
  117. if (new_value<0 ) new_value =0;
  118. break;
  119. case RIGHTKEY:
  120. new_value =current_value +row;
  121. if (new_value>= max_value ) new_value =max_value;
  122. break;
  123. case UPKEY:
  124. new_value =current_value -1;
  125. if (new_value<0 )  new_value = 0;
  126. break;
  127. case DOWNKEY:
  128. new_value =current_value +1;
  129. if (new_value>= max_value) new_value =max_value;
  130. break;
  131. case HOMEKEY:
  132. new_value =0;
  133. break;
  134. case ENDKEY:
  135. new_value =max_value;
  136. break;
  137. case PGUPKEY:
  138. new_value =current_value -row;
  139. if (new_value<0 )  new_value = 0;
  140. break;
  141. case PGDNKEY:
  142. new_value =current_value +row;
  143. if (new_value>= max_value) new_value =max_value;
  144. break;
  145. case SPACEKEY:
  146. thequeue.SendMessage(ID,
  147. ListBoxItemSelectedMSG,this);
  148. return TRUE;
  149. // break;
  150. // default : return FALSE; //this is another way to do below
  151. default : return control_class::key_pressed_handler (key_scan_num) ;
  152. }
  153. // return control_change_value(new_value );
  154. control_change_value(new_value );
  155. return TRUE;
  156. }
  157. int listbox_class::msg_handler (MSG& message )
  158. { int x,y ,k;
  159. switch (message.Action){
  160. case MouseLButtonDownMSG:
  161. x=win_mouse_x - bounds.left;
  162. y=win_mouse_y - bounds.top;
  163. x=x / box_width ;
  164. y=y / box_height;
  165. k=begin_show  + x*row + y;
  166. if (k==current_value) {
  167. thequeue.SendMessage(ID,
  168. ListBoxItemSelectedMSG,this);
  169. return TRUE;
  170. }
  171. if ( k <= max_value ) {
  172. control_change_value( k );
  173. return TRUE;
  174. }
  175. }
  176. return control_class::msg_handler(message);
  177. }