waveui.cpp
上传用户:hcyyun520
上传日期:2019-05-14
资源大小:365k
文件大小:8k
源码类别:

TAPI编程

开发平台:

Visual C++

  1. // waveui.cpp
  2. // TUISPI_xxx functions ///////////////////////////////////////////////
  3. #include "pch.h"
  4. #include "resource.h"
  5. #include "wavetsp.h"
  6. #include "uicall.h"
  7. extern HINSTANCE    g_hinst;
  8. BOOL CenterWindow(HWND hWnd, HWND hWndCenter = 0);
  9. extern bool GetPermanentProviderID(LPCSTR pszProvider, DWORD* pdwID);
  10. BOOL CALLBACK CallStatusProc(
  11.     HWND    hwnd,
  12.     UINT    nMsg,
  13.     WPARAM  wparam,
  14.     LPARAM  lparam)
  15. {
  16.     BOOL        b = FALSE;
  17.     CuiCall*    pCall = (CuiCall*)GetWindowLong(hwnd, GWL_USERDATA);
  18.     switch( nMsg )
  19.     {
  20.     case WM_INITDIALOG:
  21.         CenterWindow(hwnd);
  22.         SetWindowLong(hwnd, GWL_USERDATA, lparam);
  23.         b = TRUE;
  24.     break;
  25.     case WM_COMMAND:
  26.         switch( GET_WM_COMMAND_ID(wparam, lparam) )
  27.         {
  28.         case IDC_DIAL:
  29.             if( pCall->Dial(hwnd) )
  30.             {
  31.                 EnableWindow(GetDlgItem(hwnd, IDC_DIAL), FALSE);
  32.                 EnableWindow(GetDlgItem(hwnd, IDCANCEL), FALSE);
  33.                 SetDlgItemText(hwnd, IDC_MESSAGE, "Dialing...");
  34.             }
  35.             else
  36.             {
  37.                 EnableWindow(GetDlgItem(hwnd, IDC_DIAL), FALSE);
  38.                 SetDlgItemText(hwnd, IDC_MESSAGE, "Dialing failed. Check your soundcard.");
  39.             }
  40.         break;
  41.         case IDCANCEL:
  42.             pCall->Cancel();
  43.             EndDialog(hwnd, IDCANCEL);
  44.         break;
  45.         }
  46.     break;
  47.     }
  48.     return b;
  49. }
  50. // Entry point for LINE_CREATEDIALOGINSTANCE event
  51. // from TSPI_lineMakeCall
  52. LONG TSPIAPI TUISPI_providerGenericDialog(
  53.     TUISPIDLLCALLBACK     lpfnUIDLLCallback,
  54.     HTAPIDIALOGINSTANCE   htDlgInst,
  55.     LPVOID                lpParams,
  56.     DWORD                 dwSize,
  57.     HANDLE                hEvent)
  58. {
  59.     BEGIN_PARAM_TABLE("TUISPI_providerGenericDialog")
  60.         DWORD_IN_ENTRY(lpfnUIDLLCallback)
  61.         DWORD_IN_ENTRY(htDlgInst)
  62.         DWORD_IN_ENTRY(lpParams)
  63.         DWORD_IN_ENTRY(dwSize)
  64.         DWORD_IN_ENTRY(hEvent)
  65.     END_PARAM_TABLE()
  66.     // Signal TAPI it's OK to process LINE_SENDDIALOGINSTANCEDATA
  67.     // (even though we don't use any)
  68.     SetEvent(hEvent);
  69.     // Pull out extra data
  70.     LINEDIALPARAMS* pdp = (LINEDIALPARAMS*)((BYTE*)lpParams + sizeof(TSPUIDATA));
  71.     LPCSTR          pszAddress = (LPCSTR)((BYTE*)lpParams + sizeof(TSPUIDATA) + sizeof(LINEDIALPARAMS));
  72.     CuiCall call(htDlgInst, lpfnUIDLLCallback, pszAddress, pdp, (TSPUIDATA*)lpParams);
  73.     DialogBoxParam(g_hinst, MAKEINTRESOURCE(IDD_CALL_STATUS), 0, CallStatusProc, (LPARAM)&call);
  74.     return EPILOG(0);
  75. }
  76. BOOL CALLBACK ConfigDlgProc(
  77.     HWND    hwnd,
  78.     UINT    nMsg,
  79.     WPARAM  wparam,
  80.     LPARAM  lparam)
  81. {
  82.     BOOL    b = FALSE;
  83.     switch( nMsg )
  84.     {
  85.     case WM_INITDIALOG:
  86.         CenterWindow(hwnd);
  87.         SetDlgItemText(hwnd, IDC_DTMF, "123A456B789C*0#D");
  88.         b = TRUE;
  89.     break;
  90.     case WM_COMMAND:
  91.         switch( GET_WM_COMMAND_ID(wparam, lparam) )
  92.         {
  93.         case IDOK:
  94.             EndDialog(hwnd, IDOK);
  95.         break;
  96.         case IDCANCEL:
  97.             EndDialog(hwnd, IDCANCEL);
  98.         break;
  99.         case IDC_TEST:
  100.         {
  101.             char    szDtmf[256];
  102.             GetDlgItemText(hwnd, IDC_DTMF, szDtmf, DIM(szDtmf));
  103.             if( *szDtmf )
  104.             {
  105.                 CtDialString    ds(0, szDtmf);
  106.                 ds.Dial(WAVE_MAPPER, 250, 0);
  107.                 MessageBox(0, "Playing test digits...", "WaveTSP", MB_SETFOREGROUND);
  108.             }
  109.         }
  110.         break;
  111.         }
  112.     break;
  113.     }
  114.     return b;
  115. }
  116.  
  117. LONG TSPIAPI TUISPI_lineConfigDialog(
  118.     TUISPIDLLCALLBACK   pfnUIDLLCallback,
  119.     DWORD               dwDeviceID,
  120.     HWND                hwndOwner,
  121.     LPCWSTR             pszDeviceClass)
  122. {
  123.     BEGIN_PARAM_TABLE("TUISPI_lineConfigDialog")
  124.         DWORD_IN_ENTRY(pfnUIDLLCallback)
  125.         DWORD_IN_ENTRY(dwDeviceID)
  126.         DWORD_IN_ENTRY(hwndOwner)
  127.         STRING_IN_ENTRY(pszDeviceClass)
  128.     END_PARAM_TABLE()
  129.     
  130.     DialogBox(g_hinst,
  131.               MAKEINTRESOURCE(IDD_CONFIG),
  132.               hwndOwner,
  133.               ConfigDlgProc);
  134.     
  135.     return EPILOG(0);
  136. }
  137. LONG TSPIAPI TUISPI_providerInstall(
  138.     TUISPIDLLCALLBACK   pfnUIDLLCallback,
  139.     HWND                hwndOwner,
  140.     DWORD               dwPermanentProviderID)
  141. {
  142.     BEGIN_PARAM_TABLE("TUISPI_providerInstall")
  143.         DWORD_IN_ENTRY(pfnUIDLLCallback)
  144.         DWORD_IN_ENTRY(hwndOwner)
  145.         DWORD_IN_ENTRY(dwPermanentProviderID)
  146.     END_PARAM_TABLE()
  147.     
  148.     LONG    tr;
  149.     DWORD   dwID;
  150.     tr = (GetPermanentProviderID("wavetsp.tsp", &dwID) ? LINEERR_NOMULTIPLEINSTANCE : 0);
  151.     if( tr == 0 )
  152.     {
  153.         DialogBox(g_hinst,
  154.                   MAKEINTRESOURCE(IDD_CONFIG),
  155.                   hwndOwner,
  156.                   ConfigDlgProc);
  157.     }
  158.     
  159.     return EPILOG(tr);
  160. }
  161. LONG TSPIAPI TUISPI_providerConfig(
  162.     TUISPIDLLCALLBACK   pfnUIDLLCallback,
  163.     HWND                hwndOwner,
  164.     DWORD               dwPermanentProviderID)
  165. {
  166.     BEGIN_PARAM_TABLE("TUISPI_providerConfig")
  167.         DWORD_IN_ENTRY(pfnUIDLLCallback)
  168.         DWORD_IN_ENTRY(hwndOwner)
  169.         DWORD_IN_ENTRY(dwPermanentProviderID)
  170.     END_PARAM_TABLE()
  171.     
  172.     DialogBox(g_hinst,
  173.               MAKEINTRESOURCE(IDD_CONFIG),
  174.               hwndOwner,
  175.               ConfigDlgProc);
  176.     
  177.     return EPILOG(0);
  178. }
  179. LONG TSPIAPI TUISPI_providerRemove(
  180.     TUISPIDLLCALLBACK   pfnUIDLLCallback,
  181.     HWND                hwndOwner,
  182.     DWORD               dwPermanentProviderID)
  183. {
  184.     BEGIN_PARAM_TABLE("TUISPI_providerRemove")
  185.         DWORD_IN_ENTRY(pfnUIDLLCallback)
  186.         DWORD_IN_ENTRY(hwndOwner)
  187.         DWORD_IN_ENTRY(dwPermanentProviderID)
  188.     END_PARAM_TABLE()
  189.     
  190.     return EPILOG(0);
  191. }
  192. // Stole this from ATL
  193. BOOL CenterWindow(HWND hWnd, HWND hWndCenter/* = 0*/)
  194. {
  195. assert(::IsWindow(hWnd));
  196. // determine owner window to center against
  197. DWORD dwStyle = GetWindowLong(hWnd, GWL_STYLE);
  198. if(hWndCenter == NULL)
  199. {
  200. if(dwStyle & WS_CHILD)
  201. hWndCenter = ::GetParent(hWnd);
  202. else
  203. hWndCenter = ::GetWindow(hWnd, GW_OWNER);
  204. }
  205. // get coordinates of the window relative to its parent
  206. RECT rcDlg;
  207. ::GetWindowRect(hWnd, &rcDlg);
  208. RECT rcArea;
  209. RECT rcCenter;
  210. HWND hWndParent;
  211. if(!(dwStyle & WS_CHILD))
  212. {
  213. // don't center against invisible or minimized windows
  214. if(hWndCenter != NULL)
  215. {
  216. DWORD dwStyle = ::GetWindowLong(hWndCenter, GWL_STYLE);
  217. if(!(dwStyle & WS_VISIBLE) || (dwStyle & WS_MINIMIZE))
  218. hWndCenter = NULL;
  219. }
  220. // center within screen coordinates
  221. ::SystemParametersInfo(SPI_GETWORKAREA, NULL, &rcArea, NULL);
  222. if(hWndCenter == NULL)
  223. rcCenter = rcArea;
  224. else
  225. ::GetWindowRect(hWndCenter, &rcCenter);
  226. }
  227. else
  228. {
  229. // center within parent client coordinates
  230. hWndParent = ::GetParent(hWnd);
  231. assert(::IsWindow(hWndParent));
  232. ::GetClientRect(hWndParent, &rcArea);
  233. assert(::IsWindow(hWndCenter));
  234. ::GetClientRect(hWndCenter, &rcCenter);
  235. ::MapWindowPoints(hWndCenter, hWndParent, (POINT*)&rcCenter, 2);
  236. }
  237. int DlgWidth = rcDlg.right - rcDlg.left;
  238. int DlgHeight = rcDlg.bottom - rcDlg.top;
  239. // find dialog's upper left based on rcCenter
  240. int xLeft = (rcCenter.left + rcCenter.right) / 2 - DlgWidth / 2;
  241. int yTop = (rcCenter.top + rcCenter.bottom) / 2 - DlgHeight / 2;
  242. // if the dialog is outside the screen, move it inside
  243. if(xLeft < rcArea.left)
  244. xLeft = rcArea.left;
  245. else if(xLeft + DlgWidth > rcArea.right)
  246. xLeft = rcArea.right - DlgWidth;
  247. if(yTop < rcArea.top)
  248. yTop = rcArea.top;
  249. else if(yTop + DlgHeight > rcArea.bottom)
  250. yTop = rcArea.bottom - DlgHeight;
  251. // map screen coordinates to child coordinates
  252. return ::SetWindowPos(hWnd, NULL, xLeft, yTop, -1, -1,
  253. SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
  254. }