home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / vc98 / mfc / src / winutil.cpp < prev   
C/C++ Source or Header  |  1998-06-16  |  6KB  |  208 lines

  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992-1998 Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Microsoft Foundation Classes Reference and related
  7. // electronic documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Microsoft Foundation Classes product.
  10.  
  11. #include "stdafx.h"
  12. #include <malloc.h>
  13.  
  14. #ifdef AFX_CORE2_SEG
  15. #pragma code_seg(AFX_CORE2_SEG)
  16. #endif
  17.  
  18. #ifdef _DEBUG
  19. #undef THIS_FILE
  20. static char THIS_FILE[] = __FILE__;
  21. #endif
  22.  
  23. /////////////////////////////////////////////////////////////////////////////
  24. // Other helpers
  25.  
  26. BOOL AFXAPI AfxCustomLogFont(UINT nIDS, LOGFONT* pLogFont)
  27. {
  28.     ASSERT(pLogFont != NULL);
  29.     ASSERT(nIDS != 0);
  30.  
  31.     TCHAR szFontInfo[256];
  32.     if (!AfxLoadString(nIDS, szFontInfo))
  33.         return FALSE;
  34.  
  35.     LPTSTR lpszSize = _tcschr(szFontInfo, '\n');
  36.     if (lpszSize != NULL)
  37.     {
  38.         // get point size and convert to pixels
  39.         pLogFont->lfHeight = _ttoi(lpszSize+1);
  40.         pLogFont->lfHeight =
  41.             MulDiv(pLogFont->lfHeight, afxData.cyPixelsPerInch, 72);
  42.         *lpszSize = '\0';
  43.     }
  44.     lstrcpyn(pLogFont->lfFaceName, szFontInfo, LF_FACESIZE);
  45.     return TRUE;
  46. }
  47.  
  48. BOOL AFXAPI _AfxIsComboBoxControl(HWND hWnd, UINT nStyle)
  49. {
  50.     if (hWnd == NULL)
  51.         return FALSE;
  52.     // do cheap style compare first
  53.     if ((UINT)(::GetWindowLong(hWnd, GWL_STYLE) & 0x0F) != nStyle)
  54.         return FALSE;
  55.  
  56.     // do expensive classname compare next
  57.     TCHAR szCompare[_countof("combobox")+1];
  58.     ::GetClassName(hWnd, szCompare, _countof(szCompare));
  59.     return lstrcmpi(szCompare, _T("combobox")) == 0;
  60. }
  61.  
  62. BOOL AFXAPI _AfxCompareClassName(HWND hWnd, LPCTSTR lpszClassName)
  63. {
  64.     ASSERT(::IsWindow(hWnd));
  65.     TCHAR szTemp[32];
  66.     ::GetClassName(hWnd, szTemp, _countof(szTemp));
  67.     return lstrcmpi(szTemp, lpszClassName) == 0;
  68. }
  69.  
  70. HWND AFXAPI _AfxChildWindowFromPoint(HWND hWnd, POINT pt)
  71. {
  72.     ASSERT(hWnd != NULL);
  73.  
  74.     // check child windows
  75.     ::ClientToScreen(hWnd, &pt);
  76.     HWND hWndChild = ::GetWindow(hWnd, GW_CHILD);
  77.     for (; hWndChild != NULL; hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT))
  78.     {
  79.         if (_AfxGetDlgCtrlID(hWndChild) != (WORD)-1 &&
  80.             (::GetWindowLong(hWndChild, GWL_STYLE) & WS_VISIBLE))
  81.         {
  82.             // see if point hits the child window
  83.             CRect rect;
  84.             ::GetWindowRect(hWndChild, rect);
  85.             if (rect.PtInRect(pt))
  86.                 return hWndChild;
  87.         }
  88.     }
  89.  
  90.     return NULL;    // not found
  91. }
  92.  
  93. void AFXAPI AfxSetWindowText(HWND hWndCtrl, LPCTSTR lpszNew)
  94. {
  95.     int nNewLen = lstrlen(lpszNew);
  96.     TCHAR szOld[256];
  97.     // fast check to see if text really changes (reduces flash in controls)
  98.     if (nNewLen > _countof(szOld) ||
  99.         ::GetWindowText(hWndCtrl, szOld, _countof(szOld)) != nNewLen ||
  100.         lstrcmp(szOld, lpszNew) != 0)
  101.     {
  102.         // change it
  103.         ::SetWindowText(hWndCtrl, lpszNew);
  104.     }
  105. }
  106.  
  107. void AFXAPI AfxDeleteObject(HGDIOBJ* pObject)
  108. {
  109.     ASSERT(pObject != NULL);
  110.     if (*pObject != NULL)
  111.     {
  112.         DeleteObject(*pObject);
  113.         *pObject = NULL;
  114.     }
  115. }
  116.  
  117. void AFXAPI AfxCancelModes(HWND hWndRcvr)
  118. {
  119.     // if we receive a message destined for a window, cancel any combobox
  120.     //  popups that could be in toolbars or dialog bars
  121.     HWND hWndCancel = ::GetFocus();
  122.     if (hWndCancel == NULL)
  123.         return;     // nothing to cancel
  124.  
  125.     if (hWndCancel == hWndRcvr)
  126.         return;     // let input go to window with focus
  127.  
  128.     // focus is in part of a combo-box
  129.     if (!_AfxIsComboBoxControl(hWndCancel, (UINT)CBS_DROPDOWNLIST))
  130.     {
  131.         // check as a dropdown
  132.         hWndCancel = ::GetParent(hWndCancel);   // parent of edit is combo
  133.         if (hWndCancel == hWndRcvr)
  134.             return;     // let input go to part of combo
  135.  
  136.         if (!_AfxIsComboBoxControl(hWndCancel, (UINT)CBS_DROPDOWN))
  137.             return;     // not a combo-box that is active
  138.     }
  139.  
  140.     // combo-box is active, but if receiver is a popup, do nothing
  141.     if (hWndRcvr != NULL &&
  142.       (::GetWindowLong(hWndRcvr, GWL_STYLE) & WS_CHILD) != 0 &&
  143.       ::GetParent(hWndRcvr) == ::GetDesktopWindow())
  144.         return;
  145.  
  146.     // finally, we should cancel the mode!
  147.     ::SendMessage(hWndCancel, CB_SHOWDROPDOWN, FALSE, 0L);
  148. }
  149.  
  150. void AFXAPI AfxGlobalFree(HGLOBAL hGlobal)
  151. {
  152.     if (hGlobal == NULL)
  153.         return;
  154.  
  155.     // avoid bogus warning error messages from various debugging tools
  156.     ASSERT(GlobalFlags(hGlobal) != GMEM_INVALID_HANDLE);
  157.     UINT nCount = GlobalFlags(hGlobal) & GMEM_LOCKCOUNT;
  158.     while (nCount--)
  159.         GlobalUnlock(hGlobal);
  160.  
  161.     // finally, really free the handle
  162.     GlobalFree(hGlobal);
  163. }
  164.  
  165. /////////////////////////////////////////////////////////////////////////////
  166. // Special new handler for safety pool on temp maps
  167.  
  168. #ifndef _AFX_PORTABLE
  169.  
  170. #define MIN_MALLOC_OVERHEAD 4   // LocalAlloc or other overhead
  171.  
  172. int AFX_CDECL AfxCriticalNewHandler(size_t nSize)
  173.     // nSize is already rounded
  174. {
  175.     // called during critical memory allocation
  176.     //  free up part of the app's safety cache
  177.     TRACE0("Warning: Critical memory allocation failed!\n");
  178.     _AFX_THREAD_STATE* pThreadState = AfxGetThreadState();
  179.     if (pThreadState != NULL && pThreadState->m_pSafetyPoolBuffer != NULL)
  180.     {
  181.         size_t nOldBufferSize = _msize(pThreadState->m_pSafetyPoolBuffer);
  182.         if (nOldBufferSize <= nSize + MIN_MALLOC_OVERHEAD)
  183.         {
  184.             // give it all up
  185.             TRACE0("Warning: Freeing application's memory safety pool!\n");
  186.             free(pThreadState->m_pSafetyPoolBuffer);
  187.             pThreadState->m_pSafetyPoolBuffer = NULL;
  188.         }
  189.         else
  190.         {
  191.             BOOL bEnable = AfxEnableMemoryTracking(FALSE);
  192.             _expand(pThreadState->m_pSafetyPoolBuffer,
  193.                 nOldBufferSize - (nSize + MIN_MALLOC_OVERHEAD));
  194.             AfxEnableMemoryTracking(bEnable);
  195.             TRACE3("Warning: Shrinking safety pool from %d to %d to satisfy request of %d bytes.\n",
  196.                  nOldBufferSize, _msize(pThreadState->m_pSafetyPoolBuffer), nSize);
  197.         }
  198.         return 1;       // retry it
  199.     }
  200.  
  201.     TRACE0("ERROR: Critical memory allocation from safety pool failed!\n");
  202.     AfxThrowMemoryException();      // oops
  203.     return 0;
  204. }
  205. #endif // !_AFX_PORTABLE
  206.  
  207. /////////////////////////////////////////////////////////////////////////////
  208.