DIALOGS.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:40k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*--------------------------------------------------------------------------
  2.   Dialogs.c -- Cursors dialogs
  3.   Description:
  4.       This sample is spread across four files, each named for the role
  5.       the contained functions play.  Each file header contains a brief
  6.       description of its purpose and the routines it contains.
  7.       DIALOGS.C contains those routines used to display and manage
  8.       dialogs.  Those functions are:
  9.          AddEditControls - Dynamically create edit controls for UPDATE
  10.                         dialog
  11.          AddDlgProc      - Manage add row dialog
  12.          CenterDialog    - Center a dialog over its parent window
  13.          DoDialog        - Display a dialog
  14.          MyCreateDialog - Create a modeless dialog
  15.          GetEditControls - Retrieve values from dynamically created
  16.                         edit controls
  17.          IsMsgWaiting    - Check for waiting messages
  18.          AboutDlgProc    - Manage about box
  19.          AbsDlgProc      - Manage absolute row number dialog
  20.          DataDlgProc     - Manage large data display dialog
  21.          FindDlgProc    - Manager dialog to get text string to find in result set
  22.          RelDlgProc      - Manage relative row number dialog
  23.          StmtDlgProc     - Manage SQL statement dialog
  24.          UpdateDlgProc   - Manage update row dialog
  25.          SqlTablesDlgProc- handle SQLTables-type request
  26.          ClassOnCommand - handle a command message
  27.   This code is furnished on an as-is basis as part of the ODBC SDK and is
  28.   intended for example purposes only.
  29. --------------------------------------------------------------------------*/
  30. // Includes ----------------------------------------------------------------
  31. #include "headers.h"
  32. #include    "resource.h"
  33. #include "crsrdemo.h"
  34. const char szCREATE[] = "CREATE TABLE %s (id int NOT NULL, name char(31) NOT NULL, C3 int)";
  35. const char szDROP[]   = "DROP TABLE %s";
  36. const char szINSERT[] = "INSERT INTO %s VALUES (?, '-FakeTable-FakeTable-FakeTable-', NULL)";
  37. const int   xFIRST = 10;
  38. const int   cxSEP  = 6;
  39. const int   cySEP  = 3;
  40. const int   cxNAME = 35;
  41. const int   cyNAME = 8;
  42. const int   cxEDIT = 180;
  43. const int   cyEDIT = 10;
  44. const DWORD dwDLGSTYLE    = DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU;
  45. const DWORD dwSTATICSTYLE = WS_CHILD | WS_VISIBLE | SS_RIGHT;
  46. const DWORD dwEDITSTYLE   = WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL | ES_LEFT;
  47. #define STMTError(x) ODBCError(SQL_NULL_HENV, SQL_NULL_HDBC, lpmtbl->hstmt, (x))
  48. #define  USERDATA GWL_USERDATA
  49. // Types -------------------------------------------------------------------
  50. typedef struct tagMTBL {                  // Make table structure
  51.    SQLHSTMT hstmt;                        //   HSTMT in use
  52.    SDWORD   i;                            //   Rows inserted
  53. } MTBL, FAR *LPMTBL;
  54. // Prototypes --------------------------------------------------------------
  55. void INTFUNC AddEditControls(HWND, LPCHILD);
  56. void INTFUNC CenterDialog(HWND);
  57. BOOL INTFUNC GetEditControls(HWND, LPCHILD);
  58. BOOL INTFUNC IsMsgWaiting(HWND);
  59. BOOL INTFUNC DlgProcFilter(HWND, UINT, WPARAM, LPARAM);
  60. /* AddEditControls ---------------------------------------------------------
  61.    Description: Add one edit control for each updateable bound column to
  62.                 the dialog box
  63.                 --------------------------------------------------------------------------*/
  64. void INTFUNC AddEditControls(HWND hDlg, LPCHILD lpChild)
  65. {
  66. #define DLGX(x)   (((x) * LOWORD(dwBaseUnits)) / 4)
  67. #define DLGY(y)   (((y) * HIWORD(dwBaseUnits)) / 8)
  68.    HWND  hWnd;
  69.    HFONT hfont;
  70.    RECT  rc;
  71.    LPCOL lpcol;
  72.    char  sz[cbMAXSQL];
  73.    char  szFmt[cbSTRLEN];
  74.    DWORD dwBaseUnits;
  75.    UINT  idName, idEdit;
  76.    int      xName, yName;
  77.    int      cxName, cyName;
  78.    int      xEdit, yEdit;
  79.    int      cxEdit, cyEdit;
  80.    int      i;
  81.    HDC   hdc;
  82.    SIZE  size;
  83.    // Determine basic characteristics and start position in dialog
  84.    hfont = (HFONT)SendDlgItemMessage(hDlg, IDC_STATIC1,
  85.                                      WM_GETFONT, 0, 0L);
  86.    dwBaseUnits = GetDialogBaseUnits();
  87.    cxName = DLGX(cxNAME);
  88.    cyName = DLGY(cyNAME);
  89.    cxEdit = DLGX(cxEDIT);
  90.    cyEdit = DLGY(cyEDIT);
  91.    LoadString(g_hinst, IDS_COLNAME, szFmt, sizeof(szFmt));
  92.    // Calculate the size of the largest name label
  93.    hdc = GetDC(NULL);
  94.    if( hdc ) {
  95.       for( i = 0, lpcol = lpChild->lpcol; i < lpChild->ccol; i++, lpcol++ )
  96.          if( IsUpdateable(lpcol->fSqlType) ) {
  97.             wsprintf(sz, szFmt, lpcol->szName);
  98.             GetTextExtentPoint(hdc, sz, lstrlen(sz), &size);
  99.             if( size.cx > cxName )
  100.                cxName = size.cx;
  101.          }
  102.       ReleaseDC(NULL, hdc);
  103.    }
  104.    GetWindowRect(GetDlgItem(hDlg, IDOK), &rc);
  105.    xName = DLGX(xFIRST);
  106.    yName = (4 * DLGY(cySEP)) + (DLGY(cySEP) / 2) + (2 * (rc.bottom - rc.top));
  107.    xEdit = xName + cxName + DLGX(cxSEP);
  108.    idName = stc1;
  109.    idEdit = edt1;
  110.    // For each bound, updateable column, create and add an edit control
  111.    for (i=0, lpcol=lpChild->lpcol; i < lpChild->ccol; i++, lpcol++) {
  112.       if (IsUpdateable(lpcol->fSqlType)) {
  113.          // Create control label
  114.          wsprintf(sz, szFmt, lpcol->szName);
  115.          hWnd = CreateWindow(szSTATICCLASS, sz, dwSTATICSTYLE,
  116.                              xName, yName, cxName, cyName, hDlg,
  117.                              (HMENU)idName, g_hinst, NULL);
  118.          FORWARD_WM_SETFONT(hWnd, hfont, 0, SendMessage);
  119.          // Create (and intialize) edit control
  120.          yEdit = yName - ((cyEDIT - cyNAME) / 2);
  121.          GetCurrentValue(sz, lpcol, lpChild);
  122.          hWnd = CreateWindow(szEDITCLASS, sz, dwEDITSTYLE,
  123.                              xEdit, yEdit, cxEdit, cyEdit, hDlg,
  124.                              (HMENU)idEdit, g_hinst, NULL);
  125.          FORWARD_WM_SETFONT(hWnd, hfont, 0, SendMessage);
  126.          // Limit number of characters user can type to column display size
  127.          Edit_LimitText(hWnd, lpcol->cbc-1);
  128.          yName += cyEdit + DLGY(cySEP);
  129.          idName++;
  130.          idEdit++;
  131.       }
  132.    }
  133.    // Grow dialog so that all controls are visible
  134.    GetClientRect(hDlg, &rc);
  135.    rc.top    = 0;
  136.    rc.bottom = yName + DLGY(cySEP);
  137.    rc.left   = 0;
  138.    rc.right  = (2 * DLGX(xFIRST)) + DLGX(cxNAME) + DLGX(cxEDIT) + DLGX(cxSEP);
  139.    AdjustWindowRect(&rc, dwDLGSTYLE, FALSE);
  140.    MoveWindow(hDlg, 0, 0, rc.right - rc.left, rc.bottom - rc.top, TRUE);
  141.    // Place OK and Cancel buttons appropriately
  142.    GetClientRect(hDlg, &rc);
  143.    {  RECT  rcButton;
  144.       int      x, y;
  145.       GetWindowRect(GetDlgItem(hDlg, IDOK), &rcButton);
  146.       x = rc.right - DLGX(cxSEP) - (rcButton.right - rcButton.left);
  147.       y = DLGY(cySEP);
  148.       MoveWindow(GetDlgItem(hDlg, IDOK),
  149.                  x, y,
  150.                  rcButton.right - rcButton.left,
  151.                  rcButton.bottom - rcButton.top,
  152.                  TRUE);
  153.       y += rcButton.bottom - rcButton.top + (DLGY(cySEP) / 2);
  154.       GetWindowRect(GetDlgItem(hDlg, IDCANCEL), &rcButton);
  155.       MoveWindow(GetDlgItem(hDlg, IDCANCEL),
  156.                  x, y,
  157.                  rcButton.right - rcButton.left,
  158.                  rcButton.bottom - rcButton.top,
  159.                  TRUE);
  160.    }
  161.    return;
  162. }
  163. /* CenterDialog ------------------------------------------------------------
  164.    Description: Center dialog over its owning parent window
  165.                 If the entire dialog does not fit on the desktop,
  166.                 ensure upper left corner is always visible
  167.                 --------------------------------------------------------------------------*/
  168. void INTFUNC CenterDialog(HWND hDlg)
  169. {
  170.    RECT  rcDlg, rcScr, rcParent;
  171.    int      cx, cy;
  172.    GetWindowRect(hDlg, &rcDlg);
  173.    cx = rcDlg.right  - rcDlg.left;
  174.    cy = rcDlg.bottom - rcDlg.top;
  175.    GetWindowRect(GetParent(hDlg), &rcParent);
  176.    rcDlg.top    = rcParent.top +
  177.       (((rcParent.bottom - rcParent.top) - cy) >> 1);
  178.    rcDlg.left   = rcParent.left +
  179.       (((rcParent.right - rcParent.left) - cx) >> 1);
  180.    rcDlg.bottom = rcDlg.top  + cy;
  181.    rcDlg.right  = rcDlg.left + cx;
  182.    GetWindowRect(GetDesktopWindow(), &rcScr);
  183.    if (rcDlg.bottom > rcScr.bottom) {
  184.       rcDlg.bottom = rcScr.bottom;
  185.       rcDlg.top    = rcDlg.bottom - cy;
  186.    }
  187.    if (rcDlg.right  > rcScr.right) {
  188.       rcDlg.right = rcScr.right;
  189.       rcDlg.left  = rcDlg.right - cx;
  190.    }
  191.    if (rcDlg.left < 0) rcDlg.left = 0;
  192.    if (rcDlg.top  < 0) rcDlg.top  = 0;
  193.    MoveWindow(hDlg, rcDlg.left, rcDlg.top, cx, cy, FALSE);
  194.    return;
  195. }
  196. /* DoDialog ----------------------------------------------------------------
  197.    Description: Launch a dialog passing child window variables
  198.    --------------------------------------------------------------------------*/
  199. int INTFUNC DoDialog(HWND    hWndParent,
  200.                      int     nDlgResNum,
  201.                      DLGPROC lpDlgProc)
  202. {
  203.    HWND  hWnd;
  204.    LPCHILD  lpChild;
  205.    int      nRC;
  206.    hWnd    = FORWARD_WM_MDIGETACTIVE(g_hwndClient, SendMessage);
  207.    lpChild = (hWnd
  208.               ? (LPCHILD)GetWindowLong(hWnd, 0)
  209.               : NULL);
  210.    nRC = DialogBoxParam(g_hinst,
  211.                         MAKEINTRESOURCE(nDlgResNum),
  212.                         hWndParent,
  213.                         lpDlgProc,
  214.                         (LONG)lpChild);
  215.    return nRC;
  216. }
  217. /* MyCreateDialog ------------------------------------------------------------
  218.    Description: Launch a  modeless dialog passing child window variables
  219. --------------------------------------------------------------------------*/
  220. HWND INTFUNC MyCreateDialog(HWND    hWndParent,
  221.                             int     nDlgResNum,
  222.                             DLGPROC lpDlgProc)
  223. {
  224.    HWND  hWnd, hWndRet;
  225.    LPCHILD  lpChild;
  226.    hWnd    = FORWARD_WM_MDIGETACTIVE(g_hwndClient, SendMessage);
  227.    lpChild = (hWnd
  228.               ? (LPCHILD)GetWindowLong(hWnd, 0)
  229.               : NULL);
  230.    hWndRet = CreateDialogParam(g_hinst,
  231.                                MAKEINTRESOURCE(nDlgResNum),
  232.                                hWndParent,
  233.                                lpDlgProc,
  234.                                (LPARAM)lpChild);
  235.    return hWndRet;
  236. }
  237. /* GetEditControls ---------------------------------------------------------
  238.    Description: Get values from edit controls and move to row-set buffers
  239.    --------------------------------------------------------------------------*/
  240. BOOL INTFUNC GetEditControls(HWND hDlg, LPCHILD lpChild)
  241. {
  242.    LPCOL lpcol;
  243.    char  sz[cbMAXSQL];
  244.    UINT  idEdit;
  245.    BOOL  fChangeMade;
  246.    int      i;
  247.    fChangeMade = FALSE;
  248.    idEdit      = edt1;
  249.    // For each bound, updateable column, retrieve the value
  250.    for (i=0, lpcol=lpChild->lpcol; i < lpChild->ccol; i++, lpcol++) {
  251.       if (IsUpdateable(lpcol->fSqlType)) {
  252.          // Get the control value
  253.          SendDlgItemMessage(hDlg, idEdit, WM_GETTEXT,
  254.                             (WPARAM)sizeof(sz), (LPARAM)((LPSTR)sz));
  255.          // Move into row-set buffer
  256.          if (SetCurrentValue(sz, lpcol, lpChild) && !fChangeMade)
  257.             fChangeMade = TRUE;
  258.          idEdit++;
  259.       }
  260.    }
  261.    return fChangeMade;
  262. }
  263. /* IsMsgWaiting ------------------------------------------------------------
  264.    Description: Return TRUE if the Cancel button has been pressed
  265.    --------------------------------------------------------------------------*/
  266. BOOL INTFUNC IsMsgWaiting(HWND hWnd)
  267. {
  268.    MSG   msg;
  269.    UNREF_PARAM (hWnd);
  270.    // Check all waiting messages
  271.    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
  272.       // Process message
  273.       TranslateMessage(&msg);
  274.       DispatchMessage(&msg);
  275.       // Return TRUE if the Cancel button was pressed
  276.       if ((msg.message == WM_COMMAND
  277.            && GET_WM_COMMAND_ID(msg.wParam, msg.lParam) == IDCANCEL)
  278.           || msg.message == WMU_CANCEL)
  279.          return TRUE;
  280.    }
  281.    return FALSE;
  282. }
  283. /* OptionsDlgProc ----------------------------------------------------------
  284.    Description: handle options dialog
  285. ----------------------------------------------------------------------------*/
  286. BOOL EXPFUNC OptionsDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
  287. {
  288.    switch (msg) {
  289.      case WM_INITDIALOG:
  290.       CenterDialog(hDlg);
  291.       SetWindowLong(hDlg, USERDATA, (LONG)lParam);
  292.       InitializeDialogControls(hDlg, (LPCHILD) lParam);
  293.       return TRUE;
  294.      case WM_COMMAND:
  295.       (void) HANDLE_WM_COMMAND(hDlg,wParam,lParam,ClassOnCommand);
  296.       break;
  297.       // New option dialog selected
  298.      case WMU_NEWOPTION:
  299.       {
  300.          LPCHILD  lpChild = (LPCHILD) GetWindowLong(hDlg, USERDATA);
  301.          if (g_hwndChildDialog)
  302.             DestroyWindow(g_hwndChildDialog);
  303.          g_hwndChildDialog = MyCreateDialog(hDlg,
  304.                                             (int) lParam,
  305.                                             ChildOptDlgProc);
  306.          SetFocus(GetDlgItem(hDlg, IDC_OPTIONLIST));
  307.          break;
  308.       }
  309.       // Set title of option area
  310.      case WMU_SETSUBTEXT:
  311.       {
  312.          char  szBuffer[1000];
  313.          ListBox_GetText(GetDlgItem(hDlg, wParam),
  314.                          ListBox_GetCurSel(GetDlgItem(hDlg,wParam)),
  315.                          szBuffer);
  316.          Static_SetText( GetDlgItem(hDlg, IDC_OPTIONAREA_TITLE),
  317.                         szBuffer);
  318.          break;
  319.       }
  320.    }
  321.    return DlgProcFilter(hDlg, msg, wParam, lParam);
  322. }
  323. /* ChildOptDlgProc --------------------------------------------------------
  324.    Description: handle generic dialog
  325. ----------------------------------------------------------------------------*/
  326. BOOL EXPFUNC ChildOptDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
  327. {
  328.    switch (msg) {
  329.      case WM_INITDIALOG:
  330.       SetWindowLong(hDlg, USERDATA, (LONG)lParam);
  331.       InitializeDialogControls(hDlg, (LPCHILD) lParam);
  332.       // Align the window to a hidden static in the parent
  333.       (void) AlignToControl(hDlg, GetParent(hDlg), IDC_OPTION_WINPOS);
  334.       return TRUE;
  335.      case WM_COMMAND:
  336.       return (BOOL)HANDLE_WM_COMMAND(hDlg,wParam,lParam,ClassOnCommand);
  337.    }
  338.    return DlgProcFilter(hDlg, msg, wParam, lParam);
  339. }
  340. /* AboutDlgProc ------------------------------------------------------------
  341.    Description: Display about box
  342.    --------------------------------------------------------------------------*/
  343. BOOL EXPFUNC AboutDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
  344. {
  345.    UNREF_PARAM (lParam);
  346.    switch (msg) {
  347.      case WM_INITDIALOG:
  348.       CenterDialog(hDlg);
  349.       return TRUE;
  350.      case WM_COMMAND:
  351.       if (GET_WM_COMMAND_ID(wParam, lParam) == IDOK
  352.           || GET_WM_COMMAND_ID(wParam, lParam) == IDCANCEL) {
  353.          EndDialog(hDlg, GET_WM_COMMAND_ID(wParam, lParam));
  354.          return TRUE;
  355.       }
  356.       break;
  357.    }
  358.    return DlgProcFilter(hDlg, msg, wParam, lParam);
  359. }
  360. /* AbsDlgProc --------------------------------------------------------------
  361.    Description: Get absolute row number to fetch
  362.    --------------------------------------------------------------------------*/
  363. BOOL EXPFUNC AbsDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
  364. {
  365.    LPCHILD  lpChild;
  366.    char  sz[11];
  367.    char  *EndPtr;
  368.    SDWORD   arow;
  369.    lpChild = (LPCHILD)GetWindowLong(hDlg, USERDATA);
  370.    switch (msg) {
  371.      case WM_INITDIALOG:
  372.       CenterDialog(hDlg);
  373.       lpChild = (LPCHILD)lParam;
  374.       SetWindowLong(hDlg, USERDATA, (LONG)lpChild);
  375.       wsprintf(sz, "%ld", lpChild->arow);
  376.       SetWindowText(GetDlgItem(hDlg, IDC_EDIT1), sz);
  377.       SendDlgItemMessage(hDlg, IDC_EDIT1,
  378.                          EM_LIMITTEXT, sizeof(sz)-1, 0L);
  379.       return TRUE;
  380.      case WM_COMMAND:
  381.       switch (GET_WM_COMMAND_ID(wParam, lParam)) {
  382.         case IDOK:
  383.          GetWindowText(GetDlgItem(hDlg, IDC_EDIT1), sz, sizeof(sz));
  384.          arow = strtol((char*) sz, &EndPtr, 10);
  385.          for (; *EndPtr &&
  386.               ISWHITE(*EndPtr); EndPtr = AnsiNext(EndPtr));
  387.          // the number inputed is within '0' to '9' or + or -
  388.          if (*EndPtr != '') {
  389.             MessageBox(hDlg,
  390.                        "Invalid absolute row number",
  391.                        NULL,
  392.                        MB_ICONSTOP);
  393.             return TRUE;
  394.          }
  395.          lpChild->arow = arow;
  396.         case IDCANCEL:
  397.          EndDialog(hDlg, GET_WM_COMMAND_ID(wParam, lParam));
  398.          return TRUE;
  399.       }
  400.       break;
  401.    }
  402.    return DlgProcFilter(hDlg, msg, wParam, lParam);
  403. }
  404. /* DataDlgProc -------------------------------------------------------------
  405.    Description: Display large data value (retrieved via SQLGetData)
  406.    --------------------------------------------------------------------------*/
  407. BOOL EXPFUNC DataDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
  408. {
  409.    switch (msg) {
  410.      case WM_INITDIALOG: {
  411.         LPBIGCOL  lpbc;
  412.         char      sz[cbSTRLEN];
  413.         char      szNum[cbSTRLEN];
  414.         char      szFmt[cbSTRLEN];
  415.         CenterDialog(hDlg);
  416.         lpbc = (LPBIGCOL)lParam;
  417.         if (lpbc->cb == SQL_NULL_DATA) {
  418.            lstrcpy(lpbc->lpsz, g_szNull);
  419.            lpbc->cb = 0;
  420.            _ltoa(0, szNum, 10);
  421.         }
  422.         else if (lpbc->cb == SQL_NO_TOTAL)
  423.            lstrcpy(szNum, g_szUnknown);
  424.         else
  425.            _ltoa(lpbc->cb, szNum, 10);
  426.         LoadString(g_hinst, IDS_DATADLG, szFmt, sizeof(szFmt));
  427.         wsprintf(sz, szFmt, lpbc->szName, szNum);
  428.         SetWindowText(GetDlgItem(hDlg, IDC_TEXT1), sz);
  429.         SetWindowText(GetDlgItem(hDlg, IDC_EDIT1), lpbc->lpsz);
  430.         return TRUE;
  431.      }
  432.      case WM_COMMAND:
  433.       switch (GET_WM_COMMAND_ID(wParam, lParam)) {
  434.         case IDOK:
  435.         case IDCANCEL:
  436.          EndDialog(hDlg, GET_WM_COMMAND_ID(wParam, lParam));
  437.          return TRUE;
  438.       }
  439.       break;
  440.    }
  441.    return DlgProcFilter(hDlg, msg, wParam, lParam);
  442. }
  443. /* RelDlgProc --------------------------------------------------------------
  444.    Description: Get relative row offset to fetch
  445.    --------------------------------------------------------------------------*/
  446. BOOL EXPFUNC RelDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
  447. {
  448.    LPCHILD  lpChild;
  449.    char  sz[7];
  450.    lpChild = (LPCHILD)GetWindowLong(hDlg, USERDATA);
  451.    switch (msg) {
  452.      case WM_INITDIALOG:
  453.       CenterDialog(hDlg);
  454.       lpChild = (LPCHILD)lParam;
  455.       SetWindowLong(hDlg, USERDATA, (LONG)lpChild);
  456.       wsprintf(sz, "%ld", lpChild->rrow);
  457.       SetWindowText(GetDlgItem(hDlg, IDC_EDIT1), sz);
  458.       SendDlgItemMessage(hDlg, IDC_EDIT1,
  459.                          EM_LIMITTEXT, sizeof(sz)-1, 0L);
  460.       return TRUE;
  461.      case WM_COMMAND:
  462.       switch (GET_WM_COMMAND_ID(wParam, lParam)) {
  463.         case IDOK: {
  464.            SDWORD rrow;
  465.            char   *EndPtr;
  466.            GetWindowText(GetDlgItem(hDlg, IDC_EDIT1), sz, sizeof(sz));
  467.            rrow = strtol((char*) sz, &EndPtr, 10);
  468.            for (; *EndPtr &&
  469.                 ISWHITE(*EndPtr); EndPtr = AnsiNext(EndPtr));
  470.            // the number inputed is within '0' to '9' or + or -
  471.            if (*EndPtr != '' || rrow < -100000 || rrow > 100000) {
  472.               MessageBox(hDlg,
  473.                          "Step amount must be between -100,000 and 100,000",
  474.                          NULL,
  475.                          MB_ICONSTOP);
  476.               return TRUE;
  477.            }
  478.            lpChild->rrow = rrow;
  479.         }
  480.         case IDCANCEL:
  481.          EndDialog(hDlg, GET_WM_COMMAND_ID(wParam, lParam));
  482.          return TRUE;
  483.       }
  484.       break;
  485.    }
  486.    return DlgProcFilter(hDlg, msg, wParam, lParam);
  487. }
  488. /* StmtDlgProc -------------------------------------------------------------
  489.    Description: Get SQL statement to execute
  490.    --------------------------------------------------------------------------*/
  491. BOOL EXPFUNC StmtDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
  492. {
  493.    LPCHILD  lpChild;
  494.    lpChild = (LPCHILD)GetWindowLong(hDlg, USERDATA);
  495.    switch (msg) {
  496.      case WM_INITDIALOG:
  497.       CenterDialog(hDlg);
  498.       lpChild = (LPCHILD)lParam;
  499.       SetWindowLong(hDlg, USERDATA, (LONG)lpChild);
  500.       SetWindowText(GetDlgItem(hDlg, IDC_EDIT1), lpChild->sql);
  501.       SendDlgItemMessage(hDlg, IDC_EDIT1, EM_LIMITTEXT, cbMAXSQL-1, 0L);
  502.       return TRUE;
  503.      case WM_COMMAND:
  504.       switch (GET_WM_COMMAND_ID(wParam, lParam)) {
  505.         case IDOK:
  506.          GetWindowText(GetDlgItem(hDlg, IDC_EDIT1),
  507.                        lpChild->sql, cbMAXSQL);
  508.          lpChild->dwOperation = OPER_SELECT;
  509.         case IDCANCEL:
  510.          EndDialog(hDlg, wParam);
  511.          return TRUE;
  512.       }
  513.       break;
  514.    }
  515.    return DlgProcFilter(hDlg, msg, wParam, lParam);
  516. }
  517. /* UpdateDlgProc -----------------------------------------------------------
  518.    Description: Get new values with which to update the current row
  519.    --------------------------------------------------------------------------*/
  520. BOOL EXPFUNC UpdateDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
  521. {
  522.    LPCHILD  lpChild;
  523.    lpChild = (LPCHILD)GetWindowLong(hDlg, USERDATA);
  524.    switch (msg) {
  525.       // Build dialog dynamically, adding appropriate edit controls
  526.      case WM_INITDIALOG:
  527.       lpChild = (LPCHILD)lParam;
  528.       SetWindowLong(hDlg, USERDATA, (LONG)lpChild);
  529.       AddEditControls(hDlg, lpChild);
  530.       SendDlgItemMessage(hDlg,edt1,EM_SETSEL,GET_EM_SETSEL_MPS(0, -1));
  531.       CenterDialog(hDlg);
  532.       SetFocus(GetDlgItem(hDlg, edt1));
  533.       return FALSE;
  534.       // Close dialog updating row-set buffer (if OK) with new values
  535.      case WM_COMMAND:
  536.       switch (GET_WM_COMMAND_ID(wParam, lParam)) {
  537.         case IDOK:
  538.          if (!GetEditControls(hDlg, lpChild))
  539.             GET_WM_COMMAND_ID(wParam, lParam) = IDCANCEL;
  540.         case IDCANCEL:
  541.          EndDialog(hDlg, GET_WM_COMMAND_ID(wParam, lParam));
  542.          return TRUE;
  543.       }
  544.       break;
  545.    }
  546.    return DlgProcFilter(hDlg, msg, wParam, lParam);
  547. }
  548. /* FindDlgProc -------------------------------------------------------------
  549.    Description: Get text string to find in result set
  550.    --------------------------------------------------------------------------*/
  551. BOOL EXPFUNC FindDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
  552. {
  553.    LPCHILD  lpChild;
  554.    lpChild = (LPCHILD)GetWindowLong(hDlg, USERDATA);
  555.    switch (msg) {
  556.      case WM_INITDIALOG:
  557.       CenterDialog(hDlg);
  558.       lpChild = (LPCHILD)lParam;
  559.       SetWindowLong(hDlg, USERDATA, (LONG)lpChild);
  560.       SetWindowText(GetDlgItem(hDlg, IDC_EDIT1), lpChild->sql);
  561.       SendDlgItemMessage(hDlg, IDC_EDIT1, EM_LIMITTEXT, cbMAXSQL-1, 0L);
  562.       return TRUE;
  563.      case WM_COMMAND:
  564.       switch (GET_WM_COMMAND_ID(wParam, lParam)) {
  565.         case IDOK:
  566.          GetWindowText(GetDlgItem(hDlg, IDC_EDIT1),
  567.                        lpChild->sql, cbMAXSQL);
  568.         case IDCANCEL:
  569.          EndDialog(hDlg, wParam);
  570.          return TRUE;
  571.       }
  572.       break;
  573.    }
  574.    return DlgProcFilter(hDlg, msg, wParam, lParam);
  575. }
  576. /*---------------------------------------------------------------------------
  577. ** SQLTablesDlgProc -- get information for SQLTables and similar functions
  578. ----------------------------------------------------------------------------*/
  579. BOOL EXPFUNC SQLTablesDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
  580. {
  581.    LPCHILD  lpChild;
  582.    lpChild = (LPCHILD)GetWindowLong(hDlg, USERDATA);
  583.    switch (msg) {
  584.      case WM_INITDIALOG:
  585.       CenterDialog(hDlg);
  586.       lpChild = (LPCHILD)lParam;
  587.       SetWindowLong(hDlg, USERDATA, (LONG)lpChild);
  588.       // Set the default button
  589.       if (!(lpChild->dwGuiFlags & GUIF_TABLES_RADIO)) {
  590.          lpChild->dwOperation = IDC_TABLE_RAD_TABLE;
  591.          lpChild->dwRadioButton = IDC_TABLE_RAD_TABLE;
  592.       }
  593.       // Set the dialog up
  594.       ControlValue(  lpChild,
  595.                    hDlg,
  596.                    GetDlgItem(hDlg,lpChild->dwRadioButton),
  597.                    lpChild->dwRadioButton,
  598.                    ACT_INIT);
  599.       ControlValue(  lpChild,
  600.                    hDlg,
  601.                    GetDlgItem(hDlg,lpChild->dwRadioButton),
  602.                    lpChild->dwRadioButton,
  603.                    ACT_TRIGGER);
  604.       ControlValue(  lpChild,
  605.                    hDlg,
  606.                    GetDlgItem(hDlg,IDC_TABLEINFO_QUALIFIER),
  607.                    IDC_TABLEINFO_QUALIFIER,
  608.                    ACT_INIT);
  609.       ControlValue(  lpChild,
  610.                    hDlg,
  611.                    GetDlgItem(hDlg,IDC_TABLEINFO_NAME),
  612.                    IDC_TABLEINFO_NAME,
  613.                    ACT_INIT);
  614.       ControlValue(  lpChild,
  615.                    hDlg,
  616.                    GetDlgItem(hDlg,IDC_TABLEINFO_OWNER),
  617.                    IDC_TABLEINFO_OWNER,
  618.                    ACT_INIT);
  619.       ControlValue(  lpChild,
  620.                    hDlg,
  621.                    GetDlgItem(hDlg,IDC_TABLEINFO_TYPE),
  622.                    IDC_TABLEINFO_TYPE,
  623.                    ACT_INIT);
  624.       ControlValue(  lpChild,
  625.                    hDlg,
  626.                    GetDlgItem(hDlg,IDC_TABLEINFO_COLNAME),
  627.                    IDC_TABLEINFO_COLNAME,
  628.                    ACT_INIT);
  629.       return TRUE;
  630.      case WM_COMMAND:
  631.       return (BOOL)HANDLE_WM_COMMAND(hDlg, wParam, lParam, ClassOnCommand);
  632.       break;
  633.    }
  634.    return DlgProcFilter(hDlg, msg, wParam, lParam);
  635. }
  636. /*---ClassCommand---------------------------------------------------------
  637.    Filters commands for dialogs.   Forwards those messages that we think
  638.    are interesting to a handler that processes the events.
  639. ---------------------------------------------------------------------------*/
  640. VOID INTFUNC ClassOnCommand(HWND hWnd, int iId, HWND hWndCtl, UINT uNotify)
  641. {
  642.    LPCHILD  lpChild;
  643.    lpChild = (LPCHILD)GetWindowLong(hWnd,USERDATA);
  644.    if (!(lpChild))
  645.       return;
  646.    switch (uNotify) {
  647.      case   BN_CLICKED:       // button control selected
  648.      case   EN_UPDATE:        // edit box has been updated
  649.      case   LBN_SELCHANGE:       // listbox has gotten a message
  650.       ControlValue(lpChild, hWnd, hWndCtl, iId, ACT_TRIGGER);
  651.       break;
  652.    }
  653. }
  654. /*
  655.  ** ControlValue -- Initialize a control's value from the child's state, or
  656.  **               set the child's state from the control.   All control-
  657.  **               specific logic should go here.
  658.  **
  659.  ** Parameters:
  660.  **      lpChild  -- child state
  661.  **      hDlg  --  id of the active dialog
  662.  **      hCtl  --  control's window
  663.  **      iId      --  control's id
  664.  **      iAction  -- Action to take -- ACT_INIT or ACT_TRIGGER
  665.  **
  666.  ** No return value
  667.  */
  668. VOID INTFUNC ControlValue (LPCHILD     lpChild,
  669.                            HWND     hDlg,
  670.                            HWND     hCtl,
  671.                            int         iId,
  672.                            int         iAction)
  673. {
  674.    int      iLbSelection;
  675.    DWORD dwListData;
  676.    BOOL  fTemp;
  677.    UCHAR szBuffer[MAXNAME];
  678.    const DIALOG_PAIR dpOptList[] = {
  679.       {"Binding",          IDD_BIND_OPTIONS},
  680.       {"General options",     IDD_GENERAL_OPTIONS},
  681.       {"Scrolling Options",   IDD_SCROLLING_OPTIONS},
  682.       {"Concurrency Options", IDD_CONCURRENCY_OPTIONS}};
  683.    switch (iId) {
  684.      case   IDOK:                   // generic OK
  685.      case   IDCANCEL:                  // generic CANCEL
  686.       if (iAction == ACT_TRIGGER) {
  687.          if (g_hwndChildDialog) {
  688.             g_hwndChildDialog = NULL;
  689.          }
  690.          EndDialog(hDlg, iId);
  691.       }
  692.       break;
  693.      case IDC_RADIO_BINDROW:
  694.      case IDC_RADIO_BINDCOL:
  695.       if (SetOrGetCheck(hCtl, iAction, (iId == lpChild->fBindByRow))) {
  696.          lpChild->fBindByRow = iId;
  697.       }
  698.       break;
  699.      case IDC_RADIO_READONLY:
  700.       if (SetOrGetCheck(hCtl, iAction,
  701.                         (lpChild->fConcurrency == SQL_CONCUR_READ_ONLY))) {
  702.          lpChild->fConcurrency = SQL_CONCUR_READ_ONLY;
  703.       }
  704.       break;
  705.      case IDC_RADIO_LOCKING:
  706.       if (SetOrGetCheck(hCtl, iAction,
  707.                         (lpChild->fConcurrency == SQL_CONCUR_LOCK))) {
  708.          lpChild->fConcurrency = SQL_CONCUR_LOCK;
  709.       }
  710.       break;
  711.      case IDC_RADIO_OPTIMISTIC:
  712.       if (SetOrGetCheck(hCtl, iAction,
  713.                         (lpChild->fConcurrency == SQL_CONCUR_ROWVER))) {
  714.          lpChild->fConcurrency = SQL_CONCUR_ROWVER;
  715.       }
  716.       break;
  717.      case IDC_RADIO_OPTIMVALUE:
  718.       if (SetOrGetCheck(hCtl, iAction,
  719.                         (lpChild->fConcurrency == SQL_CONCUR_VALUES))) {
  720.          lpChild->fConcurrency = SQL_CONCUR_VALUES;
  721.       }
  722.       break;
  723.      case IDC_RADIO_FORWARD:
  724.       if (SetOrGetCheck(hCtl, iAction,
  725.                         (lpChild->crowKeyset == SQL_CURSOR_FORWARD_ONLY))) {
  726.          lpChild->crowKeyset = SQL_CURSOR_FORWARD_ONLY;
  727.       }
  728.       break;
  729.      case IDC_RADIO_SNAPSHOT:
  730.       if (SetOrGetCheck(hCtl, iAction,
  731.                         (lpChild->crowKeyset == SQL_CURSOR_STATIC))) {
  732.          lpChild->crowKeyset = SQL_CURSOR_STATIC;
  733.       }
  734.       break;
  735.      case IDC_RADIO_KEYSET:
  736.       if (SetOrGetCheck(hCtl, iAction,
  737.                         (lpChild->crowKeyset == SQL_CURSOR_KEYSET_DRIVEN))) {
  738.          lpChild->crowKeyset = SQL_CURSOR_KEYSET_DRIVEN;
  739.       }
  740.       break;
  741.      case IDC_RADIO_DYNAMIC:
  742.       if (SetOrGetCheck(hCtl, iAction,
  743.                         (lpChild->crowKeyset == SQL_CURSOR_DYNAMIC))) {
  744.          lpChild->crowKeyset = SQL_CURSOR_DYNAMIC;
  745.       }
  746.       break;
  747.      case IDC_CHECK_BINDALL:
  748.       fTemp = SetOrGetCheck(hCtl,iAction, (lpChild->fBindAll));
  749.       lpChild->fBindAll = fTemp;
  750.       Edit_Enable(GetDlgItem(hDlg,IDC_EDIT_BIND), !(fTemp));
  751.       Static_Enable(GetDlgItem(hDlg, IDC_STATIC_NBIND), !(fTemp));
  752.       break;
  753.      case IDC_EDIT_BIND:
  754.       if (lpChild->fBind)
  755.          wsprintf((LPSTR)szBuffer,"%s", lpChild->szBind);
  756.       else  wsprintf((LPSTR)szBuffer,"%u", lpChild->cBind);
  757.       SetOrGetEditArray(hCtl, szBuffer, iAction);
  758.       if (iAction == ACT_TRIGGER) {
  759.          lpChild->fBind = TRUE;
  760.          strncpy(lpChild->szBind, szBuffer, cbINTLEN);
  761.          lpChild->szBind[cbINTLEN-1] = '';
  762.       }
  763.       break;
  764.      case IDC_EDIT_ROWSETSIZE:
  765.       if (lpChild->fRowset)
  766.          wsprintf((LPSTR)szBuffer,"%s", lpChild->szRowset);
  767.       else wsprintf((LPSTR)szBuffer,"%u", lpChild->crowRowset);
  768.       SetOrGetEditArray(hCtl, szBuffer, iAction);
  769.       if (iAction == ACT_TRIGGER) {
  770.          lpChild->fRowset = TRUE;
  771.          strncpy(lpChild->szRowset, szBuffer, cbINTLEN);
  772.          lpChild->szRowset[cbINTLEN-1] = '';
  773.       }
  774.       break;
  775.      case IDC_MAXCOL:
  776.       if (lpChild->fMaxBind)
  777.          wsprintf((LPSTR)szBuffer, "%s", lpChild->szMaxBind);
  778.       else wsprintf((LPSTR)szBuffer, "%ld", lpChild->crowMaxBind);
  779.       SetOrGetEditArray(hCtl, szBuffer, iAction);
  780.       if (iAction == ACT_TRIGGER) {
  781.          lpChild->fMaxBind = TRUE;
  782.          strncpy(lpChild->szMaxBind, szBuffer, cbINTLEN);
  783.          lpChild->szMaxBind[cbINTLEN-1] = '';
  784.       }
  785.       break;
  786.      case IDC_TABLE_RAD_STATISTICS:       // TABLEINFO->STATSTICS
  787.      case IDC_TABLE_RAD_COLUMN:           // TABLEINFO->COLUMNS
  788.      case IDC_TABLE_RAD_PRIV:          // TABLEINFO->PRIVILEGES
  789.      case IDC_TABLE_RAD_PROC:          // TABLEINFO->PROCEDURES
  790.      case IDC_TABLE_RAD_TABLE:            // TABLEINFO->TABLES
  791.       // Initialize the button, or set iAction to its value
  792.       // Hide any fields not related to the button, show fields related
  793.       if( SetOrGetCheck(hCtl, iAction,
  794.                         (iId == (int)lpChild->dwRadioButton)) )
  795.          lpChild->dwOperation = (UWORD) iId;
  796.       if (iAction == ACT_TRIGGER) {
  797.          lpChild->dwGuiFlags |= GUIF_TABLES_RADIO;
  798.          lpChild->dwRadioButton = iId;
  799.          (void) SetHiddenFields(hDlg, iId);
  800.       }
  801.       break;
  802.      case IDC_CHECK_FETCH:
  803.       if (SetOrGetCheck(hCtl, iAction, (int)IS_ALLWFETCH(lpChild)))
  804.          lpChild->dwGuiFlags |= GUIF_ALWAYSFETCH;
  805.       else
  806.          lpChild->dwGuiFlags &= ~GUIF_ALWAYSFETCH;
  807.       break;
  808.      case IDC_CHECK_ASYNC:
  809.       lpChild->fAsync = SetOrGetCheck(hCtl,iAction,lpChild->fAsync);
  810.       break;
  811.      case IDC_TABLEINFO_QUALIFIER:        // TABLEINFO->QUALIFIER
  812.       SetOrGetEditArray(hCtl, lpChild->szQualifier, iAction);
  813.       break;
  814.      case IDC_TABLEINFO_NAME:          // TABLEINFO->NAME
  815.       SetOrGetEditArray(hCtl, lpChild->szTable, iAction);
  816.       break;
  817.      case IDC_TABLEINFO_OWNER:            // TABLEINFO->OWNER
  818.       SetOrGetEditArray(hCtl, lpChild->szUser, iAction);
  819.       break;
  820.      case IDC_TABLEINFO_TYPE:          // TABLEINFO->TYPE
  821.       SetOrGetEditArray(hCtl, lpChild->szType, iAction);
  822.       break;
  823.      case IDC_TABLEINFO_COLNAME:          // TABLEINFO->COLUMN NAME
  824.       SetOrGetEditArray(hCtl, lpChild->szColName, iAction);
  825.       break;
  826.      case IDC_OPTIONLIST:              // OPTIONS->options
  827.       {
  828.          if (iAction == ACT_INIT) {
  829.             InitializeListBox(hDlg,
  830.                               IDC_OPTIONLIST,
  831.                               &dpOptList[0],
  832.                               sizeof(dpOptList) / sizeof(DIALOG_PAIR),
  833.                               IDD_GENERAL_OPTIONS);
  834.          }
  835.          // Get the title and data for the currently-selected list box
  836.          iLbSelection = ListBox_GetCurSel(hCtl);
  837.          dwListData   = ListBox_GetItemData(hCtl, iLbSelection);
  838.          SendMessage(hDlg,WMU_NEWOPTION, iLbSelection,(LPARAM)dwListData);
  839.          SendMessage(hDlg,WMU_SETSUBTEXT,iId, 0);
  840.          break;
  841.       }
  842.    }
  843. }
  844. /*
  845. ** SetOrGetCheck      -- set a value based upon a button action, or set a
  846. **                 check button if the action is equal to a value
  847. **                 Also used for radios
  848. **
  849. ** Parameters:
  850. **    hCtl     -- control handle
  851. **    iAction     -- ACT_INIT or ACT_TRIGGER
  852. **    bEqual      -- Initialization -- should value be set?
  853. **
  854. ** Returns:
  855. **    TRUE if checkbox is now set
  856. */
  857. INLINE BOOL SetOrGetCheck(
  858.                           HWND   hCtl,
  859.                           int    iAction,
  860.                           BOOL   bEqual)
  861. {
  862.    if (iAction == ACT_INIT) {
  863.       Button_SetCheck(hCtl, bEqual);
  864.       return bEqual;
  865.    }
  866.    if (iAction == ACT_TRIGGER) {
  867.       Button_SetCheck(hCtl, Button_GetCheck(hCtl));
  868.       return Button_GetCheck(hCtl);
  869.    }
  870.    return FALSE;
  871. }
  872. /*
  873. ** SetOrGetEditArray -- set the value of an array from an edit control, or
  874. **                set the edit control from the array  (inline)
  875. **
  876. ** Parameters:
  877. **    hCtl  -- control
  878. **    lpStr -- string
  879. **    iAction  -- ACT_INIT or ACT_TRIGGER
  880. **
  881. ** Notes:   Assumes lpStr is MAXNAME bytes long
  882. */
  883. INLINE VOID SetOrGetEditArray(
  884.                               HWND  hCtl,
  885.                               UCHAR FAR *lpStr,
  886.                               int      iAction)
  887. {
  888.    if (iAction == ACT_INIT)
  889.       Edit_SetText(hCtl, (LPSTR)lpStr);
  890.    else
  891.       if (iAction == ACT_TRIGGER)
  892.          Edit_GetText(hCtl, (LPSTR)lpStr, MAXNAME - 1);
  893. }
  894. /*
  895. ** SetHiddenFields -- show or hide hidden fields in a dialog box, depending
  896. **               upon the action taken.
  897. **
  898. ** Parameters:
  899. **    hDlg  -- dialog we are dealing with
  900. **    iAct  -- action
  901. **
  902. */
  903. BOOL    INTFUNC SetHiddenFields(
  904.                                 HWND   hWnd,
  905.                                 int    iAct)
  906. {
  907.    HWND  hTTag, hCol;
  908.    HWND  hType, hCTag;
  909.    // Get handles for all of the windows we want to deal with
  910.    hTTag = GetDlgItem(hWnd, IDC_TYPETAG);
  911.    hCol  = GetDlgItem(hWnd, IDC_COLTAG);
  912.    hType = GetDlgItem(hWnd, IDC_TABLEINFO_TYPE);
  913.    hCTag = GetDlgItem(hWnd, IDC_TABLEINFO_COLNAME);
  914.    if (hType) {
  915.       Edit_Enable(hType, (iAct == IDC_TABLE_RAD_TABLE)  ? 1 : 0);
  916.       ShowWindow(hType,  (iAct == IDC_TABLE_RAD_TABLE)  ? SW_SHOW : SW_HIDE);
  917.       ShowWindow(hTTag,  (iAct == IDC_TABLE_RAD_TABLE)  ? SW_SHOW : SW_HIDE);
  918.       Edit_Enable(hCTag, (iAct == IDC_TABLE_RAD_COLUMN) ? 1 : 0);
  919.       ShowWindow(hCol,   (iAct == IDC_TABLE_RAD_COLUMN) ? SW_SHOW : SW_HIDE);
  920.       ShowWindow(hCTag,  (iAct == IDC_TABLE_RAD_COLUMN) ? SW_SHOW : SW_HIDE);
  921.       return TRUE;
  922.    }
  923.    return FALSE;
  924. }
  925. /*
  926.  **   InitializeListBox -- initialize a listbox from a DIALOG_PAIR
  927.  **                     structure.
  928.  **
  929.  **  Parameters:
  930.  **      hWnd     --  window the list box lives in
  931.  **      lbId     --  resource id of the list box
  932.  **      dpOptList   --  pointer to option list structure
  933.  **      iEntries --  number of entries in the list box
  934.  **      iDefId      --  default to select
  935.  **
  936.  **
  937.  **  Returns:  FALSE
  938.  **
  939.  */
  940. BOOL INTFUNC InitializeListBox(
  941.    HWND                    hWnd,
  942.    int                     lbId,
  943.    const DIALOG_PAIR FAR   *dpOptList  ,
  944.    int                     iEntries,
  945.    int                     iDefId)
  946. {
  947.    int            iDlg, iIndex;
  948.    HWND        hOptionBox;
  949.    LPSTR       szDefaultTitle;
  950.    hOptionBox  =  GetDlgItem(hWnd, lbId);
  951.    for (iDlg = 0; iDlg < iEntries; iDlg++) {
  952.       iIndex = ListBox_AddString(hOptionBox,
  953.                                  dpOptList[iDlg].szDlgPairTitle);
  954.       ListBox_SetItemData(hOptionBox,
  955.                           iIndex,
  956.                           dpOptList[iDlg].iDlgPairDlgId);
  957.       if (iDefId == dpOptList[iDlg].iDlgPairDlgId) {
  958.          szDefaultTitle = dpOptList[iDlg].szDlgPairTitle;
  959.       }
  960.    }
  961.    ListBox_SetCurSel(hOptionBox,
  962.                      ListBox_FindStringExact(hOptionBox, 0, szDefaultTitle));
  963.    return FALSE;
  964. }
  965. /*
  966. ** InitializeDialogControls   -- Initialize all of the controls in a dialog
  967. **                      from the lpchild structure.   Callback function.
  968. **
  969. ** Parameters:
  970. **    hDlg     -- dialog handle
  971. **    lpChild     -- state structure
  972. **
  973. */
  974. VOID INTFUNC InitializeDialogControls(
  975.                                       HWND   hDlg,
  976.                                       LPCHILD   lpChild)
  977. {
  978.    FARPROC     ControlInstance = MakeProcInstance((FARPROC)InitControlCallback,
  979.                                                   g_hinst);
  980.    EnumChildWindows(hDlg, (WNDENUMPROC)ControlInstance, (LPARAM)lpChild);
  981.    FreeProcInstance(ControlInstance);
  982. }
  983. /*
  984. ** InitControlCallback  -- callback function for initializing controls
  985. **
  986. ** Parameters:
  987. **    hwndChild   -- child window handle
  988. **    lParam      -- lparam (lpChild from EnumChildProc
  989. */
  990. BOOL CALLBACK InitControlCallback(
  991.                                   HWND hwndChild,
  992.                                   LPARAM  lParam)
  993. {
  994.    int      iControl= GetDlgCtrlID(hwndChild);
  995.    if (iControl) {
  996.       ControlValue((LPCHILD) lParam,
  997.                    GetParent(hwndChild),
  998.                    hwndChild,
  999.                    iControl,
  1000.                    ACT_INIT);
  1001.    }
  1002.    return TRUE;
  1003. }
  1004. BOOL INTFUNC DlgProcFilter(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
  1005. {
  1006.    switch (msg) {
  1007.      case WM_SETTEXT:
  1008.      case WM_NCPAINT:
  1009.      case WM_NCACTIVATE:
  1010.       SetWindowLong(hDlg, DWL_MSGRESULT,0L);
  1011.       return TRUE;
  1012.    }
  1013.    return FALSE;
  1014. }
  1015. /*
  1016. ** AlignToControl -- align a window to a control in a dialog
  1017. **
  1018. ** Parameters:
  1019. **    hWnd  -- window to align
  1020. **    hParent -- parent dialog
  1021. **    iCtlId   -- control Id
  1022. **
  1023. ** Returns: BOOL that moveWindow returns
  1024. */
  1025. BOOL INTFUNC AlignToControl(
  1026.                             HWND hWnd,
  1027.                             HWND hParent,
  1028.                             int     iCtlId)
  1029. {
  1030.    HWND  hwndDrawArea;
  1031.    RECT  rcDrawArea, rcChildWnd;
  1032.    POINT ptPoint;
  1033.    hwndDrawArea = GetDlgItem(hParent, iCtlId);
  1034.    GetWindowRect(hwndDrawArea, &rcDrawArea);
  1035.    GetWindowRect(hWnd, &rcChildWnd);
  1036.    ptPoint.x = rcDrawArea.left;
  1037.    ptPoint.y = rcDrawArea.top;
  1038.    ScreenToClient(hWnd, &ptPoint);
  1039.    return (MoveWindow(  hWnd,
  1040.                       ptPoint.x,
  1041.                       ptPoint.y,
  1042.                       rcChildWnd.right- rcChildWnd.left,
  1043.                       rcChildWnd.bottom - rcChildWnd.top,
  1044.                       FALSE));
  1045. }