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

Windows编程

开发平台:

Visual C++

  1. //==========================================================================;
  2. //
  3. //  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  4. //  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  5. //  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  6. //  PURPOSE.
  7. //
  8. //  Copyright (C) 1993 - 1997  Microsoft Corporation.  All Rights Reserved.
  9. //
  10. //--------------------------------------------------------------------------;
  11. //
  12. //  mafader.c
  13. //
  14. //  Description:
  15. //
  16. //
  17. //  History:
  18. //       9/21/93
  19. //
  20. //==========================================================================;
  21. #include <windows.h>
  22. #include <windowsx.h>
  23. #include <mmsystem.h>
  24. #include "muldiv32.h"
  25. #include "mixapp.h"
  26. #include "debug.h"
  27. //
  28. //
  29. //
  30. typedef struct tMACONTROLINSTANCE_FADER
  31. {
  32.     LPMACONTROLINSTANCE             pmaci;
  33.     int                             nRange;
  34.     int                             nPageInc;
  35.     MIXERCONTROLDETAILS_UNSIGNED    pmxcd_u[];
  36. } MACONTROLINSTANCE_FADER, *PMACONTROLINSTANCE_FADER;
  37. //==========================================================================;
  38. //
  39. //
  40. //
  41. //
  42. //==========================================================================;
  43. //--------------------------------------------------------------------------;
  44. //
  45. //  BOOL MixAppControlChangeFader
  46. //
  47. //  Description:
  48. //
  49. //
  50. //  Arguments:
  51. //      HWND hwnd:
  52. //
  53. //      HMIXER hmx:
  54. //
  55. //      DWORD dwControlID:
  56. //
  57. //  Return (BOOL):
  58. //
  59. //  History:
  60. //      09/22/93
  61. //
  62. //--------------------------------------------------------------------------;
  63. BOOL FNLOCAL MixAppControlChangeFader
  64. (
  65.     HWND                    hwnd,
  66.     HMIXER                  hmx,
  67.     DWORD                   dwControlID
  68. )
  69. {
  70.     MMRESULT                        mmr;
  71.     HWND                            htxt;
  72.     PMACONTROLINSTANCE_FADER        pmaci_fader;
  73.     LPMACONTROLINSTANCE             pmaci;
  74.     LPMIXERLINE                     pmxl;
  75.     LPMIXERCONTROL                  pmxctrl;
  76.     PMIXERCONTROLDETAILS_UNSIGNED   pmxcd_u;
  77.     int                             nRange;
  78.     int                             nValue;
  79.     UINT                            cChannels;
  80.     UINT                            cMultipleItems;
  81.     UINT                            u;
  82.     UINT                            uIndex;
  83.     UINT                            v;
  84.     MIXERCONTROLDETAILS             mxcd;
  85.     HWND                            hsbFocus;
  86.     HWND                            hsb;
  87.     hsbFocus = GetFocus();
  88.     if (NULL == hsbFocus)
  89.     {
  90.         hsbFocus = GetDlgItem(hwnd, IDD_MACONTROL_MULTICHANNEL_BASE);
  91.     }
  92.     else
  93.     {
  94.         uIndex = GetDlgCtrlID(hsbFocus);
  95.         if (uIndex < IDD_MACONTROL_MULTICHANNEL_BASE)
  96.         {
  97.             hsbFocus = GetDlgItem(hwnd, IDD_MACONTROL_MULTICHANNEL_BASE);
  98.         }
  99.     }
  100.     //
  101.     //
  102.     //
  103.     pmaci_fader = (PMACONTROLINSTANCE_FADER)(UINT)GetWindowLong(hwnd, DWL_USER);
  104.     pmaci       = pmaci_fader->pmaci;
  105.     pmxl        = pmaci->pmxl;
  106.     pmxctrl     = pmaci->pmxctrl;
  107.     pmxcd_u     = &pmaci_fader->pmxcd_u[0];
  108.     nRange      = pmaci_fader->nRange;
  109.     cChannels = (UINT)pmxl->cChannels;
  110.     if (MIXERCONTROL_CONTROLF_UNIFORM & pmxctrl->fdwControl)
  111.         cChannels = 1;
  112.     //
  113.     //
  114.     //
  115.     mxcd.cbStruct       = sizeof(mxcd);
  116.     mxcd.dwControlID    = pmxctrl->dwControlID;
  117.     mxcd.cChannels      = cChannels;
  118.     mxcd.cMultipleItems = pmxctrl->cMultipleItems;
  119.     mxcd.cbDetails      = sizeof(*pmxcd_u);
  120.     mxcd.paDetails      = pmxcd_u;
  121.     mmr = mixerGetControlDetails((HMIXEROBJ)pmaci->hmx, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE);
  122.     if (MMSYSERR_NOERROR != mmr)
  123.     {
  124.         AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  125.                   "mixerGetControlDetails(ctrlid=%.08lXh) failed on hmx=%.04Xh, mmr=%u!",
  126.                   pmxctrl->dwControlID, pmaci->hmx, mmr);
  127.         return (FALSE);
  128.     }
  129.     cMultipleItems = 1;
  130.     if (MIXERCONTROL_CONTROLF_MULTIPLE & pmxctrl->fdwControl)
  131.         cMultipleItems = (UINT)pmxctrl->cMultipleItems;
  132.     for (u = 0; u < cChannels; u++)
  133.     {
  134.         for (v = 0; v < cMultipleItems; v++)
  135.         {
  136.             uIndex = (u * cMultipleItems) + v;
  137.             nValue = (int)MulDivRN(pmxcd_u[uIndex].dwValue, nRange, 0xFFFF);
  138.             //
  139.             //  Windows is stupid and forces an update to scrollbars
  140.             //  (a flickering paint) even when the position does not
  141.             //  change... so don't update if it is already in the
  142.             //  right position.
  143.             //
  144.             hsb = GetDlgItem(hwnd, IDD_MACONTROL_MULTICHANNEL_BASE + uIndex);
  145.             if (hsbFocus == hsb)
  146.             {
  147.                 htxt = GetDlgItem(hwnd, IDD_MACONTROL_TXT_VALUE);
  148.                 AppSetWindowText(htxt, "mapped=%d, dwValue=%lu",
  149.                                  nValue,
  150.                                  pmxcd_u[uIndex].dwValue);
  151.             }
  152.             if (nRange - nValue == GetScrollPos(hsb, SB_CTL))
  153.                 continue;
  154.             //
  155.             //  note that we _invert_ the position since a fader will
  156.             //  increase approaching the top (opposite of scrollbar
  157.             //  logic)
  158.             //
  159.             SetScrollPos(hsb, SB_CTL, nRange - nValue, TRUE);
  160.         }
  161.     }
  162.     //
  163.     //
  164.     //
  165.     mxcd.cbStruct       = sizeof(mxcd);
  166.     mxcd.dwControlID    = pmxctrl->dwControlID;
  167.     mxcd.cChannels      = 1;
  168.     mxcd.cMultipleItems = pmxctrl->cMultipleItems;
  169.     mxcd.cbDetails      = sizeof(*pmxcd_u);
  170.     mxcd.paDetails      = pmxcd_u;
  171.     mmr = mixerGetControlDetails((HMIXEROBJ)pmaci->hmx, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE);
  172.     if (MMSYSERR_NOERROR != mmr)
  173.     {
  174.         AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  175.                   "mixerGetControlDetails(ctrlid=%.08lXh) failed on hmx=%.04Xh, mmr=%u!",
  176.                   pmxctrl->dwControlID, pmaci->hmx, mmr);
  177.         return (FALSE);
  178.     }
  179.     for (v = 0; v < cMultipleItems; v++)
  180.     {
  181.         uIndex = v;
  182.         nValue = (int)MulDivRN(pmxcd_u[uIndex].dwValue, nRange, 0xFFFF);
  183.         hsb = GetDlgItem(hwnd, IDD_MACONTROL_UNIFORM_BASE + uIndex);
  184.         if (hsbFocus == hsb)
  185.         {
  186.             htxt = GetDlgItem(hwnd, IDD_MACONTROL_TXT_VALUE);
  187.             AppSetWindowText(htxt, "mapped=%d, dwValue=%lu",
  188.                              nValue,
  189.                              pmxcd_u[0].dwValue);
  190.         }
  191.         if (nRange - nValue == GetScrollPos(hsb, SB_CTL))
  192.             continue;
  193.         //
  194.         //  note that we _invert_ the position since a fader will
  195.         //  increase approaching the top (opposite of scrollbar
  196.         //  logic)
  197.         //
  198.         SetScrollPos(hsb, SB_CTL, nRange - nValue, TRUE);
  199.     }
  200.     return (TRUE);
  201. } // MixAppControlChangeFader()
  202. //--------------------------------------------------------------------------;
  203. //
  204. //  BOOL MixAppControlSetFader
  205. //
  206. //  Description:
  207. //
  208. //
  209. //  Arguments:
  210. //      HWND hwnd:
  211. //
  212. //      HWND hsb:
  213. //
  214. //      UINT uCode:
  215. //
  216. //      int nPos:
  217. //
  218. //  Return (BOOL):
  219. //
  220. //  History:
  221. //      09/22/93
  222. //
  223. //--------------------------------------------------------------------------;
  224. BOOL FNLOCAL MixAppControlSetFader
  225. (
  226.     HWND                    hwnd,
  227.     HWND                    hsb,
  228.     UINT                    uCode,
  229.     int                     nPos
  230. )
  231. {
  232.     PMACONTROLINSTANCE_FADER        pmaci_fader;
  233.     LPMACONTROLINSTANCE             pmaci;
  234.     LPMIXERLINE                     pmxl;
  235.     LPMIXERCONTROL                  pmxctrl;
  236.     PMIXERCONTROLDETAILS_UNSIGNED   pmxcd_u;
  237.     MMRESULT                        mmr;
  238.     int                             nRange;
  239.     int                             nPageInc;
  240.     int                             nValue;
  241.     UINT                            cChannels;
  242.     UINT                            uIndex;
  243.     MIXERCONTROLDETAILS             mxcd;
  244.     //
  245.     //
  246.     //
  247.     pmaci_fader = (PMACONTROLINSTANCE_FADER)(UINT)GetWindowLong(hwnd, DWL_USER);
  248.     pmaci       = pmaci_fader->pmaci;
  249.     pmxl        = pmaci->pmxl;
  250.     pmxctrl     = pmaci->pmxctrl;
  251.     pmxcd_u     = &pmaci_fader->pmxcd_u[0];
  252.     nRange      = pmaci_fader->nRange;
  253.     nPageInc    = pmaci_fader->nPageInc;
  254.     uIndex = GetDlgCtrlID(hsb);
  255.     if (uIndex < IDD_MACONTROL_UNIFORM_BASE)
  256.     {
  257.         cChannels = (UINT)pmxl->cChannels;
  258.         if (MIXERCONTROL_CONTROLF_UNIFORM & pmxctrl->fdwControl)
  259.             cChannels = 1;
  260.         uIndex -= IDD_MACONTROL_MULTICHANNEL_BASE;
  261.     }
  262.     else
  263.     {
  264.         cChannels = 1;
  265.         uIndex -= IDD_MACONTROL_UNIFORM_BASE;
  266.     }
  267.     nValue = GetScrollPos(hsb, SB_CTL);
  268.     switch (uCode)
  269.     {
  270.         case SB_PAGEDOWN:
  271.             nValue = (int)min(nRange, (LONG)nValue + nPageInc);
  272.             break;
  273.         case SB_LINEDOWN:
  274.             nValue = (int)min(nRange, (LONG)nValue + 1);
  275.             break;
  276.         case SB_PAGEUP:
  277.             nValue -= nPageInc;
  278.             //-- fall through --//
  279.         case SB_LINEUP:
  280.             nValue = (nValue < 1) ? 0 : (nValue - 1);
  281.             break;
  282.         case SB_TOP:
  283.             //
  284.             //  !!! would be a VERY BAD IDEA to go full volume !!!
  285.             //
  286.             nValue = nRange / 2;
  287.             break;
  288.         case SB_BOTTOM:
  289.             nValue = nRange;
  290.             break;
  291.         case SB_THUMBPOSITION:
  292.         case SB_THUMBTRACK:
  293.             nValue = nPos;
  294.             break;
  295.         default:
  296.             return (FALSE);
  297.     }
  298.     //
  299.     //
  300.     //
  301.     //
  302.     mxcd.cbStruct       = sizeof(mxcd);
  303.     mxcd.dwControlID    = pmxctrl->dwControlID;
  304.     mxcd.cChannels      = cChannels;
  305.     mxcd.cMultipleItems = pmxctrl->cMultipleItems;
  306.     mxcd.cbDetails      = sizeof(*pmxcd_u);
  307.     mxcd.paDetails      = pmxcd_u;
  308.     mmr = mixerGetControlDetails((HMIXEROBJ)pmaci->hmx, &mxcd, 0L);
  309.     if (MMSYSERR_NOERROR != mmr)
  310.     {
  311.         AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  312.                   "mixerGetControlDetails(ctrlid=%.08lXh) failed on hmx=%.04Xh, mmr=%u!",
  313.                   pmxctrl->dwControlID, pmaci->hmx, mmr);
  314.         return (FALSE);
  315.     }
  316.     pmxcd_u[uIndex].dwValue  = (DWORD)MulDivRN((nRange - nValue), 0xFFFF, nRange);
  317.     mmr = mixerSetControlDetails((HMIXEROBJ)pmaci->hmx, &mxcd, 0L);
  318.     if (MMSYSERR_NOERROR != mmr)
  319.     {
  320.         AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  321.                   "mixerSetControlDetails(ctrlid=%.08lXh) failed on hmx=%.04Xh, mmr=%u!",
  322.                   pmxctrl->dwControlID, pmaci->hmx, mmr);
  323.         return (FALSE);
  324.     }
  325. // * commented out to stop sliders getting out of synch    *
  326. // * between different instances of the app. AGuy 22.12.93 *
  327. //  SetScrollPos(hsb, SB_CTL, nValue, TRUE);
  328. #if 0
  329.     if (0 == uIndex)
  330.     {
  331.         htxt = GetDlgItem(hwnd, IDD_MACONTROL_TXT_VALUE);
  332.         AppSetWindowText(htxt, "mapped=%d, dwValue=%lu",
  333.                          nValue,
  334.                          pmxcd_u[0].dwValue);
  335.     }
  336. #endif
  337.     return (TRUE);
  338. } // MixAppControlSetFader()
  339. //--------------------------------------------------------------------------;
  340. //
  341. //  BOOL MixAppLineChangeFader
  342. //
  343. //  Description:
  344. //
  345. //
  346. //  Arguments:
  347. //      HWND hwnd:
  348. //
  349. //      HMIXER hmx:
  350. //
  351. //      DWORD dwLineID:
  352. //
  353. //  Return (BOOL):
  354. //
  355. //  History:
  356. //      09/24/93
  357. //
  358. //--------------------------------------------------------------------------;
  359. BOOL FNLOCAL MixAppLineChangeFader
  360. (
  361.     HWND                    hwnd,
  362.     HMIXER                  hmx,
  363.     DWORD                   dwLineID
  364. )
  365. {
  366.     MMRESULT                    mmr;
  367.     PMACONTROLINSTANCE_FADER    pmaci_fader;
  368.     LPMACONTROLINSTANCE         pmaci;
  369.     LPMIXERLINE                 pmxl;
  370.     MIXERLINE                   mxl;
  371.     BOOL                        fSource;
  372.     BOOL                        fActive;
  373.     BOOL                        fDisconnected;
  374.     HWND                        htxt;
  375.     //
  376.     //
  377.     //
  378.     pmaci_fader = (PMACONTROLINSTANCE_FADER)(UINT)GetWindowLong(hwnd, DWL_USER);
  379.     pmaci       = pmaci_fader->pmaci;
  380.     pmxl        = pmaci->pmxl;
  381.     if (pmxl->dwLineID != dwLineID)
  382.     {
  383.         DPF(0, "!MixAppLineChangeFader: why am i getting notifications for some other line??");
  384.         //
  385.         //  this would be a bug in this app... keep from bombing though
  386.         //  until i fix it.
  387.         //
  388.         dwLineID = pmxl->dwLineID;
  389.     }
  390.     //
  391.     //  get the current state of the line that changed.. this is actually
  392.     //  silly that you have to do this just to determine if the line went
  393.     //  [in]active. sigh..
  394.     //
  395.     mxl.cbStruct      = sizeof(mxl);
  396.     mxl.dwLineID      = dwLineID;
  397.     mmr = mixerGetLineInfo((HMIXEROBJ)ghmx, &mxl, MIXER_GETLINEINFOF_LINEID);
  398.     if (MMSYSERR_NOERROR != mmr)
  399.     {
  400.         AppMsgBox(hwnd, MB_OK | MB_ICONEXCLAMATION,
  401.                   "mixerGetLineInfo(lineid=%.08lXh) failed on hmx=%.04Xh, mmr=%u!",
  402.                   dwLineID, ghmx, mmr);
  403.         return (FALSE);
  404.     }
  405.     fSource       = (0 != (MIXERLINE_LINEF_SOURCE & mxl.fdwLine));
  406.     fActive       = (0 != (MIXERLINE_LINEF_ACTIVE & mxl.fdwLine));
  407.     fDisconnected = (0 != (MIXERLINE_LINEF_DISCONNECTED & mxl.fdwLine));
  408.     htxt = GetDlgItem(hwnd, IDD_MACONTROL_TXT_LINEINFO);
  409.     AppSetWindowText(htxt, "(%s), '%s', %s, %s",
  410.                      fSource ? (LPSTR)"src" : (LPSTR)"DST",
  411.                      (LPSTR)mxl.szShortName,
  412.                      fActive ? (LPSTR)"ACTIVE" : (LPSTR)"inactive",
  413.                      fDisconnected ? (LPSTR)"DISCONNECTED" : (LPSTR)"connected");
  414.     return (fActive);
  415. } // MixAppLineChangeFader()
  416. //--------------------------------------------------------------------------;
  417. //
  418. //  BOOL MixAppInitDialogFader
  419. //
  420. //  Description:
  421. //
  422. //
  423. //  Arguments:
  424. //      HWND hwnd:
  425. //
  426. //      HWND hwndFocus:
  427. //
  428. //      LPARAM lParam:
  429. //
  430. //  Return (BOOL):
  431. //
  432. //  History:
  433. //      09/22/93
  434. //
  435. //--------------------------------------------------------------------------;
  436. BOOL FNLOCAL MixAppInitDialogFader
  437. (
  438.     HWND                    hwnd,
  439.     HWND                    hwndFocus,
  440.     LPARAM                  lParam
  441. )
  442. {
  443.     #define FSB_DEF_STYLE   (WS_VISIBLE | WS_CHILD | SBS_VERT | WS_TABSTOP)
  444.     static TCHAR        szScrollBar[] = TEXT("scrollbar");
  445.     static TCHAR        szTitle[]     = TEXT("Fader Class: '%s'");
  446.     TCHAR                       szControlType[64];
  447.     LPMACONTROLINSTANCE         pmaci;
  448.     PMACONTROLINSTANCE_FADER    pmaci_fader;
  449.     LPMIXERLINE                 pmxl;
  450.     LPMIXERCONTROL              pmxctrl;
  451.     HWND                        htxt;
  452.     UINT                        u;
  453.     UINT                        v;
  454.     HWND                        hsb;
  455.     RECT                        rcM;
  456.     RECT                        rcU;
  457.     int                         cxvsb;
  458.     UINT                        cb;
  459.     UINT                        cChannels;
  460.     UINT                        cMultipleItems;
  461.     UINT                        uIndex;
  462.     int                         nRange;
  463.     int                         nPageInc;
  464.     //
  465.     //
  466.     //
  467.     pmaci = (LPMACONTROLINSTANCE)lParam;
  468.     if (NULL == pmaci)
  469.     {
  470.         DPF(0, "!MixAppInitDialogFader: pmaci passed in lParam is NULL!?!");
  471.         return (FALSE);
  472.     }
  473.     pmxl    = pmaci->pmxl;
  474.     pmxctrl = pmaci->pmxctrl;
  475.     if (!MixAppGetControlTypeName(pmxctrl, szControlType))
  476.     {
  477.         return (FALSE);
  478.     }
  479.     //
  480.     //
  481.     //
  482.     switch (pmxctrl->dwControlType)
  483.     {
  484.         case MIXERCONTROL_CONTROLTYPE_FADER:
  485.         case MIXERCONTROL_CONTROLTYPE_VOLUME:
  486.         case MIXERCONTROL_CONTROLTYPE_BASS:
  487.         case MIXERCONTROL_CONTROLTYPE_TREBLE:
  488.         case MIXERCONTROL_CONTROLTYPE_EQUALIZER:
  489.             break;
  490.         default:
  491.             DPF(0, "!MixAppInitDialogFader: pmxctrl->dwControlType=%.08lXh not valid fader!", pmxctrl->dwControlType);
  492.             return (FALSE);
  493.     }
  494.     //
  495.     //
  496.     //
  497.     AppSetWindowText(hwnd, szTitle, (LPTSTR)szControlType);
  498.     SetDlgItemText(hwnd, IDD_MACONTROL_TXT_SHORT_NAME, pmxctrl->szShortName);
  499.     SetDlgItemText(hwnd, IDD_MACONTROL_TXT_LONG_NAME,  pmxctrl->szName);
  500.     htxt = GetDlgItem(hwnd, IDD_MACONTROL_TXT_BOUNDS);
  501.     AppSetWindowText(htxt, "dwMinimum=%lu, dwMaximum=%lu",
  502.                      pmxctrl->Bounds.dwMinimum,
  503.                      pmxctrl->Bounds.dwMaximum);
  504.     htxt = GetDlgItem(hwnd, IDD_MACONTROL_TXT_METRICS);
  505.     AppSetWindowText(htxt, "cSteps=%lu",
  506.                      pmxctrl->Metrics.cSteps);
  507.     //
  508.     //
  509.     //
  510.     cChannels = (UINT)pmxl->cChannels;
  511.     if (MIXERCONTROL_CONTROLF_UNIFORM & pmxctrl->fdwControl)
  512.         cChannels = 1;
  513.     cMultipleItems = 1;
  514.     if (MIXERCONTROL_CONTROLF_MULTIPLE & pmxctrl->fdwControl)
  515.         cMultipleItems = (UINT)pmxctrl->cMultipleItems;
  516.     cb  = sizeof(*pmaci_fader);
  517.     cb += cChannels * cMultipleItems * sizeof(pmaci_fader->pmxcd_u[0]);
  518.     pmaci_fader = (PMACONTROLINSTANCE_FADER)LocalAlloc(LPTR, cb);
  519.     if (NULL == pmaci_fader)
  520.     {
  521.         DPF(0, "!MixAppInitDialogFader: failed trying to alloc %u bytes for control instance!", cb);
  522.         return (FALSE);
  523.     }
  524.     //
  525.     //
  526.     //
  527.     SetWindowLong(hwnd, DWL_USER, (LPARAM)(UINT)pmaci_fader);
  528.     nRange   = (int)min(32767, pmxctrl->Metrics.cSteps - 1);
  529.     nPageInc = nRange / 10;
  530.     if (0 == nPageInc)
  531.         nPageInc = 1;
  532.     pmaci_fader->pmaci    = pmaci;
  533.     pmaci_fader->nRange   = nRange;
  534.     pmaci_fader->nPageInc = nPageInc;
  535.     //
  536.     //
  537.     //
  538.     //
  539.     cxvsb = GetSystemMetrics(SM_CXVSCROLL);
  540.     hsb = GetDlgItem(hwnd, IDD_MACONTROL_GRP_MULTICHANNEL);
  541.     GetWindowRect(hsb, &rcM);
  542.     InflateRect(&rcM, -10, -20);
  543.     ScreenToClient(hwnd, (LPPOINT)&rcM.left);
  544.     ScreenToClient(hwnd, (LPPOINT)&rcM.right);
  545.     rcM.right = rcM.left + cxvsb;
  546.     for (u = 0; u < cChannels; u++)
  547.     {
  548.         for (v = 0; v < cMultipleItems; v++)
  549.         {
  550.             uIndex = (u * cMultipleItems) + v;
  551.             hsb = CreateWindow(szScrollBar, gszNull, FSB_DEF_STYLE,
  552.                                rcM.left, rcM.top,
  553.                                rcM.right - rcM.left,
  554.                                rcM.bottom - rcM.top,
  555.                                hwnd, (HMENU)(IDD_MACONTROL_MULTICHANNEL_BASE + uIndex),
  556.                                ghinst, NULL);
  557.             SetScrollRange(hsb, SB_CTL, 0, nRange, FALSE);
  558.             rcM.left  += cxvsb + 4;
  559.             rcM.right += cxvsb + 4;
  560.         }
  561.         //
  562.         //  add more separation between channels
  563.         //
  564.         rcM.left  += cxvsb;
  565.         rcM.right += cxvsb;
  566.     }
  567.     //
  568.     //
  569.     //
  570.     //
  571.     hsb = GetDlgItem(hwnd, IDD_MACONTROL_GRP_UNIFORM);
  572.     GetWindowRect(hsb, &rcU);
  573.     InflateRect(&rcU, -10, -20);
  574.     ScreenToClient(hwnd, (LPPOINT)&rcU.left);
  575.     ScreenToClient(hwnd, (LPPOINT)&rcU.right);
  576.     rcU.right = rcU.left + cxvsb;
  577.     for (v = 0; v < cMultipleItems; v++)
  578.     {
  579.         hsb = CreateWindow(szScrollBar, gszNull, FSB_DEF_STYLE,
  580.                             rcU.left, rcU.top,
  581.                             rcU.right - rcU.left,
  582.                             rcU.bottom - rcU.top,
  583.                             hwnd, (HMENU)(IDD_MACONTROL_UNIFORM_BASE + v),
  584.                             ghinst, NULL);
  585.         SetScrollRange(hsb, SB_CTL, 0, nRange, FALSE);
  586.         rcU.left  += cxvsb + 4;
  587.         rcU.right += cxvsb + 4;
  588.     }
  589.     //
  590.     //
  591.     //
  592.     SendMessage(hwnd,
  593.                 MM_MIXM_LINE_CHANGE,
  594.                 (WPARAM)pmaci->hmx,
  595.                 pmxl->dwLineID);
  596.     SendMessage(hwnd,
  597.                 MM_MIXM_CONTROL_CHANGE,
  598.                 (WPARAM)pmaci->hmx,
  599.                 pmxctrl->dwControlID);
  600.     return (TRUE);
  601. } // MixAppInitDialogFader()
  602. //==========================================================================;
  603. //
  604. //
  605. //
  606. //
  607. //==========================================================================;
  608. //--------------------------------------------------------------------------;
  609. //
  610. //  BOOL MixAppDlgProcControlFader
  611. //
  612. //  Description:
  613. //
  614. //
  615. //  Arguments:
  616. //      HWND hwnd:
  617. //
  618. //      UINT uMsg:
  619. //
  620. //      WPARAM wParam:
  621. //
  622. //      LPARAM lParam:
  623. //
  624. //  Return (BOOL):
  625. //
  626. //  History:
  627. //      07/22/93
  628. //
  629. //--------------------------------------------------------------------------;
  630. BOOL CALLBACK MixAppDlgProcControlFader
  631. (
  632.     HWND                    hwnd,
  633.     UINT                    uMsg,
  634.     WPARAM                  wParam,
  635.     LPARAM                  lParam
  636. )
  637. {
  638.     LRESULT             lr;
  639.     HLOCAL              hl;
  640.     UINT                uId;
  641.     //
  642.     //
  643.     //
  644.     switch (uMsg)
  645.     {
  646.         case WM_INITDIALOG:
  647.             DPF(0, "WM_INITDIALOG");
  648.             lr = HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, MixAppInitDialogFader);
  649.             if (FALSE == lr)
  650.             {
  651.                 EndDialog(hwnd, FALSE);
  652.             }
  653.             else
  654.             {
  655.                 ghdlgControl = hwnd;
  656.             }
  657.             return (TRUE);
  658.         case MM_MIXM_LINE_CHANGE:
  659.             DPF(0, "MM_MIXM_LINE_CHANGE");
  660.             MixAppLineChangeFader(hwnd, (HMIXER)wParam, lParam);
  661.             return (TRUE);
  662.         case MM_MIXM_CONTROL_CHANGE:
  663.             DPF(0, "MM_MIXM_CONTROL_CHANGE");
  664.             MixAppControlChangeFader(hwnd, (HMIXER)wParam, lParam);
  665.             DPF(0, "done...");
  666.             return (TRUE);
  667.         case WM_VSCROLL:
  668.             DPF(0,"WM_SCROLL");
  669.             HANDLE_WM_VSCROLL(hwnd, wParam, lParam, MixAppControlSetFader);
  670.             return (TRUE);
  671.         case WM_COMMAND:
  672.             DPF(0, "WM_COMMAND");
  673.             uId = GET_WM_COMMAND_ID(wParam, lParam);
  674.             switch (uId)
  675.             {
  676.                 case IDCANCEL:
  677.                 case IDOK:
  678.                     hl = (HLOCAL)(UINT)GetWindowLong(hwnd, DWL_USER);
  679.                     LocalFree(hl);
  680.                     EndDialog(hwnd, TRUE);
  681.                     ghdlgControl = NULL;
  682.                     break;
  683.             }
  684.             break;
  685.     }
  686.     return (FALSE);
  687. } // MixAppDlgProcControlFader()