home *** CD-ROM | disk | FTP | other *** search
/ Programming Tool Box / SIMS_2.iso / vb_tools / vbpic3d / vbpic3d.c < prev    next >
C/C++ Source or Header  |  1992-04-20  |  18KB  |  706 lines

  1. #include "windows.h"
  2. #include "vbapi.h"
  3.  
  4.  
  5. #define PAINTTEXT    1
  6. #define PAINTPIC     2
  7. #define PAINTALL     3
  8.  
  9. void PaintControl( HCTL, HWND, WORD );
  10. LONG FAR PASCAL _export PicWndProc( HCTL, HWND, WORD, WORD, LONG );
  11.  
  12. #define OFFSETIN( struc, field )  ( (USHORT)&( ((struc *)0)->field ) )
  13.  
  14. typedef struct {
  15.    HPIC hPicUp;
  16.    HPIC hPicDown;
  17.    HSZ hszWaveFile;
  18.    int Width, Height;
  19.    int MouseX, MouseY, WaveOn;
  20.    int Selected, ButtonDown;
  21.    int Stretch, BorderWidth, WaveLoop;
  22.    int Shadow, Border, WaveStyle;
  23.    HFONT hFont;
  24.    LONG Hilite;
  25.    LONG Lolite;
  26.    long ShadowColor;
  27.    char Caption[ 128 ];
  28. } PICSTRUCT;
  29.  
  30. #define DEREF(hctl) ((PICSTRUCT far *)VBDerefControl(hctl))
  31.  
  32. char MMSystem[] = "MMSYSTEM.DLL";
  33.  
  34. EVENTINFO Event_Click =
  35. {
  36.    "Click",
  37.    0, 0, NULL, NULL
  38. };
  39.  
  40. PEVENTINFO eventlistPicBttn[] =
  41. {
  42.  
  43.    &Event_Click,
  44.    PEVENTINFO_STD_DBLCLICK,
  45.    PEVENTINFO_STD_GOTFOCUS,
  46.    PEVENTINFO_STD_LOSTFOCUS,
  47.    PEVENTINFO_STD_MOUSEDOWN,
  48.    PEVENTINFO_STD_MOUSEMOVE,
  49.    PEVENTINFO_STD_MOUSEUP,
  50.    NULL
  51. };
  52.  
  53. PROPINFO propinfoPictureUp =
  54. {
  55.     "PicUp",
  56.     DT_PICTURE | PF_fGetData | PF_fSetCheck | PF_fSetData | PF_fSaveData,
  57.     0, 0, NULL, 0
  58. };
  59.  
  60. PROPINFO propinfoPictureDown =
  61. {
  62.     "PicDown",
  63.     DT_PICTURE | PF_fGetData | PF_fSetCheck | PF_fSetData | PF_fSaveData,
  64.     sizeof(HPIC), 0, NULL, 0
  65. };
  66.  
  67. PROPINFO prop_Stretch =
  68. {
  69.    "Stretch",
  70.    DT_BOOL | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  71.    0, 0, NULL, 0
  72. };
  73.  
  74. PROPINFO prop_BorderWidth =
  75. {
  76.    "BorderWidth",
  77.    DT_SHORT | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  78.    0, 0, NULL, 0
  79. };
  80.  
  81. PROPINFO prop_TextShadow =
  82. {
  83.    "TextShadow",
  84.    DT_BOOL | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  85.    0, 0, NULL, 0
  86. };
  87.  
  88. PROPINFO prop_ShColor =
  89. {
  90.    "TextShadowCol",
  91.    DT_COLOR | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  92.    0, 0, NULL, 0
  93. };
  94.  
  95. PROPINFO prop_Hilite =
  96. {
  97.    "HiliteColor",
  98.    DT_COLOR | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  99.    0, 0, NULL, 0
  100. };
  101.  
  102. PROPINFO prop_Shadow =
  103. {
  104.    "ShadowColor",
  105.    DT_COLOR | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  106.    0, 0, NULL, 0
  107. };
  108.  
  109. PROPINFO prop_Border =
  110. {
  111.    "Border",
  112.    DT_BOOL | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  113.    0, 0, NULL, 0
  114. };
  115.  
  116. PROPINFO prop_WaveFile =
  117. {
  118.    "WaveFile",
  119.    DT_HSZ | PF_fSetData | PF_fGetData | PF_fSaveData,
  120.    sizeof(HPIC) * 2, 0, NULL, 0
  121. };
  122.  
  123. char WaveStyles[] = "0 - Synchronous\0"\
  124.                   "1 - Asynchrounous\0"\
  125.                   "";
  126.  
  127. PROPINFO prop_WaveStyle =
  128. {
  129.    "WaveStyle",
  130.    DT_ENUM | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  131.    0, 0, 0, WaveStyles, 1
  132. };
  133.  
  134. PROPINFO prop_WaveLoop =
  135. {
  136.    "WaveLoop",
  137.    DT_BOOL | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  138.    0, 0, NULL, 0
  139. };
  140.  
  141. PROPINFO prop_WaveEnabled =
  142. {
  143.    "WaveEnabled",
  144.    DT_BOOL | PF_fSetMsg | PF_fGetMsg | PF_fSaveData,
  145.    0, 0, NULL, 0
  146. };
  147.  
  148. PPROPINFO proplistPicBttn[] =
  149. {
  150.     PPROPINFO_STD_CTLNAME,
  151.     PPROPINFO_STD_INDEX,
  152.     PPROPINFO_STD_PARENT,
  153.     PPROPINFO_STD_BACKCOLOR,
  154.     PPROPINFO_STD_FORECOLOR,
  155.     PPROPINFO_STD_LEFT,
  156.     PPROPINFO_STD_TOP,
  157.     PPROPINFO_STD_WIDTH,
  158.     PPROPINFO_STD_HEIGHT,
  159.     PPROPINFO_STD_ENABLED,
  160.     PPROPINFO_STD_VISIBLE,
  161.     PPROPINFO_STD_MOUSEPOINTER,
  162.     PPROPINFO_STD_CAPTION,
  163.     PPROPINFO_STD_FONTNAME,
  164.     PPROPINFO_STD_FONTSIZE,
  165.     PPROPINFO_STD_FONTBOLD,
  166.     PPROPINFO_STD_FONTITALIC,
  167.     PPROPINFO_STD_FONTSTRIKE,
  168.     PPROPINFO_STD_FONTUNDER,
  169.     PPROPINFO_STD_DRAGMODE,
  170.     PPROPINFO_STD_DRAGICON,
  171.     PPROPINFO_STD_TABINDEX,
  172.     PPROPINFO_STD_TABSTOP,
  173.     PPROPINFO_STD_TAG,
  174.     &propinfoPictureUp,
  175.     &propinfoPictureDown,
  176.     &prop_Stretch,
  177.     &prop_BorderWidth,
  178.     &prop_TextShadow,
  179.     &prop_ShColor,
  180.     &prop_Shadow,
  181.     &prop_Hilite,
  182.     &prop_Border,
  183.     &prop_WaveFile,
  184.     &prop_WaveStyle,
  185.     &prop_WaveLoop,
  186.     &prop_WaveEnabled,
  187.    NULL
  188. };
  189.  
  190. #define PROP_PICUP       24
  191. #define PROP_PICDOWN     25
  192. #define PROP_STRETCH     26
  193. #define PROP_BORDERWIDTH 27
  194. #define PROP_TEXTSHADOW  28
  195. #define PROP_SHCOLOR     29
  196. #define PROP_SHADOW      30
  197. #define PROP_HILITE      31
  198. #define PROP_BORDER      32
  199. #define PROP_WAVEFILE    33
  200. #define PROP_WAVESTYLE   34
  201. #define PROP_WAVELOOP    35
  202. #define PROP_WAVEENABLED 36
  203.  
  204. MODEL modelPicBttn =
  205. {
  206.    VB_VERSION,
  207.    MODEL_fFocusOk | MODEL_fMnemonic,
  208.    (PCTLPROC)PicWndProc,
  209.    NULL,
  210.    WS_CHILD | BS_PUSHBUTTON | BS_OWNERDRAW,
  211.    sizeof(PICSTRUCT),
  212.    8000,
  213.    "Pic3D",
  214.    "Pic3D",
  215.    "button",
  216.    proplistPicBttn,
  217.    eventlistPicBttn
  218. };
  219.  
  220. HANDLE hmodDLL;
  221.  
  222. BOOL FAR PASCAL LibMain( HANDLE hmod, HANDLE segDS, USHORT cbHeapSize )
  223. {
  224.    hmodDLL = hmod;
  225.    UnlockData( 0 );
  226.    return( TRUE );
  227. }
  228.  
  229.  
  230. BOOL FAR PASCAL _export VBINITCC( USHORT usVersion, BOOL fRunTime )
  231. {
  232.    return( VBRegisterModel( hmodDLL, &modelPicBttn ) );
  233. }
  234.  
  235.  
  236. LONG FAR PASCAL _export PicWndProc( HCTL hCtl, HWND hWnd, WORD msg, WORD wParam, LONG lParam )
  237. {
  238.    switch( msg )
  239.    {
  240.       case WM_CREATE:
  241.       {
  242.          PICSTRUCT far *Pi = DEREF( hCtl );
  243.  
  244.          if( ! lstrlen( Pi->Caption ) )
  245.             lstrcpy( (LPSTR)Pi->Caption, "&Text" );
  246.  
  247.          Pi->Shadow = 0;
  248.          Pi->ShadowColor = 0L;
  249.          Pi->Hilite = RGB( 255, 255, 255 );
  250.          Pi->Lolite = RGB( 128, 128, 128 );
  251.          Pi->Border = 1;
  252.          break;
  253.       }
  254.  
  255.       case WM_SIZE:
  256.       {
  257.          PICSTRUCT far *Pi = DEREF( hCtl );
  258.  
  259.          Pi->Width = LOWORD( lParam );
  260.          Pi->Height = HIWORD( lParam );
  261.          break;
  262.       }
  263.  
  264.       case VBM_MNEMONIC:
  265.          PostMessage( hWnd, WM_LBUTTONDOWN, 0, 0L );
  266.          PostMessage( hWnd, WM_LBUTTONUP, 0, 0L );
  267.          break;
  268.  
  269.       case WM_MOUSEMOVE:
  270.       {
  271.          PICSTRUCT far *Pi = DEREF( hCtl );
  272.  
  273.          Pi->MouseX = LOWORD( lParam );
  274.          Pi->MouseY = HIWORD( lParam );
  275.  
  276.          if( LOWORD( lParam ) > Pi->Width || LOWORD( lParam ) < 0 ||
  277.              HIWORD( lParam ) > Pi->Height || HIWORD( lParam ) < 0 )
  278.          {
  279.             if( Pi->Selected && Pi->ButtonDown )
  280.             {
  281.                Pi->ButtonDown = 0;
  282.                InvalidateRect( hWnd, NULL, FALSE );
  283.             }
  284.          }
  285.          else
  286.          {
  287.             if( Pi->Selected && ! Pi->ButtonDown )
  288.             {
  289.                Pi->ButtonDown = 1;
  290.                InvalidateRect( hWnd, NULL, FALSE );
  291.             }
  292.          }
  293.          break;
  294.       }
  295.  
  296.  
  297.       case WM_LBUTTONDOWN:
  298.       {
  299.          PICSTRUCT far *Pi = DEREF( hCtl );
  300.          WORD winVer;
  301.          HANDLE hMM;
  302.          FARPROC lpfnSndPlaySound;
  303.          LPSTR lpWave;
  304.  
  305.          Pi->ButtonDown = 1;
  306.          Pi->Selected = 1;
  307.          SetCapture( hWnd );
  308.          InvalidateRect( hWnd, NULL, FALSE );
  309.          break;
  310.       }
  311.  
  312.       case WM_LBUTTONUP:
  313.       {
  314.          PICSTRUCT far *Pi = DEREF( hCtl );
  315.          WORD winVer;
  316.          LPSTR lpWave;
  317.          HANDLE hMM;
  318.          FARPROC lpfnSndPlaySound;
  319.  
  320.          Pi->ButtonDown = 0;
  321.          Pi->Selected = 0;
  322.  
  323.          InvalidateRect( hWnd, NULL, FALSE );
  324.  
  325.          ReleaseCapture();
  326.  
  327.          if( LOWORD( lParam ) < 0 || LOWORD( lParam ) > Pi->Width ||
  328.              HIWORD(lParam ) < 0 || HIWORD( lParam ) > Pi->Height )
  329.             return( TRUE );
  330.  
  331.          if( Pi->WaveOn != 0 )
  332.          {
  333.             winVer = GetVersion();
  334.             if( HIBYTE( winVer ) >= 10 && LOBYTE( winVer ) >= 3 )
  335.             {
  336.                lpWave = VBDerefHsz( Pi->hszWaveFile );
  337.                if( lstrlen( lpWave ) )
  338.                {
  339.                   hMM = LoadLibrary( MMSystem );
  340.                   if( hMM )
  341.                   {
  342.                      lpfnSndPlaySound = GetProcAddress( hMM, (LPSTR)(long)2 );
  343.                      if( lpfnSndPlaySound )
  344.                         ( *lpfnSndPlaySound )( (LPSTR)lpWave,
  345.                                        (int)8 * ( Pi->WaveLoop != 0 ) );
  346.  
  347.                      FreeLibrary( hMM );
  348.                   }
  349.                }
  350.             }
  351.          }
  352.          VBFireEvent( hCtl, 0, NULL );
  353.          return( TRUE );
  354.       }
  355.  
  356.       case WM_SETTEXT:
  357.       {
  358.          PICSTRUCT far *Pi = DEREF( hCtl );
  359.  
  360.          lstrcpy( Pi->Caption, (LPSTR)lParam );
  361.          InvalidateRect( hWnd, NULL, TRUE );
  362.          break;
  363.       }
  364.  
  365.       case WM_SETFONT:
  366.       {
  367.          PICSTRUCT far *Pi = DEREF( hCtl );
  368.  
  369.          Pi->hFont = wParam;
  370.          if( lParam )
  371.             PaintControl( hCtl, hWnd, PAINTALL );
  372.  
  373.          return( FALSE );
  374.       }
  375.  
  376.       case WM_GETFONT:
  377.       {
  378.          PICSTRUCT far *Pi = DEREF( hCtl );
  379.  
  380.          return( Pi->hFont );
  381.       }
  382.  
  383.       case VBM_CHECKPROPERTY:
  384.       {
  385.          if( wParam == PROP_PICUP || wParam == PROP_PICDOWN )
  386.          {
  387.             PIC pic;
  388.  
  389.             VBGetPic( (HPIC)lParam, &pic );
  390.  
  391.             if( pic.picType == PICTYPE_NONE ||
  392.                 pic.picType == PICTYPE_BITMAP ||
  393.                 pic.picType == PICTYPE_ICON )
  394.             {
  395.                InvalidateRect( hWnd, NULL, TRUE );
  396.                return( FALSE );
  397.             }
  398.             return( 380 );
  399.          }
  400.          break;
  401.       }
  402.  
  403.       case VBN_DRAWITEM:
  404.       {
  405.          LPDRAWITEMSTRUCT Ds = (LPDRAWITEMSTRUCT)lParam;
  406.  
  407.          if( ! ( Ds->itemAction & ODA_SELECT ) && ! ( Ds->itemAction & ODA_DRAWENTIRE ) )
  408.             return( FALSE );
  409.  
  410.          if( ( Ds->itemAction & ODA_FOCUS ) == ODA_FOCUS )
  411.             return( FALSE );
  412.  
  413.          PaintControl( hCtl, hWnd, PAINTALL );
  414.  
  415.          return( FALSE );
  416.       }
  417.  
  418.       case VBM_SETPROPERTY:
  419.       {
  420.          PICSTRUCT far *Pi = DEREF( hCtl );
  421.  
  422.          switch( wParam )
  423.          {
  424.             case PROP_BORDERWIDTH:
  425.                Pi->BorderWidth = LOWORD( lParam ) - 1;
  426.                if( Pi->BorderWidth < 0 )
  427.                   Pi->BorderWidth = 0;
  428.  
  429.                PaintControl( hCtl, hWnd, PAINTALL );
  430.                return( FALSE );
  431.  
  432.             case PROP_STRETCH:
  433.                Pi->Stretch = (BOOL)lParam;
  434.                PaintControl( hCtl, hWnd, PAINTALL );
  435.                return( FALSE );
  436.  
  437.             case PROP_TEXTSHADOW:
  438.                Pi->Shadow = (BOOL)lParam;
  439.                PaintControl( hCtl, hWnd, PAINTALL );
  440.                return( FALSE );
  441.  
  442.             case PROP_SHCOLOR:
  443.                Pi->ShadowColor = lParam;
  444.                PaintControl( hCtl, hWnd, PAINTALL );
  445.                return( FALSE );
  446.  
  447.             case PROP_SHADOW:
  448.                Pi->Lolite = lParam;
  449.                PaintControl( hCtl, hWnd, PAINTALL );
  450.                return( FALSE );
  451.  
  452.             case PROP_HILITE:
  453.                Pi->Hilite = lParam;
  454.                PaintControl( hCtl, hWnd, PAINTALL );
  455.                return( FALSE );
  456.  
  457.             case PROP_BORDER:
  458.                Pi->Border = (BOOL)lParam;
  459.                PaintControl( hCtl, hWnd, PAINTALL );
  460.                return( FALSE );
  461.  
  462.             case PROP_WAVESTYLE:
  463.                Pi->WaveStyle = LOWORD( lParam );
  464.                return( FALSE );
  465.  
  466.             case PROP_WAVELOOP:
  467.                Pi->WaveLoop = LOWORD( lParam );
  468.                return( FALSE );
  469.  
  470.             case PROP_WAVEENABLED:
  471.                Pi->WaveOn = LOWORD( lParam );
  472.                return( FALSE );
  473.          }
  474.          break;
  475.       }
  476.  
  477.       case VBM_GETPROPERTY:
  478.       {
  479.          PICSTRUCT far *Pi = DEREF( hCtl );
  480.  
  481.          switch( wParam )
  482.          {
  483.             case PROP_BORDERWIDTH:
  484.                *(WORD far *)lParam = Pi->BorderWidth + 1;
  485.                return( FALSE );
  486.  
  487.             case PROP_STRETCH:
  488.                *(WORD far *)lParam = Pi->Stretch;
  489.                return( FALSE );
  490.  
  491.             case PROP_TEXTSHADOW:
  492.                *(BOOL far *)lParam = Pi->Shadow;
  493.                return( FALSE );
  494.  
  495.             case PROP_SHCOLOR:
  496.                *(LONG far *)lParam = Pi->ShadowColor;
  497.                return( FALSE );
  498.  
  499.             case PROP_SHADOW:
  500.                *(LONG far *)lParam = Pi->Lolite;
  501.                return( FALSE );
  502.  
  503.             case PROP_HILITE:
  504.                *(LONG far *)lParam = Pi->Hilite;
  505.                return( FALSE );
  506.  
  507.             case PROP_BORDER:
  508.                *(BOOL far *)lParam = Pi->Border;
  509.                return( FALSE );
  510.  
  511.             case PROP_WAVESTYLE:
  512.                *(WORD far *)lParam = Pi->WaveStyle;
  513.                return( FALSE );
  514.  
  515.             case PROP_WAVELOOP:
  516.                *(WORD far *)lParam = Pi->WaveLoop;
  517.                return( FALSE );
  518.  
  519.             case PROP_WAVEENABLED:
  520.                *(WORD far *)lParam = Pi->WaveOn;
  521.                return( FALSE );
  522.          }
  523.          break;
  524.       }
  525.  
  526.       case WM_DESTROY:
  527.       {
  528.          PICSTRUCT far *Pi = DEREF( hCtl );
  529.          LONG lResult;
  530.  
  531.          lResult = VBDefControlProc( hCtl, hWnd, msg, wParam, lParam );
  532.          VBFreePic( Pi->hPicUp );
  533.          VBFreePic( Pi->hPicDown );
  534.          return( lResult );
  535.       }
  536.       break;
  537.    }
  538.    return( VBDefControlProc( hCtl, hWnd, msg, wParam, lParam ) );
  539. }
  540.  
  541.  
  542. void PaintControl( HCTL hCtl, HWND hWnd, WORD Control )
  543. {
  544.    PICSTRUCT far *Pi = DEREF( hCtl );
  545.    HDC hDC;
  546.    HDC mDC;
  547.    TEXTMETRIC tm;
  548.    HPEN hBlackPen;
  549.    HPEN hDkGrayPen;
  550.    HPEN hWhitePen;
  551.    HPIC hPic;
  552.    RECT Rect;
  553.    PIC Pic;
  554.    BITMAP bmp;
  555.    HBRUSH hBrush;
  556.    int len, bWidth, Xpos, Ypos;
  557.    long OldTextColor;
  558.  
  559.    hWhitePen = CreatePen( PS_SOLID, 1, RGB( 255, 255, 255 ) );
  560.    hDkGrayPen = CreatePen( PS_SOLID, 1, RGB( 128, 128, 128 ) );
  561.    hBlackPen = CreatePen( PS_SOLID, 1, RGB( 0, 0, 0 ) );
  562.  
  563.    hDC = GetDC( hWnd );
  564.    SelectObject( hDC, Pi->hFont );
  565.  
  566.    if( lstrlen( Pi->Caption ) )
  567.       GetTextMetrics( hDC, &tm );
  568.    else
  569.       tm.tmHeight = 0;
  570.  
  571.  
  572.    hBrush = SendMessage( GetParent( hWnd ), WM_CTLCOLOR, hDC, MAKELONG( hWnd, 0 ) );
  573.    SelectObject( hDC, hBrush );
  574.  
  575.    len = Pi->Height - tm.tmHeight - 1;
  576.  
  577.    if( Pi->Border )
  578.       SelectObject( hDC, hBlackPen );
  579.    else
  580.       SelectObject( hDC, CreatePen( PS_SOLID, 1, GetBkColor( hDC ) ) );
  581.  
  582.    Rectangle( hDC, 0, 0, Pi->Width, len );
  583.  
  584.    MoveTo( hDC, 0, 0 );
  585.    LineTo( hDC, 0, len - 1 );
  586.    LineTo( hDC, Pi->Width - 1, len - 1 );
  587.    LineTo( hDC, Pi->Width - 1, 0 );
  588.    LineTo( hDC, 0, 0 );
  589.  
  590.    if( ! Pi->Border )
  591.       DeleteObject( SelectObject( hDC, GetStockObject( NULL_PEN ) ) );
  592.  
  593.    bWidth = Pi->BorderWidth;
  594.  
  595.    while( bWidth != -1 )
  596.    {
  597.       if( Pi->ButtonDown )
  598.          SelectObject( hDC, CreatePen( PS_SOLID, 1, Pi->Lolite ) );
  599.       else
  600.          SelectObject( hDC, CreatePen( PS_SOLID, 1, Pi->Hilite ) );
  601.  
  602.       MoveTo( hDC, Pi->Width - 2 - bWidth, 1 + bWidth );
  603.       LineTo( hDC, 1 + bWidth, 1 + bWidth );
  604.       LineTo( hDC, 1 + bWidth, len - 1 - bWidth );
  605.  
  606.       if( ! Pi->ButtonDown )
  607.       {
  608.          DeleteObject( SelectObject( hDC, CreatePen( PS_SOLID, 1, Pi->Lolite ) ) );
  609.  
  610.          MoveTo( hDC, 2 + bWidth, len - 2 - bWidth );
  611.          LineTo( hDC, Pi->Width - 2 - bWidth, len - 2 - bWidth );
  612.          LineTo( hDC, Pi->Width - 2 - bWidth, 1 + bWidth );
  613.       }
  614.       DeleteObject( SelectObject( hDC, GetStockObject( NULL_PEN ) ) );
  615.  
  616.       --bWidth;
  617.    }
  618.  
  619.    if( lstrlen( Pi->Caption ) )
  620.    {
  621.       if( Pi->Shadow )
  622.       {
  623.          Rect.left = 0;
  624.          Rect.right = Pi->Width - 1;
  625.          Rect.top = Pi->Height - tm.tmHeight - 1;
  626.          Rect.bottom = Pi->Height;
  627.  
  628.          OldTextColor = GetTextColor( hDC );
  629.          SetTextColor( hDC, Pi->ShadowColor );
  630.          DrawText( hDC, Pi->Caption, lstrlen( Pi->Caption ), &Rect, DT_CENTER | DT_VCENTER );
  631.          SetTextColor( hDC, OldTextColor );
  632.          SetBkMode( hDC, TRANSPARENT );
  633.       }
  634.  
  635.       Rect.left = 1;
  636.       Rect.right = Pi->Width;
  637.       Rect.top = Pi->Height - tm.tmHeight - 1 + ( Pi->Shadow != 0 );
  638.       Rect.bottom = Pi->Height + ( Pi->Shadow != 0 );
  639.  
  640.       DrawText( hDC, Pi->Caption, lstrlen( Pi->Caption ), &Rect, DT_CENTER | DT_VCENTER );
  641.    }
  642.  
  643.    len = 0;
  644.  
  645.    if( Pi->ButtonDown )
  646.    {
  647.       if( ! Pi->hPicDown )
  648.          hPic = Pi->hPicUp;
  649.       else
  650.          hPic = Pi->hPicDown;
  651.    }
  652.    else
  653.       hPic = Pi->hPicUp;
  654.  
  655.    VBGetPic( hPic, &Pic );
  656.  
  657.    if( Pic.picType == PICTYPE_BITMAP )
  658.    {
  659.       GetObject( Pic.picData.bmp.hbitmap, sizeof(BITMAP), (LPSTR)&bmp );
  660.  
  661.       mDC = CreateCompatibleDC( hDC );
  662.  
  663.       SelectObject( mDC, Pic.picData.bmp.hbitmap );
  664.  
  665.       Xpos = ( Pi->Width - bmp.bmWidth ) / 2;
  666.       Ypos = ( Pi->Height - bmp.bmHeight - tm.tmHeight ) / 2;
  667.       if( Pi->ButtonDown )
  668.       {
  669.          Xpos += Pi->BorderWidth + 1;
  670.          Ypos += Pi->BorderWidth + 1;
  671.       }
  672.  
  673.       if( Pi->Stretch == -1 )
  674.          StretchBlt( hDC, Pi->BorderWidth + 2 + ( Pi->BorderWidth * Pi->ButtonDown ),
  675.                           Pi->BorderWidth + 2 + ( Pi->BorderWidth * Pi->ButtonDown ),
  676.                      Pi->Width - ( 2 * Pi->BorderWidth ) - 4,
  677.                      Pi->Height - tm.tmHeight - ( 2 * Pi->BorderWidth ) - 5,
  678.                      mDC, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY );
  679.       else
  680.          BitBlt( hDC, Xpos, Ypos, bmp.bmWidth, bmp.bmHeight, mDC, 0, 0, SRCCOPY );
  681.  
  682.       DeleteDC( mDC );
  683.    }
  684.  
  685.    if( Pic.picType == PICTYPE_ICON )
  686.    {
  687.       Xpos = ( Pi->Width - 32 ) / 2;
  688.       Ypos = ( Pi->Height - tm.tmHeight - 32 ) / 2;
  689.  
  690.       if( Pi->ButtonDown )
  691.       {
  692.          Xpos += Pi->BorderWidth + 1;
  693.          Ypos += Pi->BorderWidth + 1;
  694.       }
  695.  
  696.       DrawIcon( hDC, Xpos, Ypos, Pic.picData.icon.hicon );
  697.    }
  698.  
  699.    ReleaseDC( hWnd, hDC );
  700.    DeleteObject( hBlackPen );
  701.    DeleteObject( hDkGrayPen );
  702.    DeleteObject( hWhitePen );
  703. }
  704.  
  705.  
  706.