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

Windows编程

开发平台:

Visual C++

  1. /*****************************************************************************
  2. *
  3. *  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  4. *  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
  5. *  TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR
  6. *  A PARTICULAR PURPOSE.
  7. *
  8. *  Copyright (C) 1993 - 1997 Microsoft Corporation. All Rights Reserved.
  9. *
  10. ******************************************************************************
  11. *
  12. * UiUtils.C
  13. *
  14. * UI utility routines
  15. *
  16. *****************************************************************************/
  17. #pragma warning(disable:4756)
  18. #define _INC_SHELLAPI
  19. #include <windows.h>
  20. #undef _INC_SHELLAPI
  21. #include <shellapi.h>
  22. #include <windowsx.h>
  23. #include <mmsystem.h>
  24. #include <commdlg.h>
  25. #include <commctrl.h>
  26. #include <ctype.h>
  27. #include "debug.h"
  28. #include "MIDIPlyr.H"
  29. static char BCODE           gszErrFmt[]             = "%s:n%s";
  30. static char BCODE           gszFace[]               = "arial";
  31. static char                 gszErrDescTxt[256];
  32. static char                 gszErrCodeTxt[256];
  33. static char                 gszErrStr[512];
  34. /*****************************************************************************
  35. *
  36. * Error
  37. *
  38. * Puts up a general error dialog
  39. *
  40. * hWnd                      - Handle of the owner window
  41. * nErrDesc                  - id into the string table of the message
  42. * mmrc                      - Return code from MMSYSTEM or lower layer
  43. *                             which caused the error.
  44. *
  45. * Just formats and puts up an error dialog.
  46. *
  47. * For convenience, all of the sequencer functions return MMSYSERR_ or
  48. * MCIERR_ codes, so we can use mciGetErrorString instead of inventing
  49. * our own error messages again.
  50. *
  51. *****************************************************************************/
  52. VOID FNLOCAL Error(
  53.     HWND                    hWnd,                             
  54.     int                     nErrDesc,
  55.     MMRESULT                mmrc)
  56. {
  57.     LoadString(ghInst, nErrDesc, gszErrDescTxt, sizeof(gszErrDescTxt));
  58.     mciGetErrorString(mmrc, gszErrCodeTxt, sizeof(gszErrCodeTxt));
  59.     
  60.     wsprintf(gszErrStr, gszErrFmt, (LPSTR)gszErrDescTxt, (LPSTR)gszErrCodeTxt);
  61.     MessageBox(hWnd, gszErrStr, gszAppLongName, MB_ICONEXCLAMATION|MB_OK);
  62. }
  63. /*****************************************************************************
  64. *
  65. * MessagePump
  66. *
  67. * Process messages
  68. *
  69. * This function is called when, in certain cases, we need to wait for a
  70. * window callback to complete. Since callbacks are posted, not sent, we
  71. * need to process messages while waiting.
  72. *
  73. * Note that some documentation refers to this operation as a 'directed
  74. * yield' if messages are being processed for a particular window. This
  75. * is misleading; Yield() merely allows other tasks in the system to run
  76. * and does absolutely nothing to the message queue.
  77. *
  78. *****************************************************************************/
  79. VOID NEAR PASCAL MessagePump(
  80.     VOID)
  81. {
  82.     MSG                     msg;
  83.     while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  84.     {
  85.         TranslateMessage(&msg);
  86.         DispatchMessage(&msg); 
  87.     }
  88. }
  89. /*****************************************************************************
  90. *
  91. * EmbossedTextOut
  92. *
  93. * Draw embossed text in the given device context
  94. *
  95. * hDC                       - hDC to draw in
  96. * x, y                      - Upper left corner of text
  97. * lpsz                      - Pointer to the text
  98. * cb                        - Length of text
  99. * crText                    - Color for text face
  100. * crShadow                  - Color for text shadow
  101. * cx, cy                    - Offset for shadow
  102. *
  103. * The text will be drawn with the currently selected font.
  104. *
  105. * If cb == -1, the lstrlen(lpsz) will be used.
  106. *
  107. * If crText == -1, COLOR_BTNTEXT will be used.
  108. *
  109. * If crShadow == -1, COLOR_BTNSHADOW will be used.
  110. *
  111. *****************************************************************************/
  112. VOID NEAR PASCAL EmbossedTextOut(
  113.     HDC                     hDC,
  114.     int                     x,
  115.     int                     y,
  116.     LPSTR                   lpsz,
  117.     UINT                    cb,
  118.     COLORREF                crText,
  119.     COLORREF                crShadow,
  120.     int                     cx,
  121.     int                     cy)
  122. {
  123.     COLORREF                crOld;
  124.     UINT                    uMode;
  125.     SIZE                    sizeText;
  126.     RECT                    rcText;
  127.     /* If text length is -1, use lstrlen to get the length
  128.     ** of the text.
  129.     */
  130.     if (cb == -1)
  131.         cb = lstrlen(lpsz);
  132.     /* If the shadow or text color is -1, use the
  133.     ** system color for that one.
  134.     */
  135.     if (crShadow == (COLORREF)-1)
  136.         crShadow = GetSysColor (COLOR_BTNSHADOW);
  137.     if (crText == (COLORREF)-1)
  138.         crText = GetSysColor (COLOR_BTNTEXT);
  139.     /* setup the DC, saving off the old values
  140.     */
  141.     uMode = SetBkMode(hDC, OPAQUE);
  142.     crOld = SetTextColor(hDC, crShadow);
  143.     /* Draw the text at the desired offset using the
  144.     ** shadow color, then again at the normal position
  145.     ** using the text color.  This will the text an 'Embossed'
  146.     ** or 'drop shadowed' look depending on what shadow color
  147.     ** and offset are used.
  148.     */
  149.     GetTextExtentPoint32(hDC, lpsz, cb, &sizeText);
  150.     rcText.left   = x;    rcText.right  = x+cx+sizeText.cx; 
  151.     rcText.top    = y;    rcText.bottom = y+cy+sizeText.cy; 
  152.     ExtTextOut(hDC, x+cx, y+cy, ETO_OPAQUE, &rcText, lpsz, cb, NULL);
  153.     SetBkMode(hDC, TRANSPARENT);
  154.     SetTextColor(hDC, crText);
  155.     ExtTextOut(hDC, x, y, 0, NULL, lpsz, cb, NULL);
  156.     /* restore the DC
  157.     */
  158.     SetTextColor(hDC, crOld);
  159.     SetBkMode(hDC, uMode);
  160. }
  161. /*****************************************************************************
  162. *
  163. * CreateScaledFont
  164. *
  165. * Create a font scaled so that the given string will fit in the given
  166. * rect, but be as large as possible while maintaining correct aspect ratio.
  167. *
  168. * hDC                       - DC to calculate font for
  169. * lpRect                    - Rectangle to fit text into
  170. * lpszFormat                - Format string to fit into rect
  171. * anPosX[]                  - Will contain the X coordinates for each char
  172. * anPosY                    - Will contain the Y coordinate for the string
  173. *
  174. * Returns HFONT or NULL if one could not be created 
  175. *
  176. *****************************************************************************/
  177. HFONT NEAR PASCAL CreateScaledFont(
  178.     HDC                     hDC,
  179.     LPRECT                  lpRect,
  180.     LPSTR                   lpszFormat,
  181.     int                     anPosX[],
  182.     int*                    nPosY)                                                        
  183. {
  184.     LOGFONT                 lf;
  185.     HFONT                   hFont;
  186.     HFONT                   h;
  187.     LONG                    FormatWidth;
  188.     LONG                    ScaledClientWidth;
  189.     LONG                    ScaledClientHeight;
  190.     LONG                    AspectN;
  191.     LONG                    AspectD;
  192.     int                     nPosX;
  193.     UINT                    cb;
  194.     UINT                    ii;
  195.     UINT                    jj;
  196.     SIZE                    size;
  197.     ScaledClientHeight =  ((lpRect->bottom - lpRect->top)) * 3 / 4;
  198.     ScaledClientWidth  =  ((lpRect->right  - lpRect->left)) * 3 / 4;
  199.     
  200.     _fmemset(&lf, 0, sizeof(lf));
  201.     lf.lfHeight         = -(int)ScaledClientHeight;
  202.     lf.lfWeight         = FW_BOLD;
  203.     lf.lfCharSet        = ANSI_CHARSET;
  204.     lf.lfClipPrecision  = CLIP_DEFAULT_PRECIS;
  205.     lf.lfQuality        = PROOF_QUALITY;
  206.     lf.lfPitchAndFamily = FF_ROMAN|DEFAULT_PITCH;
  207.     lstrcpy(lf.lfFaceName, gszFace);
  208.     
  209.     hFont = CreateFontIndirect(&lf);
  210.     h = SelectObject(hDC, hFont);
  211.     cb = lstrlen(lpszFormat);
  212.     GetTextExtentPoint(hDC, lpszFormat, cb, &size);
  213.     AspectN = (LONG)size.cx;
  214.     AspectD = (LONG)size.cy;
  215.     
  216.     FormatWidth = (ScaledClientHeight*AspectN)/AspectD;
  217.     if (FormatWidth > ScaledClientWidth)
  218.     {
  219.         ScaledClientHeight =
  220.             (ScaledClientWidth*AspectD)/AspectN;
  221.      SelectObject(hDC, h);
  222.         DeleteObject(hFont);
  223.         
  224.         lf.lfHeight = -(int)ScaledClientHeight;
  225.         hFont = CreateFontIndirect(&lf);
  226.         SelectObject(hDC, hFont);
  227.         GetTextExtentPoint(hDC, lpszFormat, cb, &size);
  228.     }
  229.     
  230.     *nPosY  = grcTWnd.top  + (grcTWnd.bottom- grcTWnd.top  - size.cy)/2;
  231.     nPosX   = grcTWnd.left + (grcTWnd.right - grcTWnd.left - size.cx)/2;
  232.     ii = 0;
  233.     for (jj=0; jj < cb; jj++)
  234.     {
  235.         if (jj != 0)
  236.             GetTextExtentPoint(hDC, lpszFormat, jj, &size);
  237.         else
  238.             size.cx = 0;
  239.         
  240.         anPosX[ii++] = nPosX + size.cx;
  241.     }
  242.     SelectObject(hDC, h);
  243.     return hFont;
  244. }