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

Windows编程

开发平台:

Visual C++

  1. /******************************************************************************
  2. *       This is a part of the Microsoft Source Code Samples. 
  3. *       Copyright (C) 1993-1997 Microsoft Corporation.
  4. *       All rights reserved. 
  5. *       This source code is only intended as a supplement to 
  6. *       Microsoft Development Tools and/or WinHelp documentation.
  7. *       See these sources for detailed information regarding the 
  8. *       Microsoft samples programs.
  9. ******************************************************************************/
  10. /****************************** Module Header *******************************
  11. * Module Name: reslist.c
  12. *
  13. * Contains routines to manage the linked list of resources.
  14. *
  15. * Functions:
  16. *   FindDialog()
  17. *   AllocResLink()
  18. *   RestoreDialog()
  19. *   FreeRes()
  20. *   FreeResList()
  21. *   FreeResLink()
  22. *   DeleteDialogResource()
  23. *
  24. * Comments:
  25. *
  26. ****************************************************************************/
  27. #include "dlgedit.h"
  28. #include "dlgfuncs.h"
  29. #include "dlgextrn.h"
  30. #include <stdlib.h>
  31. #include <string.h>
  32. /************************************************************************
  33. * FindDialog
  34. *
  35. * This function steps through the linked list of resources looking
  36. * for the dialog resource with the given name.  This name can be either
  37. * a string or an ordinal.  Strings are compared without regard to case.
  38. *
  39. * When looking at the dialog names in the resources, if the dialog
  40. * resource is the current one, it will compare the current name for the
  41. * dialog instead of the name that is stored in the resource.  This is
  42. * because the name in the resource could be out of date with respect
  43. * to the current name of the dialog being edited.  This happens when
  44. * the user changes the dialog's name, but has not yet done an action
  45. * that causes the resource to be synched, such as a File/Save, for
  46. * instance.
  47. *
  48. * Arguments:
  49. *   LPTSTR pszDlgName    - Name or ordinal of the dialog to find.
  50. *
  51. * Returns:
  52. *   TRUE if a dialog with that name is found, FALSE if not.
  53. *
  54. ************************************************************************/
  55. BOOL FindDialog(
  56.     LPTSTR pszDlgName)
  57. {
  58.     PRESLINK prl;
  59.     if (gfEditingDlg && NameOrdCmp(gcd.pszDlgName, pszDlgName) == 0)
  60.         return TRUE;
  61.     for (prl = gprlHead; prl; prl = prl->prlNext) {
  62.         /*
  63.          * Is this a dialog resource and do they compare?
  64.          */
  65.         if (prl->fDlgResource && prl != gcd.prl &&
  66.                 NameOrdCmp(prl->pszName, pszDlgName) == 0)
  67.             break;
  68.     }
  69.     return prl ? TRUE : FALSE;
  70. }
  71. /************************************************************************
  72. * AllocResLink
  73. *
  74. * This function allocates a new RESLINK structure for the linked list
  75. * of resources.  It allocates local memory for the link, allocates
  76. * and fills global memory with the given resource data and initializes
  77. * the fields of the structure.  The link is not added to the list,
  78. * however.
  79. *
  80. * Returns:
  81. *   A pointer to the newly allocated RESLINK structure, or NULL if
  82. *   an error occurs.
  83. *
  84. ************************************************************************/
  85. PRESLINK AllocResLink(
  86.     PRES pRes)
  87. {
  88.     PRESLINK prl;
  89.     PRES pResNew;
  90.     PRES2 pRes2;
  91.     LPTSTR pszName;
  92.     INT cbName;
  93.     LPTSTR pszType;
  94.     if (!(prl = (PRESLINK)MyAlloc(sizeof(RESLINK))))
  95.         return NULL;
  96.     prl->prlNext = NULL;
  97.     prl->cbRes = ResourceSize(pRes);
  98.     if (!(prl->hRes = GlobalAlloc(GMEM_MOVEABLE, prl->cbRes))) {
  99.         MyFree(prl);
  100.         Message(MSG_OUTOFMEMORY);
  101.         return NULL;
  102.     }
  103.     pResNew = (PRES)GlobalLock(prl->hRes);
  104.     memcpy(pResNew, pRes, prl->cbRes);
  105.     GlobalUnlock(prl->hRes);
  106.     pszType = ResourceType(pRes);
  107.     if (IsOrd(pszType) && OrdID(pszType) == ORDID_RT_DIALOG) {
  108.         prl->fDlgResource = TRUE;
  109.         pszName = ResourceName(pRes);
  110.         cbName = NameOrdLen(pszName);
  111.         if (!(prl->pszName = MyAlloc(cbName))) {
  112.             GlobalFree(prl->hRes);
  113.             MyFree(prl);
  114.             return NULL;
  115.         }
  116.         NameOrdCpy(prl->pszName, pszName);
  117.         pRes2 = ResourcePart2(pRes);
  118.         prl->wLanguage = pRes2->LanguageId;
  119.     }
  120.     else {
  121.         prl->fDlgResource = FALSE;
  122.         prl->pszName = NULL;
  123.         prl->wLanguage = 0;
  124.     }
  125.     return prl;
  126. }
  127. /****************************************************************************
  128. * RestoreDialog
  129. *
  130. * This function is used to restore the current dialog to the condition
  131. * that it was in just before it was last chosen to edit.
  132. *
  133. ****************************************************************************/
  134. VOID RestoreDialog(VOID)
  135. {
  136.     PRESLINK prlSave;
  137.     if (Message(MSG_RESTOREDIALOG) == IDYES) {
  138.         prlSave = gcd.prl;
  139.         DeleteDialog(FALSE);
  140.         ResLinkToDialog(prlSave);
  141.     }
  142. }
  143. /****************************************************************************
  144. * FreeRes
  145. *
  146. * This frees the entire list of resources and deletes the dialog box
  147. * being edited.
  148. *
  149. ****************************************************************************/
  150. VOID FreeRes(VOID)
  151. {
  152.     CancelSelection(TRUE);
  153.     if (gfEditingDlg)
  154.         DeleteDialog(FALSE);
  155.     FreeResList();
  156.     pszResFile = NULL;
  157.     gfResChged = FALSE;
  158. }
  159. /****************************************************************************
  160. * FreeResList
  161. *
  162. * This function frees the entire resource list.
  163. *
  164. ****************************************************************************/
  165. VOID FreeResList(VOID)
  166. {
  167.     PRESLINK prl;
  168.     PRESLINK prlNext;
  169.     for (prl = gprlHead; prl; prl = prlNext) {
  170.         prlNext = prl->prlNext;
  171.         FreeResLink(prl);
  172.     }
  173.     gprlHead = NULL;
  174. }
  175. /****************************************************************************
  176. * FreeResLink
  177. *
  178. * This frees a linked resource structure and everything that it
  179. * contains.  It does not close up the linked list, however.
  180. *
  181. * Arguments:
  182. *   PRESLINK prl - Points to the resource link to free.
  183. *
  184. ****************************************************************************/
  185. VOID FreeResLink(
  186.     PRESLINK prl)
  187. {
  188.     if (prl->pszName)
  189.         MyFree(prl->pszName);
  190.     if (prl->hRes)
  191.         GlobalFree(prl->hRes);
  192.     MyFree(prl);
  193. }
  194. /************************************************************************
  195. * DeleteDialogResource
  196. *
  197. * This function deletes the current dialog from the linked list of
  198. * resources.  It handles the case where the current dialog is not
  199. * yet in the list.
  200. *
  201. ************************************************************************/
  202. VOID DeleteDialogResource(VOID)
  203. {
  204.     PRESLINK prl;
  205.     PRESLINK prlPrev;
  206.     /*
  207.      * Does a link for the current dialog exist?
  208.      */
  209.     if (gcd.prl) {
  210.         /*
  211.          * Find the existing link and get it's previous link.
  212.          */
  213.         for (prl = gprlHead, prlPrev = NULL; prl && prl != gcd.prl;
  214.                 prlPrev = prl, prl = prl->prlNext)
  215.             ;
  216.         /*
  217.          * Close up the linked list.
  218.          */
  219.         if (prlPrev)
  220.             prlPrev->prlNext = gcd.prl->prlNext;
  221.         else
  222.             gprlHead = gcd.prl->prlNext;
  223.         /*
  224.          * Delete the link.
  225.          */
  226.         FreeResLink(gcd.prl);
  227.         gcd.prl = NULL;
  228.     }
  229. }
  230. /****************************************************************************
  231. *
  232. * Stubs for the C runtime international calls that are not implemented yet.
  233. * These should be removed once the C runtime international library
  234. * is dropped to NT.
  235. *
  236. ****************************************************************************/
  237. LPWSTR itoaw(
  238.     INT value,
  239.     LPWSTR string,
  240.     INT radix)
  241. {
  242.     CHAR szAnsi[17];
  243.     itoa(value, szAnsi, radix);
  244.     MultiByteToWideChar(CP_ACP, 0, szAnsi, -1, string, 17);
  245.     return string;
  246. }
  247. INT awtoi(
  248.     LPWSTR string)
  249. {
  250.     CHAR szAnsi[17];
  251.     BOOL fDefCharUsed;
  252.     WideCharToMultiByte(CP_ACP, 0, string, -1, szAnsi, 17, NULL, &fDefCharUsed);
  253.     return atoi(szAnsi);
  254. }