home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / drdobbs / 1992 / 06 / dflt12 / slidebox.c < prev    next >
Text File  |  1992-04-22  |  4KB  |  112 lines

  1. /* ------------- slidebox.c ------------ */
  2.  
  3. #include "dflat.h"
  4.  
  5. static int (*GenericProc)
  6.     (WINDOW wnd,MESSAGE msg,PARAM p1,PARAM p2);
  7. static BOOL KeepRunning;
  8. static int SliderLen;
  9. static int Percent;
  10. extern DBOX SliderBoxDB;
  11.  
  12. static void InsertPercent(char *s)
  13. {
  14.     int offset;
  15.     char pcc[5];
  16.  
  17.     sprintf(s, "%c%c%c",
  18.             CHANGECOLOR,
  19.             color[DIALOG][SELECT_COLOR][FG]+0x80,
  20.             color[DIALOG][SELECT_COLOR][BG]+0x80);
  21.     s += 3;
  22.     memset(s, ' ', SliderLen);
  23.     *(s+SliderLen) = '\0';
  24.     sprintf(pcc, "%d%%", Percent);
  25.     strncpy(s+SliderLen/2-1, pcc, strlen(pcc));
  26.     offset = (SliderLen * Percent) / 100;
  27.     memmove(s+offset+4, s+offset, strlen(s+offset)+1);
  28.     sprintf(pcc, "%c%c%c%c",
  29.             RESETCOLOR,
  30.             CHANGECOLOR,
  31.             color[DIALOG][SELECT_COLOR][BG]+0x80,
  32.             color[DIALOG][SELECT_COLOR][FG]+0x80);
  33.     strncpy(s+offset, pcc, 4);
  34.     *(s + strlen(s) - 1) = RESETCOLOR;
  35. }
  36.  
  37. static int SliderTextProc(
  38.             WINDOW wnd,MESSAGE msg,PARAM p1,PARAM p2)
  39. {
  40.     switch (msg)    {
  41.         case PAINT:
  42.             Percent = (int)p2;
  43.             InsertPercent(GetText(wnd) ?
  44.                 GetText(wnd) : SliderBoxDB.ctl[1].itext);
  45.             GenericProc(wnd, PAINT, 0, 0);
  46.             if (Percent >= 100)
  47.                 SendMessage(GetParent(wnd),COMMAND,ID_CANCEL,0);
  48.             if (!dispatch_message())
  49.                 PostMessage(GetParent(wnd), ENDDIALOG, 0, 0);
  50.             return KeepRunning;
  51.         default:
  52.             break;
  53.     }
  54.     return GenericProc(wnd, msg, p1, p2);
  55. }
  56.  
  57. static int SliderBoxProc(
  58.             WINDOW wnd, MESSAGE msg, PARAM p1, PARAM p2)
  59. {
  60.     int rtn;
  61.     WINDOW twnd;
  62.     switch (msg)    {
  63.         case CREATE_WINDOW:
  64.             AddAttribute(wnd, SAVESELF);
  65.             rtn = DefaultWndProc(wnd, msg, p1, p2);
  66.             twnd = SliderBoxDB.ctl[1].wnd;
  67.             GenericProc = twnd->wndproc;
  68.             twnd->wndproc = SliderTextProc;
  69.             KeepRunning = TRUE;
  70.             SendMessage(wnd, CAPTURE_MOUSE, 0, 0);
  71.             SendMessage(wnd, CAPTURE_KEYBOARD, 0, 0);
  72.             return rtn;
  73.         case COMMAND:
  74.             if ((int)p2 == 0 && (int)p1 == ID_CANCEL)    {
  75.                 if (Percent >= 100 ||
  76.                         YesNoBox("Terminate process?"))
  77.                     KeepRunning = FALSE;
  78.                 else
  79.                     return TRUE;
  80.             }
  81.             break;
  82.         case CLOSE_WINDOW:
  83.             SendMessage(wnd, RELEASE_MOUSE, 0, 0);
  84.             SendMessage(wnd, RELEASE_KEYBOARD, 0, 0);
  85.             break;
  86.         default:
  87.             break;
  88.     }
  89.     return DefaultWndProc(wnd, msg, p1, p2);
  90. }
  91.  
  92. WINDOW SliderBox(int len, char *ttl, char *msg)
  93. {
  94.     SliderLen = len;
  95.     SliderBoxDB.dwnd.title = ttl;
  96.     SliderBoxDB.dwnd.w =
  97.         max(strlen(ttl),max(len, strlen(msg)))+4;
  98.     SliderBoxDB.ctl[0].itext = msg;
  99.     SliderBoxDB.ctl[0].dwnd.w = strlen(msg);
  100.     SliderBoxDB.ctl[0].dwnd.x =
  101.         (SliderBoxDB.dwnd.w - strlen(msg)-1) / 2;
  102.     SliderBoxDB.ctl[1].itext =
  103.         DFrealloc(SliderBoxDB.ctl[1].itext, len+10);
  104.     Percent = 0;
  105.     InsertPercent(SliderBoxDB.ctl[1].itext);
  106.     SliderBoxDB.ctl[1].dwnd.w = len;
  107.     SliderBoxDB.ctl[1].dwnd.x = (SliderBoxDB.dwnd.w-len-1)/2;
  108.     SliderBoxDB.ctl[2].dwnd.x = (SliderBoxDB.dwnd.w-10)/2;
  109.     DialogBox(NULL, &SliderBoxDB, FALSE, SliderBoxProc);
  110.     return SliderBoxDB.ctl[1].wnd;
  111. }
  112.