home *** CD-ROM | disk | FTP | other *** search
/ Collection of Education / collectionofeducationcarat1997.iso / COMPUSCI / CENVIW.ZIP / WHORYOU.CMM < prev    next >
Text File  |  1993-12-21  |  12KB  |  321 lines

  1. // WhoRYou.cmm - CEnvi demonstration for designing a dialog window.
  2. //               This demo prompts the user for information about
  3. //               themselves.  You can see from this sample code
  4. //               that dedigning your own windows and windows behavior
  5. //               is very flexible, but also complicated.
  6.  
  7. #include <Window.lib>
  8. #include <WinUtil.lib>
  9. #include <Message.lib>
  10.  
  11. main()
  12. {
  13.    do {
  14.       if ( GetUserID(FirstName,LastName,Sex) )
  15.          TryAgain = ShowOKmessage(FirstName,LastName,Sex);
  16.       else
  17.          TryAgain = ShowCancelMessage();
  18.    } while( TryAgain );
  19. }
  20.  
  21.  
  22. GetUserID(FirstName,LastName,Sex) // dialog box for user info
  23. {
  24.    // Initialize some size parameters
  25.    AveCharWidth, AveCharHeight;
  26.    GetCharacterSizes(AveCharWidth,AveCharHeight);
  27.    AveRowGap = AveCharHeight / 2;
  28.    AveColGap = AveCharWidth
  29.  
  30.    // Initially make the main window (which will be resized later).
  31.    // For now draw it off the screen so no one sees
  32.    MainWindow = MakeWindow(NULL,NULL,"GetUserIDFunc","Scientific Survey",
  33.                            WS_POPUPWINDOW | WS_CAPTION | WS_VISIBLE,
  34.                            -10,-10,9,9,NULL,uid);
  35.  
  36.    // Make a couple of lines of descriptive text
  37.    Description = "This scientifically-designed survery will determine if "
  38.                  "CEnvi is right for you.  Use a number 2 pencil.  "
  39.                  "Good luck! (no cheating)";
  40.    #define  MAX_TEXTLEN 40
  41.    DescRowCount = (strlen(Description) + 15/*wrap room*/) / MAX_TEXTLEN ;
  42.    MakeWindow(MainWindow,"static","GetUserIDChildFunc",Description,WS_CHILD | WS_VISIBLE,
  43.               AveColGap,AveRowGap,MAX_TEXTLEN * AveCharWidth,DescRowCount * AveCharHeight,NULL,uid);
  44.    BottomRow = AveRowGap + DescRowCount * AveCharHeight;
  45.  
  46.    // Request the user's first name, which is three fields
  47.    #define EDIT_MARGIN  (AveCharHeight / 4)  // extra space around edit field
  48.    BottomRow += AveRowGap;
  49.    prompt = "First Name";
  50.    EditLength = 22;  // default size of window for data input
  51.    MakeWindow(MainWindow,"static",NULL,prompt,WS_CHILD | WS_VISIBLE,
  52.               AveColGap,BottomRow + EDIT_MARGIN,
  53.               width = AveCharWidth * (strlen(prompt)+1),AveCharHeight,NULL);
  54.    MakeWindow(MainWindow,"static",NULL,NULL,WS_CHILD | WS_VISIBLE | SS_BLACKFRAME,
  55.               col = AveColGap * 2 + width,BottomRow,
  56.               (1+EditLength)*AveCharWidth,AveCharHeight + 2*EDIT_MARGIN,NULL);
  57.    uid.FirstNameHwnd = MakeWindow(MainWindow,"edit","GetUserIDChildFunc",NULL,
  58.          WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | ES_LEFT,
  59.          col + AveCharWidth / 2,BottomRow + EDIT_MARGIN,
  60.          EditLength*AveCharWidth,AveCharHeight,NULL,uid);
  61.    BottomRow += AveCharHeight + 2*EDIT_MARGIN;
  62.  
  63.    // Request the user's last name, which is much like the first
  64.    BottomRow += AveRowGap;
  65.    prompt = "Last Name";
  66.    EditLength = 30;  // default size of window for data input
  67.    MakeWindow(MainWindow,"static",NULL,prompt,WS_CHILD | WS_VISIBLE,
  68.               AveColGap,BottomRow + EDIT_MARGIN,
  69.               width = AveCharWidth * (strlen(prompt)+1),AveCharHeight,NULL);
  70.    MakeWindow(MainWindow,"static",NULL,NULL,WS_CHILD | WS_VISIBLE | SS_BLACKFRAME,
  71.               col = AveColGap * 2 + width,BottomRow,
  72.               (1+EditLength)*AveCharWidth,AveCharHeight + 2*EDIT_MARGIN,NULL);
  73.    uid.LastNameHwnd = MakeWindow(MainWindow,"edit","GetUserIDChildFunc",NULL,
  74.          WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | ES_LEFT,
  75.          col + AveCharWidth / 2,BottomRow + EDIT_MARGIN,
  76.          EditLength*AveCharWidth,AveCharHeight,NULL,uid);
  77.    BottomRow += AveCharHeight + 2*EDIT_MARGIN;
  78.  
  79.    // Add radio buttons to select sex
  80.    BottomRow += AveRowGap;
  81.    #define PUSHBUTT_HEIGHT AveCharHeight
  82.    width = AveCharWidth * (4 + strlen("Female"));
  83.    uid.FemaleHwnd = MakeWindow(MainWindow,"button","GetUserIDChildFunc","Female",WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,
  84.               AveColGap * 3,BottomRow,width,PUSHBUTT_HEIGHT,NULL,uid);
  85.    uid.MaleHwnd = MakeWindow(MainWindow,"button","GetUserIDChildFunc","Male",WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON,
  86.               AveColGap * 4 + width,BottomRow,AveCharWidth * (4 + strlen("Male")),PUSHBUTT_HEIGHT,NULL,uid);
  87.    BottomRow += PUSHBUTT_HEIGHT;
  88.  
  89.    // Finally, add the OK and CANCEL buttons
  90.    BottomRow += AveRowGap * 2;
  91.    #define BUTTON_WIDTH  10 * AveCharWidth
  92.    #define BUTTON_HEIGHT AveCharHeight * 3 / 2
  93.    uid.OKhwnd = MakeWindow(MainWindow,"button","GetUserIDChildFunc","OK",
  94.               WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON | WS_DISABLED,
  95.               AveColGap * 3,BottomRow,BUTTON_WIDTH,BUTTON_HEIGHT,NULL,uid);
  96.    uid.CancelHwnd = MakeWindow(MainWindow,"button","GetUserIDChildFunc","CANCEL",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
  97.               AveColGap * 6 + BUTTON_WIDTH,BottomRow,BUTTON_WIDTH,BUTTON_HEIGHT,NULL,uid);
  98.  
  99.  
  100.    SizeAndCenterDisplay(MainWindow,AveColGap,AveRowGap);
  101.  
  102.    // Initialize with FirstName as the active field
  103.    SetFocus(uid.FirstNameHwnd);
  104.    uid.OKselected = False;
  105.  
  106.    while ( DoWindows()  &&  !uid.OKselected ) ;
  107.  
  108.    if ( uid.OKselected ) {
  109.       GetEditText(uid.FirstNameHwnd,FirstName);
  110.       FirstName[0] = toupper(FirstName[0]);
  111.       GetEditText(uid.LastNameHwnd,LastName);
  112.       LastName[0] = toupper(LastName[0]);
  113.       if ( SendMessage(uid.FemaleHwnd,BM_GETCHECK,0,0) )    strcpy(Sex,"woman");
  114.       else if ( SendMessage(uid.MaleHwnd,BM_GETCHECK,0,0) ) strcpy(Sex,"man");
  115.       else                                                  strcpy(Sex,"person");
  116.       BreakWindow(MainWindow);
  117.       return(TRUE);
  118.    }
  119.  
  120.    return(FALSE);
  121. }
  122.  
  123.  
  124. /**** Windows functions called from GetUserInfo ****/
  125.  
  126. GetUserIDFunc(hwnd,msg,parm1,parm2,uid)
  127. {
  128.    if ( msg == WM_COMMAND ) {
  129.       childHwnd = parm2 & 0xFFFF;
  130.       switch ( (parm2 >> 16) & 0xFFFF ) {
  131.          case BN_CLICKED:
  132.             switch( childHwnd ) {
  133.                case uid.OKhwnd:
  134.                   uid.OKselected = TRUE;
  135.                   break;
  136.                case uid.CancelHwnd:
  137.                   BreakWindow(hwnd);
  138.                   break;
  139.                default:
  140.                   ShouldOKbeEnabled(uid);
  141.                   break;
  142.             }
  143.             break;
  144.          case EN_CHANGE:
  145.             ShouldOKbeEnabled(uid);
  146.             break;
  147.       }
  148.    }
  149. }
  150.  
  151. GetUserIDChildFunc(hwnd,msg,parm1,parm2,uid)
  152. {
  153.    #define VK_SHIFT  0x10
  154.  
  155.    if ( WM_CHAR == msg ) {
  156.       switch ( parm1 ) {
  157.          case '\t':
  158.             // Tab to next field or back tab to previous field.  Will allow moving
  159.             // to any field that is not "static" type and not disabled
  160.             Backward = (0x80 & DynamicLink("USER","GETKEYSTATE",SWORD16,PASCAL,VK_SHIFT));
  161.             Sibling = hwnd;
  162.             BLObSize(_className,40);
  163.             do {
  164.                // if this is the end of the list then go to the other end
  165.                if ( Sibling == GetWindow(Sibling,Backward ? GW_HWNDFIRST : GW_HWNDLAST ) )
  166.                   Sibling = GetWindow(Sibling,Backward ? GW_HWNDLAST : GW_HWNDFIRST );
  167.                else
  168.                   Sibling = GetWindow(Sibling,Backward ? GW_HWNDPREV : GW_HWNDNEXT);
  169.                _len = GetClassName(Sibling,_className,39);
  170.             } while( (_len == 6  &&  !memicmp(_className,"static",6))
  171.                   || !IsWindowEnabled(Sibling) );
  172.             SetFocus(Sibling);
  173.             return 0;
  174.          case ' ':
  175.             // don't let last name or first name accept spaces
  176.             if ( hwnd == uid.LastNameHwnd  ||  hwnd == uid.FirstNameHwnd )
  177.                return 0;
  178.             break;
  179.          case '\r';
  180.             // Enter selects the OK button, and so post a ' ' to the
  181.             // OK button window
  182.             if ( IsWindowEnabled(uid.OKhwnd) ) {
  183.                PostMessage(uid.OKhwnd,WM_KEYDOWN,' ',parm2);
  184.                PostMessage(uid.OKhwnd,WM_KEYUP,' ',parm2);
  185.             }
  186.             return(0);
  187.       }
  188.    }
  189. }
  190.  
  191.  
  192. ShouldOKbeEnabled(uid)  // adjust the OK button to be enabled or NOT
  193. {
  194.    WantOKstate = ( 0 != GetWindowTextLength(uid.FirstNameHwnd)
  195.                 &