spuihelp.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:8k
源码类别:

模拟服务器

开发平台:

C/C++

  1. /*******************************************************************************
  2. * SPUIHelp.h *
  3. *------------*
  4. *   Description:
  5. *       This is the header file for user-interface helper functions.  Note that
  6. *       unlike SpHelper.H, this file requires the use of ATL.
  7. *-------------------------------------------------------------------------------
  8. *   Copyright (c) Microsoft Corporation. All rights reserved.
  9. *******************************************************************************/
  10. #ifndef SPUIHelp_h
  11. #define SPUIHelp_h
  12. #ifndef __sapi_h__
  13. #include <sapi.h>
  14. #endif
  15. #ifndef SPError_h
  16. #include <SPError.h>
  17. #endif
  18. #ifndef SPDebug_h
  19. #include <SPDebug.h>
  20. #endif
  21. #ifndef SPHelper_h
  22. #include <SPHelper.h>
  23. #endif
  24. #ifndef __ATLBASE_H__
  25. #include <ATLBASE.h>
  26. #endif
  27. #ifndef __ATLCONV_H__
  28. #include <ATLCONV.H>
  29. #endif
  30. /****************************************************************************
  31. *
  32. *
  33. ********************************************************************* RAL ***/
  34. //
  35. //  Dont call this function directly.  Use SpInitTokenComboBox or SpInitTokenListBox.
  36. //
  37. inline HRESULT SpInitTokenList(UINT MsgAddString, UINT MsgSetItemData, UINT MsgSetCurSel,
  38.                                HWND hwnd, const WCHAR * pszCatName,
  39.                                const WCHAR * pszRequiredAttrib, const WCHAR * pszOptionalAttrib)
  40. {
  41.     HRESULT hr;
  42.     ISpObjectToken * pToken;        // NOTE:  Not a CComPtr!  Be Careful.
  43.     CComPtr<IEnumSpObjectTokens> cpEnum;
  44.     hr = SpEnumTokens(pszCatName, pszRequiredAttrib, pszOptionalAttrib, &cpEnum);
  45.     if (hr == S_OK)
  46.     {
  47.         bool fSetDefault = false;
  48.         while (cpEnum->Next(1, &pToken, NULL) == S_OK)
  49.         {
  50.             CSpDynamicString dstrDesc;
  51.             hr = SpGetDescription(pToken, &dstrDesc);
  52.             if (SUCCEEDED(hr))
  53.             {
  54.                 USES_CONVERSION;
  55.                 LRESULT i = ::SendMessage(hwnd, MsgAddString, 0, (LPARAM)W2T(dstrDesc));
  56.                 if (i == CB_ERR || i == CB_ERRSPACE)    // Note:  CB_ and LB_ errors are identical values...
  57.                 {
  58.                     hr = E_OUTOFMEMORY;
  59.                 }
  60.                 else
  61.                 {
  62.                     ::SendMessage(hwnd, MsgSetItemData, i, (LPARAM)pToken);
  63.                     if (!fSetDefault)
  64.                     {
  65.                         ::SendMessage(hwnd, MsgSetCurSel, i, 0);
  66.                         fSetDefault = true;
  67.                     }
  68.                 }
  69.             }
  70.             if (FAILED(hr))
  71.             {
  72.                 pToken->Release();
  73.             }
  74.         }
  75.     }
  76.     else
  77.     {
  78.         hr = SPERR_NO_MORE_ITEMS;
  79.     }
  80.     return hr;
  81. }
  82. inline HRESULT SpInitTokenComboBox(HWND hwnd, const WCHAR * pszCatName,
  83.                                    const WCHAR * pszRequiredAttrib = NULL, const WCHAR * pszOptionalAttrib = NULL)
  84. {
  85.     return SpInitTokenList(CB_ADDSTRING, CB_SETITEMDATA, CB_SETCURSEL, hwnd, pszCatName, pszRequiredAttrib, pszOptionalAttrib);
  86. }
  87. inline HRESULT SpInitTokenListBox(HWND hwnd, const WCHAR * pszCatName,
  88.                                    const WCHAR * pszRequiredAttrib = NULL, const WCHAR * pszOptionalAttrib = NULL)
  89. {
  90.     return SpInitTokenList(LB_ADDSTRING, LB_SETITEMDATA, LB_SETCURSEL, hwnd, pszCatName, pszRequiredAttrib, pszOptionalAttrib);
  91. }
  92. //
  93. //  Dont call this function directly.  Use SpDestoyTokenComboBox or SpDestroyTokenListBox.
  94. //
  95. inline void SpDestroyTokenList(UINT MsgGetCount, UINT MsgGetItemData, HWND hwnd)
  96. {
  97.     LRESULT c = ::SendMessage(hwnd, MsgGetCount, 0, 0);
  98.     for (LRESULT i = 0; i < c; i++)
  99.     {
  100.         IUnknown * pUnkObj = (IUnknown *)::SendMessage(hwnd, MsgGetItemData, i, 0);
  101.         if (pUnkObj)
  102.         {
  103.             pUnkObj->Release();
  104.         }
  105.     }
  106. }
  107. inline void SpDestroyTokenComboBox(HWND hwnd)
  108. {
  109.     SpDestroyTokenList(CB_GETCOUNT, CB_GETITEMDATA, hwnd);
  110. }
  111. inline void SpDestroyTokenListBox(HWND hwnd)
  112. {
  113.     SpDestroyTokenList(LB_GETCOUNT, LB_GETITEMDATA, hwnd);
  114. }
  115. inline ISpObjectToken * SpGetComboBoxToken(HWND hwnd, WPARAM Index)
  116. {
  117.     return (ISpObjectToken *)::SendMessage(hwnd, CB_GETITEMDATA, Index, 0);
  118. }
  119. inline ISpObjectToken * SpGetListBoxToken(HWND hwnd, WPARAM Index)
  120. {
  121.     return (ISpObjectToken *)::SendMessage(hwnd, LB_GETITEMDATA, Index, 0);
  122. }
  123. inline ISpObjectToken * SpGetCurSelComboBoxToken(HWND hwnd)
  124. {
  125.     LRESULT i = ::SendMessage(hwnd, CB_GETCURSEL, 0, 0);
  126.     return (i == CB_ERR) ? NULL : SpGetComboBoxToken(hwnd, i);
  127. }
  128. inline ISpObjectToken * SpGetCurSelListBoxToken(HWND hwnd)
  129. {
  130.     LRESULT i = ::SendMessage(hwnd, LB_GETCURSEL, 0, 0);
  131.     return (i == LB_ERR) ? NULL : SpGetListBoxToken(hwnd, i);
  132. }
  133. //
  134. //  Don't call this directly.  Use SpUpdateCurSelComboBoxToken or SpUpdateCurSelListBoxToken
  135. //
  136. inline HRESULT SpUpdateCurSelToken(UINT MsgDelString, UINT MsgInsertString, UINT MsgGetItemData, UINT MsgSetItemData, UINT MsgGetCurSel, UINT MsgSetCurSel,
  137.                                    HWND hwnd)
  138. {
  139.     HRESULT hr = S_OK;
  140.     LRESULT i = ::SendMessage(hwnd, MsgGetCurSel, 0, 0);
  141.     if (i != CB_ERR)
  142.     {
  143.         ISpObjectToken * pToken = (ISpObjectToken *)::SendMessage(hwnd, MsgGetItemData, i, 0);
  144.         CSpDynamicString dstrDesc;
  145.         hr = SpGetDescription(pToken, &dstrDesc);
  146.         if (SUCCEEDED(hr))
  147.         {
  148.             USES_CONVERSION;
  149.             ::SendMessage(hwnd, MsgDelString, i, 0);
  150.             ::SendMessage(hwnd, MsgInsertString, i, (LPARAM)W2T(dstrDesc));
  151.             ::SendMessage(hwnd, MsgSetItemData, i, (LPARAM)pToken);
  152.             ::SendMessage(hwnd, MsgSetCurSel, i, 0);
  153.         }
  154.     }
  155.     return hr;
  156. }
  157. inline HRESULT SpUpdateCurSelComboBoxToken(HWND hwnd)
  158. {
  159.     return SpUpdateCurSelToken(CB_DELETESTRING, CB_INSERTSTRING, CB_GETITEMDATA, CB_SETITEMDATA, CB_GETCURSEL, CB_SETCURSEL, hwnd);
  160. }
  161. inline HRESULT SpUpdateCurSelListBoxToken(HWND hwnd)
  162. {
  163.     return SpUpdateCurSelToken(LB_DELETESTRING, LB_INSERTSTRING, LB_GETITEMDATA, LB_SETITEMDATA, LB_GETCURSEL, LB_SETCURSEL, hwnd);
  164. }
  165. inline HRESULT SpAddTokenToList(UINT MsgAddString, UINT MsgSetItemData, UINT MsgSetCurSel, HWND hwnd, ISpObjectToken * pToken)
  166. {
  167.     CSpDynamicString dstrDesc;
  168.     HRESULT hr = SpGetDescription(pToken, &dstrDesc);
  169.     if (SUCCEEDED(hr))
  170.     {
  171.         USES_CONVERSION;
  172.         LRESULT i = ::SendMessage(hwnd, MsgAddString, 0, (LPARAM)W2T(dstrDesc));
  173.         if (i == CB_ERR || i == CB_ERRSPACE)    // Note:  CB_ and LB_ errors are identical values...
  174.         {
  175.             hr = E_OUTOFMEMORY;
  176.         }
  177.         else
  178.         {
  179.             ::SendMessage(hwnd, MsgSetItemData, i, (LPARAM)pToken);
  180.             ::SendMessage(hwnd, MsgSetCurSel, i, 0);
  181.             pToken->AddRef();
  182.         }
  183.     }
  184.     return hr;
  185. }
  186. inline HRESULT SpAddTokenToComboBox(HWND hwnd, ISpObjectToken * pToken)
  187. {
  188.     return SpAddTokenToList(CB_ADDSTRING, CB_SETITEMDATA, CB_SETCURSEL, hwnd, pToken);
  189. }
  190. inline HRESULT SpAddTokenToListBox(HWND hwnd, ISpObjectToken * pToken)
  191. {
  192.     return SpAddTokenToList(LB_ADDSTRING, LB_SETITEMDATA, LB_SETCURSEL, hwnd, pToken);
  193. }
  194. inline HRESULT SpDeleteCurSelToken(UINT MsgGetCurSel, UINT MsgSetCurSel, UINT MsgGetItemData, UINT MsgDeleteString, HWND hwnd)
  195. {
  196.     HRESULT hr = S_OK;
  197.     LRESULT i = ::SendMessage(hwnd, MsgGetCurSel, 0, 0);
  198.     if (i == CB_ERR)
  199.     {
  200.         hr = S_FALSE;
  201.     }
  202.     else
  203.     {
  204.         ISpObjectToken * pToken = (ISpObjectToken *)::SendMessage(hwnd, MsgGetItemData, i, 0);
  205.         if (pToken)
  206.         {
  207.             pToken->Release();
  208.         }
  209.         ::SendMessage(hwnd, MsgDeleteString, i, 0);
  210.         ::SendMessage(hwnd, MsgSetCurSel, i, 0);
  211.     }
  212.     return hr;
  213. }
  214. inline HRESULT SpDeleteCurSelComboBoxToken(HWND hwnd)
  215. {
  216.     return SpDeleteCurSelToken(CB_GETCURSEL, CB_SETCURSEL, CB_GETITEMDATA, CB_DELETESTRING, hwnd);
  217. }
  218. inline HRESULT SpDeleteCurSelListBoxToken(HWND hwnd)
  219. {
  220.     return SpDeleteCurSelToken(LB_GETCURSEL, CB_SETCURSEL, LB_GETITEMDATA, LB_DELETESTRING, hwnd);
  221. }
  222. #endif /* #ifndef SPUIHelp_h -- This must be the last line in the file */