Annotation of mstools/samples/ddeml/ddeinst/ddeprocs.c, revision 1.1

1.1     ! root        1: 
        !             2: /******************************************************************************\
        !             3: *       This is a part of the Microsoft Source Code Samples. 
        !             4: *       Copyright (C) 1993 Microsoft Corporation.
        !             5: *       All rights reserved. 
        !             6: *       This source code is only intended as a supplement to 
        !             7: *       Microsoft Development Tools and/or WinHelp documentation.
        !             8: *       See these sources for detailed information regarding the 
        !             9: *       Microsoft samples programs.
        !            10: \******************************************************************************/
        !            11: 
        !            12: /*
        !            13:    ddeprocs.c
        !            14: */
        !            15: 
        !            16: #include <windows.h>
        !            17: #include <stdlib.h>
        !            18: #include <stdio.h>
        !            19: #include "ddeinst.h"
        !            20: #include "ddextrn.h"
        !            21: #include "dialogs.h"
        !            22: 
        !            23: // function prototype for List synchronization
        !            24: void   SynchronizeLists (HWND);
        !            25: void   SynchronizeListSelection (HWND);
        !            26: 
        !            27: // function prototype for child window creation 
        !            28: void   CreateChildren (HWND);
        !            29: 
        !            30: // internal thread counter
        !            31: int    iThreadCount = 0;
        !            32: 
        !            33: /********************************************************************
        !            34: 
        !            35:    MainWndProc.
        !            36:    
        !            37:    Function that processes the messages sent to the main window.
        !            38: 
        !            39: ********************************************************************/
        !            40: 
        !            41: LRESULT APIENTRY MainWndProc (HWND hwnd, UINT uiMsg, WPARAM wParam,
        !            42:       LPARAM lParam) {
        !            43:    BOOL        fFlag;
        !            44: 
        !            45:    switch (uiMsg) {
        !            46:       case WM_CREATE: {
        !            47: 
        !            48: // Create all of the child windows that are desired.
        !            49:          CreateChildren (hwnd);
        !            50:          break;
        !            51:       }/*endCase*/
        !            52:       case WM_DESTROY: {
        !            53:          PostQuitMessage (0);
        !            54:          return (0L);
        !            55:       }/*endCase*/
        !            56:       case WM_USER_CLOSE_DIALOG: {
        !            57:          if (hwndDialog) {
        !            58:             DestroyWindow (hwndDialog);
        !            59:             hwndDialog = (HWND) NULL;
        !            60:             return (TRUE);
        !            61:          }/*endIf*/
        !            62:          break;
        !            63:       }/*endCase*/
        !            64:       case WM_SIZE: {
        !            65:       /* Need to resize the StatusBar */
        !            66:          if (hwndStatus) {
        !            67:             long lHeight;
        !            68:             int  iWidth;
        !            69:             int  iHeight;
        !            70: 
        !            71:             iWidth = LOWORD (lParam);
        !            72:             iHeight = HIWORD (lParam);
        !            73:             lHeight = GetWindowLong (hwndStatus, GWL_USERDATA);
        !            74:             MoveWindow (hwndStatus, -1, iHeight - (int) lHeight,
        !            75:                   iWidth + 2, lHeight + 2, TRUE);
        !            76:          }/*endIf*/
        !            77:          break;
        !            78:       }/*endCase*/
        !            79:       case WM_USER_GET_APPS: {
        !            80:          StartTraverseThread (szUserPath);
        !            81:          return (1L);
        !            82:       }/*endCase*/
        !            83:       case WM_USER_GET_GROUPS: {
        !            84:          StartGroupRetrievalThread ();
        !            85:          return (1L);
        !            86:       }/*endCase*/
        !            87:       case WM_USER_THREAD_DONE: {
        !            88:          iThreadCount++;
        !            89:          if (!fBatch) {
        !            90:             break;
        !            91:          }/*endIf*/
        !            92:          if (iThreadCount == 2) {
        !            93:             PostMessage (ghwndMain, WM_COMMAND,
        !            94:                   (WPARAM) MAKELONG (ID_ADDALLBUTTON, BN_CLICKED),
        !            95:                   (LPARAM) hwndAddAll);
        !            96:             PostMessage (ghwndMain, WM_COMMAND,
        !            97:                   (WPARAM) MAKELONG (ID_ADDGROUP, BN_CLICKED),
        !            98:                   (LPARAM) hwndAddGroupButton);
        !            99:             PostMessage (ghwndMain, WM_COMMAND,
        !           100:                   (WPARAM) MAKELONG (ID_ADDBUTTON, BN_CLICKED), 
        !           101:                   (LPARAM) hwndAddButton);
        !           102:             iThreadCount = 0;
        !           103:          }/*endIf*/
        !           104:          break;
        !           105:       }/*endCase*/
        !           106:       case WM_COMMAND: {
        !           107:          switch (HIWORD (wParam)) {
        !           108:             case LBN_SELCHANGE: {
        !           109:                SynchronizeListSelection ((HWND) lParam);
        !           110:                if ((HWND) lParam == hwndCombo) {
        !           111:                   EnableWindow (hwndAddGroupButton, TRUE);
        !           112:                }/*endIf*/
        !           113:                break;
        !           114:             }/*endCase*/
        !           115:             case CBN_EDITCHANGE: {
        !           116:                fFlag = (BOOL) GetWindowTextLength (hwndCombo);
        !           117:                EnableWindow (hwndAddGroupButton, fFlag);
        !           118:                break;
        !           119:             }/*endCase*/
        !           120:             case BN_CLICKED: {
        !           121:                switch (LOWORD (wParam)) {
        !           122:                   case ID_ADDALLBUTTON: {
        !           123: 
        !           124:                // Select all elements in the two lists.
        !           125:                // Under Win 3.x LPARAM of LB_SETSEL is MAKELPARAM (-1, 0)
        !           126:                // Under Win32 it is -1
        !           127:                
        !           128:                      SendMessage (hwndFileList, LB_SETSEL, (WPARAM) TRUE,
        !           129:                            (LPARAM) -1);
        !           130: 
        !           131:                // Under Win 3.x LPARAM of LB_SETSEL is MAKELPARAM (-1, 0)
        !           132:                // Under Win32 it is -1
        !           133:                
        !           134:                      SendMessage (hwndFileList2, LB_SETSEL, (WPARAM) TRUE,
        !           135:                            (LPARAM) -1);
        !           136:                      break;
        !           137:                   }/*endCase*/
        !           138:                   case ID_EXITBUTTON: {
        !           139:                      PostQuitMessage (0);
        !           140:                      break;
        !           141:                   }/*endCase*/
        !           142:                   case ID_ADDBUTTON: {
        !           143:                   // Create the Progress Dialog
        !           144:                      hwndDialog = CreateDialog (ghModule,
        !           145:                            "ProgressDialog", hwnd, ProgressDlgWndProc);
        !           146: 
        !           147:                   // Start a thread to add the items 
        !           148:                      StartAddThread ();
        !           149:                      break;
        !           150:                   }/*endCase*/
        !           151:                   case ID_ADDGROUP: {
        !           152: 
        !           153:                   // Add the user defined group.
        !           154:                      CreateGroup ();
        !           155:                      break;
        !           156:                   }/*endCase*/
        !           157:                }/*endSwitch*/
        !           158:                break;
        !           159:             }/*endCase*/
        !           160:          }/*endSwitch*/
        !           161: 
        !           162:      // Process menu events now.
        !           163: 
        !           164:          switch (LOWORD (wParam)) {
        !           165:             case DI_EXIT: {
        !           166:                PostQuitMessage (0);
        !           167:                return (1L);
        !           168:             }/*endCase*/
        !           169:             case DI_ABOUT: {
        !           170:                DialogBox (ghModule, "AboutBox", hwnd,
        !           171:                      (DLGPROC) AboutBoxWndProc);
        !           172:                break;
        !           173:             }/*endCase*/
        !           174:          }/*endSwitch*/
        !           175:          break;
        !           176:       }/*endCase*/
        !           177:    }/*endSwitch*/
        !           178:    return (DefWindowProc (hwnd, uiMsg, wParam, lParam));
        !           179: }/* end MainWndProc */
        !           180: 
        !           181: /********************************************************************
        !           182: 
        !           183:    StatusBarWndProc.
        !           184:    
        !           185:    Function that manages the Status bar at the bottom of the main 
        !           186:    window.
        !           187: 
        !           188: ********************************************************************/
        !           189: 
        !           190: LRESULT APIENTRY StatusBarWndProc (HWND hwnd, UINT uiMsg, WPARAM wParam,
        !           191:       LPARAM lParam) {
        !           192:    HDC             hdc;
        !           193:    long            lHeight;
        !           194:    RECT            rc;
        !           195:    PAINTSTRUCT     ps;
        !           196:    TEXTMETRIC      tm;
        !           197:    POINT           pts[6];
        !           198: 
        !           199:    switch (uiMsg) {
        !           200:       case WM_CTLCOLORSTATIC: {
        !           201:          SetBkMode ((HDC) wParam, TRANSPARENT);
        !           202:          return ((LRESULT) GetStockObject (WHITE_BRUSH));
        !           203:       }/*endCase*/
        !           204:       case WM_CREATE: {
        !           205:          hdc = GetDC (hwnd); // Get the DC for text metrics
        !           206: 
        !           207:          GetClientRect (GetParent (hwnd), &rc);
        !           208:          GetTextMetrics (hdc, &tm);
        !           209: 
        !           210:       // Calculate the height of the window
        !           211:          lHeight = tm.tmHeight + 10 * GetSystemMetrics (SM_CYBORDER) + 2;
        !           212: 
        !           213:       // Save away the calculated height
        !           214:          SetWindowLong (hwnd, GWL_USERDATA, lHeight);
        !           215: 
        !           216:       //* resize the window
        !           217:          SetWindowPos (hwnd, NULL, -1, rc.bottom - lHeight,
        !           218:             rc.right + 2, lHeight + 2, SWP_NOZORDER | SWP_NOMOVE);
        !           219: 
        !           220:          ReleaseDC (hwnd, hdc);
        !           221:          break;
        !           222:       }/*endCase*/
        !           223:       case WM_USER_UPDATE_STATUS: {
        !           224:          switch (lParam) {
        !           225:             case ID_DDEML_CONNECT: {
        !           226:                SetWindowText (hwndStatusText, "DDEML Connection");
        !           227:                break;
        !           228:             }/*endCase*/
        !           229:             case ID_DDEML_RETRIEVING: {
        !           230:                SetWindowText (hwndStatusText, "DDEML Retrieving");
        !           231:                break;
        !           232:             }/*endCase*/
        !           233:             case ID_DDEML_DISCONNECT: {
        !           234:                SetWindowText (hwndStatusText, "DDEML Disconnect");
        !           235:                break;
        !           236:             }/*endCase*/
        !           237:             case ID_DDEML_COMPLETE: {
        !           238:                SetWindowText (hwndStatusText, "DDEML Complete");
        !           239:                break;
        !           240:             }/*endCase*/
        !           241:             case ID_DDEML_ACTIVATE: {
        !           242:                SetWindowText (hwndStatusText, "DDEML Activate Group");
        !           243:                break;
        !           244:             }/*endCase*/
        !           245:             case ID_DDEML_CREATE: {
        !           246:                SetWindowText (hwndStatusText, "DDEML Create Group");
        !           247:                break;
        !           248:             }/*endCase*/
        !           249:             case ID_DDEML_ADD: {
        !           250:                TCHAR   szText[32];
        !           251: 
        !           252:                sprintf (szText, "DDEML Add Item %ld", wParam);
        !           253:                SetWindowText (hwndStatusText, szText);
        !           254:                break;
        !           255:             }/*endCase*/
        !           256:          }/*endSwitch*/
        !           257:          break;
        !           258:       }/*endCase*/
        !           259:       case WM_PAINT: {
        !           260:          HBRUSH   hBrush;
        !           261:          HBRUSH   hBrushTemp;
        !           262:          HPEN     hPen;
        !           263:          HPEN     hPenTemp;
        !           264: 
        !           265:          hdc = BeginPaint (hwnd, &ps);
        !           266:          GetClientRect (hwnd, &rc);
        !           267: 
        !           268:          lHeight = GetWindowLong (hwnd, GWL_USERDATA);
        !           269:          pts[0].x = 3;
        !           270:          pts[0].y = pts[5].y = lHeight - 4;
        !           271:          pts[1].x = 6;
        !           272:          pts[1].y = pts[2].y = lHeight - 6;
        !           273:          pts[2].x = pts[3].x = (rc.right / 2) - 4;
        !           274:          pts[3].y = 6;
        !           275:          pts[4].y = 3;
        !           276:          pts[4].x = pts[5].x = rc.right / 2;
        !           277:          hBrush = GetStockObject (WHITE_BRUSH);
        !           278:          hPen = GetStockObject (WHITE_PEN);
        !           279:          hBrushTemp = SelectObject (hdc, hBrush);
        !           280:          hPenTemp = SelectObject (hdc, hPen);
        !           281:          SetPolyFillMode (hdc, WINDING);
        !           282:          Polygon (hdc, pts, 6);
        !           283:          hBrush = CreateSolidBrush (GetSysColor (COLOR_BTNSHADOW));
        !           284:          pts[2].x = 6;
        !           285:          hPen = CreatePen (PS_SOLID, 1, GetSysColor (COLOR_BTNSHADOW));
        !           286:          pts[2].y = 6;
        !           287:          pts[5].x = pts[5].y = 3;
        !           288:          SelectObject (hdc, hBrush);
        !           289:          SelectObject (hdc, hPen);
        !           290:          Polygon (hdc, pts, 6);
        !           291:          rc.left = rc.top = 7;
        !           292:          rc.right = (rc.right / 2) - 4;
        !           293:          rc.bottom = lHeight - 7;
        !           294:          SelectObject (hdc, hBrushTemp);
        !           295:          SelectObject (hdc, hPenTemp);
        !           296:          DeleteObject (hBrush);
        !           297:          DeleteObject (hPen);
        !           298:          hBrush = GetStockObject (WHITE_BRUSH);
        !           299:          FillRect (hdc, &rc, hBrush);
        !           300:          DeleteObject (hBrush);
        !           301:          EndPaint (hwnd, &ps);
        !           302:          return (0L);
        !           303:       }/*endCase*/
        !           304:    }/*endSwitch*/
        !           305:    return (DefWindowProc (hwnd, uiMsg, wParam, lParam));
        !           306: }/* end StatusBarWndProc */
        !           307: 
        !           308: /********************************************************************
        !           309: 
        !           310:    ListBoxWndProc.
        !           311:    
        !           312:    Function that manages the list boxes that are on the screen. Subclassed
        !           313:    to provide additional functionality.
        !           314: 
        !           315: ********************************************************************/
        !           316: 
        !           317: LRESULT APIENTRY ListBoxWndProc (HWND hwnd, UINT uiMsg, WPARAM wParam,
        !           318:       LRESULT lParam) {
        !           319: 
        !           320:    switch (uiMsg) {
        !           321:       case WM_KEYUP: {
        !           322:          SynchronizeLists (hwnd);
        !           323:          break;
        !           324:       }/*endCase*/
        !           325:       case WM_VSCROLL: {
        !           326:          SynchronizeLists (hwnd);
        !           327:          break;
        !           328:       }/*endCase*/
        !           329:       break;
        !           330:    }/*endSwitch*/
        !           331:    return (CallWindowProc (DefListBoxWndProc, hwnd, uiMsg, wParam, lParam));
        !           332: }/* end ListBoxWndProc */
        !           333: 
        !           334: /********************************************************************
        !           335: 
        !           336:    SynchronizeLists.
        !           337:    
        !           338:    Function that makes sure that the two lists are synchronized and 
        !           339:    always have the same selection.
        !           340: 
        !           341: ********************************************************************/
        !           342: 
        !           343: void SynchronizeLists (HWND hwnd) {
        !           344:    HWND   hwndOther;
        !           345:    long   lSourceTop;
        !           346:    long   lTargetTop;
        !           347: 
        !           348: // If this is from the combo list then return.
        !           349:    if (hwnd == hwndCombo) {
        !           350:       return;
        !           351:    }/*endIf*/
        !           352: 
        !           353: // Figure out which list caused the event and update the other.
        !           354:    if (hwnd == hwndFileList) {
        !           355:       hwndOther = hwndFileList2;
        !           356:    } else {
        !           357:       hwndOther = hwndFileList;
        !           358:    }/*endIf*/
        !           359: 
        !           360: // Get the top index of the source list.
        !           361:    lSourceTop = SendMessage (hwnd, LB_GETTOPINDEX, 0, 0L);
        !           362: 
        !           363: // Get the top index of the target list.
        !           364:    lTargetTop = SendMessage (hwndOther, LB_GETTOPINDEX, 0, 0L);
        !           365: 
        !           366: // If the top indexes are different set the top of the target to the
        !           367: // same value as the source.
        !           368:    if (lSourceTop != lTargetTop) {
        !           369:       SendMessage (hwndOther, LB_SETTOPINDEX, lSourceTop, 0L);
        !           370:    }/*endIf*/
        !           371: }/* end SynchronizeLists */
        !           372: 
        !           373: /********************************************************************
        !           374: 
        !           375:    SynchronizeListSelection.
        !           376:    
        !           377:    Function that actually manages the list selection.
        !           378: 
        !           379: ********************************************************************/
        !           380: 
        !           381: void SynchronizeListSelection (HWND hwnd) {
        !           382:    HWND   hwndOther;
        !           383:    long   lNumSel;
        !           384:    int   * lpSelection;
        !           385:    long   lIndex;
        !           386: 
        !           387: // If this is from the combo list then return.
        !           388: 
        !           389:    if (hwnd == hwndCombo) {
        !           390:       return;
        !           391:    }/*endIf*/
        !           392: 
        !           393: // Figure out which list caused the event and update the other.
        !           394: 
        !           395:    if (hwnd == hwndFileList) {
        !           396:       hwndOther = hwndFileList2;
        !           397:    } else {
        !           398:       hwndOther = hwndFileList;
        !           399:    }/*endIf*/
        !           400: 
        !           401: // Find out how many items are selected in the source list.
        !           402: 
        !           403:    lNumSel = SendMessage (hwnd, LB_GETSELCOUNT, 0, 0L);
        !           404:    if (lNumSel != LB_ERR && lNumSel != 0) {
        !           405: 
        !           406:    // Allocate a block of memory to hold the selection indexes.
        !           407:       lpSelection = (int *) GlobalAlloc (GMEM_FIXED | GMEM_ZEROINIT,
        !           408:          lNumSel * sizeof (int));
        !           409:       if (lpSelection) {
        !           410: 
        !           411:    // Clear the selection in the list before reselecting.
        !           412:    // Under Win 3.x LPARAM of LB_SETSEL is MAKELPARAM (-1, 0)
        !           413:    // Under Win32 it is -1
        !           414:                
        !           415:          SendMessage (hwndOther, LB_SETSEL, (WPARAM) FALSE, (LPARAM) -1);
        !           416: 
        !           417:    // Retrieve the selection indexes.
        !           418: 
        !           419:          SendMessage (hwnd, LB_GETSELITEMS, lNumSel, (LPARAM) lpSelection);
        !           420: 
        !           421:    // Loop the indexes selecting the same values in the target list.
        !           422: 
        !           423:          for (lIndex = 0; lIndex < lNumSel; lIndex++) {
        !           424:             SendMessage (hwndOther, LB_SETSEL, (WPARAM) TRUE,
        !           425:                MAKELPARAM (lpSelection[lIndex], 0));
        !           426:          }/*endFor*/
        !           427: 
        !           428:    // Release the memory that was allocated.
        !           429: 
        !           430:          GlobalFree (lpSelection);
        !           431:       }/*endIf*/
        !           432:    }/*endIf*/
        !           433: }/* end SynchronizeListSelection */
        !           434: 
        !           435: /********************************************************************
        !           436: 
        !           437:    CreateChildren.
        !           438:    
        !           439:    Function that creates all of the child windows for the app.
        !           440: 
        !           441: ********************************************************************/
        !           442: 
        !           443: void CreateChildren (HWND hwnd) {
        !           444:    int              iListHeight;
        !           445:    long             lHeight;
        !           446:    RECT             rc;
        !           447: 
        !           448: // Create the status bar at the bottom of the window.
        !           449:    hwndStatus = CreateWindow ("StatusBar", NULL,
        !           450:          WS_BORDER | SS_LEFT | WS_CHILD | WS_VISIBLE,
        !           451:          0, 0, 0, 0, hwnd, (HMENU) ID_STATUSBAR, ghModule, NULL);
        !           452: 
        !           453: // Retrieve the height of the status bar.
        !           454:    lHeight = GetWindowLong (hwndStatus, GWL_USERDATA);
        !           455: 
        !           456: // Retrieve the size of the client area of the status bar.
        !           457:    GetClientRect (hwndStatus, &rc);
        !           458: 
        !           459:    hwndStatusText = CreateWindow ("Static", "Status Bar",
        !           460:          WS_VISIBLE | WS_CHILD | SS_LEFT,
        !           461:          7, 7, rc.right / 2 - 10, lHeight - 14, hwndStatus, (HMENU) 0, ghModule,
        !           462:          NULL);
        !           463: 
        !           464: // Retrieve the size of the client area of the parent window
        !           465:    GetClientRect (hwnd, &rc);
        !           466: 
        !           467: // Calculate the size of a list box.
        !           468:    iListHeight = rc.bottom - lHeight * 2;
        !           469: 
        !           470: // Decrease the size of lHeight to compensate for size of status bar.
        !           471:    lHeight -= 8;
        !           472: 
        !           473: // Create a Static window in the upper left corner.
        !           474:    CreateWindow ("Static", "Available exe's",
        !           475:          WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | SS_LEFT,
        !           476:          0, 0, 200, lHeight - 2, hwnd, (HMENU) 0, ghModule, NULL);
        !           477: 
        !           478: // Create the first list to hold the file name.
        !           479:    hwndFileList = CreateWindow ("ListBox", NULL, WS_CLIPSIBLINGS | LBS_NOTIFY |
        !           480:          WS_BORDER | WS_VISIBLE | WS_CHILD | LBS_EXTENDEDSEL | LBS_HASSTRINGS,
        !           481:          0, lHeight, 150, iListHeight, hwnd, (HMENU) ID_FILELIST, ghModule,
        !           482:          NULL);
        !           483: 
        !           484: // Subclass the list box window proc so we can do the synchronization
        !           485:    DefListBoxWndProc = (WNDPROC) GetWindowLong (hwndFileList, GWL_WNDPROC);
        !           486:    SetWindowLong (hwndFileList, GWL_WNDPROC, (LONG) ListBoxWndProc);
        !           487: 
        !           488: // Create the second list box that holds the name that will be used in the
        !           489: // Program Manager.
        !           490:    hwndFileList2 = CreateWindow ("ListBox", NULL,
        !           491:          WS_BORDER | WS_VISIBLE | WS_CHILD | WS_VSCROLL | LBS_EXTENDEDSEL |
        !           492:          LBS_NOTIFY | LBS_HASSTRINGS | LBS_SORT | WS_CLIPSIBLINGS, 150,
        !           493:          lHeight, 150, iListHeight, hwnd, (HMENU) ID_FILELIST2, ghModule,
        !           494:          NULL);
        !           495: 
        !           496: // Subclass the list.
        !           497:    SetWindowLong (hwndFileList2, GWL_WNDPROC, (LONG) ListBoxWndProc);
        !           498: 
        !           499: // Create a third list box that is not visible that contains the absolute
        !           500: // path to the executable.
        !           501:    hwndPathList = CreateWindow ("ListBox", NULL,
        !           502:          WS_BORDER | WS_CHILD | WS_VSCROLL | LBS_EXTENDEDSEL |
        !           503:          LBS_NOTIFY | LBS_HASSTRINGS | LBS_SORT | WS_CLIPSIBLINGS, 150, lHeight,
        !           504:          150, iListHeight, hwnd, (HMENU) ID_PATHLIST, ghModule, NULL);
        !           505: 
        !           506: // Create a button that is used to add a group.
        !           507:    hwndAddGroupButton = CreateWindow ("Button", "Add Group",
        !           508:          WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS,
        !           509:          rc.right - 110, iListHeight - (int) (lHeight * 4),
        !           510:          100, lHeight, hwnd, (HMENU) ID_ADDGROUP, ghModule, NULL);
        !           511: 
        !           512: // Create the button that is used to add the selected items.
        !           513:    hwndAddButton = CreateWindow ("Button", "Add Items",
        !           514:          WS_DISABLED | WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS,
        !           515:          rc.right - 110, iListHeight - (int) (lHeight * 3),
        !           516:          100, lHeight, hwnd, (HMENU) ID_ADDBUTTON, ghModule, NULL);
        !           517: 
        !           518: // Create the button that is used to select all of the items in the list.
        !           519:    hwndAddAll = CreateWindow ("Button", "Select All",
        !           520:          WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS,
        !           521:          rc.right - 110, iListHeight - (int) (lHeight * 2),
        !           522:          100, lHeight, hwnd, (HMENU) ID_ADDALLBUTTON, ghModule, NULL);
        !           523: 
        !           524: // Create a button that can be used to exit the application.
        !           525:    hwndExitButton = CreateWindow ("Button", "Exit",
        !           526:          WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS,
        !           527:          rc.right - 110, iListHeight - (int) lHeight, 100, lHeight, hwnd,
        !           528:          (HMENU) ID_EXITBUTTON, ghModule, NULL);
        !           529: 
        !           530: // Create a drop down combo box for the group names from the Program Manager.
        !           531:    hwndCombo = CreateWindow ("ComboBox", NULL,
        !           532:          WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | CBS_DROPDOWN | WS_VSCROLL |
        !           533:          CBS_AUTOHSCROLL | CBS_HASSTRINGS, rc.right - 200, lHeight,
        !           534:          190, lHeight * 5, hwnd, (HMENU) ID_COMBOBOX, ghModule, NULL);
        !           535: 
        !           536: // Create a Static window to label the combo box.
        !           537:    CreateWindow ("Static", "Available Groups",
        !           538:          WS_VISIBLE | WS_CHILD | WS_CLIPSIBLINGS | SS_LEFT,
        !           539:          rc.right - 200, 0, 190, lHeight - 2, hwnd, (HMENU) 0, ghModule, NULL);
        !           540: }/* end CreateChildren */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.