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

界面编程

开发平台:

DOS

  1. // 1993 (c) ALL RIGHTS RESERVED
  2. // AUTHOR: XuYongYong
  3. /*  yyxtedit.cpp
  4. */
  5. #include "tedit.h"
  6. #include "applicat.h"
  7. /**************************************************************************/
  8. tedit_class::tedit_class(int ID,char *title_hotkey,
  9. int left,int top,int width,int height,char *default_text,
  10. int max_len)
  11. :  control_class(ID,title_hotkey,NORMAL ,TEDIT,
  12. left,top,width,height,0,0,0 )
  13. {
  14. title_pos_x =left ;
  15. title_pos_y =top -bar_height-1 ;
  16. text_pos_x  =left+3*LINE_WIDTH;
  17. text_pos_y  =top +( height-textheight("j") )/2-2;
  18. strcpy (text,default_text);
  19. max_text_len =max(max_len,strlen (text) +1);
  20. max_text_show_len  = (width -2*LINE_WIDTH ) / textwidth ("M");
  21. setup_control();
  22. }
  23. void tedit_class::setup_control()
  24. {
  25. max_text_len =max(max_text_len,strlen (text) );
  26. cursor_pos =strlen (text)-1;
  27.   int i;
  28. i = (max_text_show_len <strlen (text)) ?max_text_show_len: strlen(text) ;
  29. text_begin_show =cursor_pos -i+1;
  30. strncpy (text_show ,text+text_begin_show,i+1);
  31. is_first_press=TRUE;
  32. cursor_pos_x= textwidth(text_show)-2;
  33. }
  34. /**************************************************************************/
  35. void tedit_class::draw ()
  36. {
  37. if ( status & INVISIBLE) return;    // INVISIBLE
  38. FillRect (bounds,WHITE);
  39. setcolor (BLACK);
  40. FrameRect ( bounds );
  41. outtextxy (text_pos_x,text_pos_y, text_show );
  42. control_class::draw ();
  43. }
  44. /**************************************************************************/
  45. void tedit_class::select ()
  46. {
  47. setfillstyle (SOLID_FILL, BLUE);
  48. bar (text_pos_x,text_pos_y+1,text_pos_x + textwidth (text_show),
  49. text_pos_y + textheight (text_show) + 4 );
  50. setcolor (WHITE);
  51. outtextxy (text_pos_x,text_pos_y, text_show );
  52. is_first_press =TRUE;
  53. }
  54. /**************************************************************************/
  55. void tedit_class::unselect ()
  56. {
  57. setfillstyle (SOLID_FILL, WHITE);
  58. bar (text_pos_x,text_pos_y+1,text_pos_x + textwidth (text_show),
  59. text_pos_y+textheight (text_show) + 4 );
  60. setcolor (BLACK);
  61. outtextxy (text_pos_x,text_pos_y,text_show );
  62. is_first_press =FALSE;
  63. thequeue.SendMessage(ID,EditInputedMSG,this);
  64. }
  65. /**************************************************************************/
  66. int tedit_class::adjust_cursor(int new_cursor_pos)
  67. { int ret_val=FALSE;
  68.   int i;
  69. for (i=0;i<=max_text_show_len;i++) text_show[i]=0;
  70. strncpy (text_show , text+text_begin_show, max_text_show_len);
  71. setcolor (WHITE);
  72.     draw_cursor();
  73. if ( ( (new_cursor_pos+1) < 0)  ||(  (new_cursor_pos+1)>=strlen(text)+1 ) ) return FALSE; // unchanged
  74. if (cursor_pos==new_cursor_pos) return FALSE;
  75. cursor_pos= new_cursor_pos;
  76. if (( cursor_pos < text_begin_show )&&(cursor_pos !=-1)) {
  77. text_begin_show=cursor_pos;
  78. for (i=0;i<max_text_show_len;i++) text_show[i]=0;
  79. strncpy (text_show , text+text_begin_show, max_text_show_len);
  80. ret_val=TRUE;       //drawed
  81. } else if ( (cursor_pos+1) >= (text_begin_show+strlen(text_show)+1) )
  82. { text_begin_show=cursor_pos-max_text_show_len+1;
  83. for (i=0;i<max_text_show_len;i++) text_show[i]=0;
  84. strncpy (text_show , text+text_begin_show, max_text_show_len);
  85. ret_val=TRUE; // drawed
  86. }
  87.   char tmpstr[255]="";
  88. strncpy (tmpstr,text_show,cursor_pos - text_begin_show+1);
  89. tmpstr[cursor_pos - text_begin_show+2]=0;
  90. cursor_pos_x= textwidth(tmpstr)-2;
  91. return ret_val;
  92. }
  93. void tedit_class::draw_cursor()
  94. {
  95. line (text_pos_x + cursor_pos_x +1, text_pos_y+1 ,
  96. text_pos_x + cursor_pos_x+1 , text_pos_y +textheight("j") + 3);
  97. }
  98. /**************************************************************************/
  99. int tedit_class::key_pressed_handler   (int key_scan_num )
  100. { int i;
  101.   static char temp_string [100];
  102. if  (control_class::key_pressed_handler (key_scan_num)==TRUE)
  103. return TRUE;
  104. else // MAY BE PUT HERE --> No matter at all
  105. switch (key_scan_num ) {
  106. case    LEFTKEY  :
  107. if (adjust_cursor ( cursor_pos -1 ))
  108. draw();
  109. break;
  110. case    RIGHTKEY  :
  111. if (adjust_cursor ( cursor_pos +1 ))
  112. draw();
  113. break;
  114. case  HOMEKEY :
  115. if (adjust_cursor ( 0 ))
  116. draw();
  117. break;
  118. case  ENDKEY :
  119. if (adjust_cursor ( strlen (text)  ))
  120. draw();
  121. break;
  122. case BSKEY :
  123. if (!strlen(text)) return TRUE;
  124. if (cursor_pos >=0) {
  125. if (text_begin_show>0) text_begin_show--;
  126. strcpy ( text + cursor_pos , text + cursor_pos+1 );
  127. adjust_cursor ( cursor_pos -1 );
  128. draw();
  129. }
  130. break;
  131. case  DELKEY :
  132. if (!strlen(text)) return TRUE;
  133. if ( (cursor_pos+1) <strlen(text)) {
  134. strcpy ( text + cursor_pos+1 , text +cursor_pos+2 );
  135. adjust_cursor ( cursor_pos );
  136. draw();
  137. }
  138. break;
  139. case    ENTERKEY :
  140. thequeue.SendMessage(ID,EditInputedMSG,this);
  141. key_code = TABKEY;
  142. thequeue.SendMessage(0, KeyPressedMSG,NULL);
  143. break;
  144. default :
  145. if (key_scan_num % 256 ==0 ) return FALSE;
  146. if (key_scan_num ==ESCKEY ) return FALSE;
  147. if (strlen(text)>max_text_len) {
  148. printf("07");
  149. return TRUE;
  150. }
  151. if (is_first_press) {
  152. text[0]=0;
  153. text_begin_show=0;
  154. adjust_cursor(-1);
  155. draw();
  156. is_first_press =FALSE;
  157. }
  158. strcpy (temp_string,text + cursor_pos+1);
  159. text[cursor_pos+1] = (key_scan_num % 256 ) ;
  160. text[cursor_pos+2] = 0;
  161. strcpy (text+cursor_pos+2,temp_string);
  162. if (cursor_pos-text_begin_show +1>=max_text_show_len)
  163.    text_begin_show++;
  164. adjust_cursor ( cursor_pos +1 );
  165. draw();
  166. break;
  167. }
  168. if (is_first_press) {
  169. draw();
  170. is_first_press =FALSE;
  171. }
  172. setcolor (BLACK);
  173. draw_cursor();
  174. return TRUE;
  175. }
  176. int tedit_class::msg_handler (MSG& message )
  177. { static int flag;
  178. switch (message.Action){
  179. case TimerMSG:
  180. if (in_menu_trap) return FALSE;
  181. flag =!flag;
  182. if (flag) setcolor(BLACK);
  183. else setcolor(WHITE);
  184. draw_cursor();
  185. return FALSE; //others also need it
  186. }
  187. return control_class::msg_handler (message);
  188. }