home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 16 / CD_ASCQ_16_0994.iso / news / 4611 / fw16d.ins / SOURCE / CLASSES / BITMAP.PRG < prev    next >
Text File  |  1994-06-10  |  12KB  |  474 lines

  1. #include "FiveWin.ch"
  2. #include "Constant.ch"
  3.  
  4. #define GW_CHILD      5
  5. #define GW_HWNDNEXT   2
  6. #define RT_BITMAP     2
  7.  
  8. #define MB_ICONEXCLAMATION 48
  9.  
  10. static lRegistered := .f.
  11.  
  12. //----------------------------------------------------------------------------//
  13.  
  14. CLASS TBitmap FROM TControl
  15.  
  16.    DATA   nX, nY
  17.    DATA   hBmpPal, cBmpFile, cResName
  18.    DATA   lScroll, lStretch
  19.    DATA   aHotAreas
  20.    DATA   nVStep, nHStep
  21.  
  22.    METHOD New( nTop, nLeft, nWidth, nHeight, cResName, cBmpFile, lNoBorder,;
  23.                oWnd, bLClicked, bRClicked, lScroll, lStretch,;
  24.                oCursor, lUpdate ) CONSTRUCTOR
  25.  
  26.    METHOD ReDefine( nId, cResName, cBmpFile, oWnd, bLClicked, bRClicked,;
  27.                     lStretch, oCursor, lUpdate ) CONSTRUCTOR
  28.  
  29.    METHOD Release()
  30.  
  31.    METHOD Command( nWParam, nLParam ) INLINE ;
  32.                    SendMessage( nLoWord( nLParam ), WM_CLICK, 0, 0 ), 0
  33.  
  34.    METHOD Default()
  35.  
  36.    METHOD GetDlgCode() INLINE nOR( DLGC_WANTARROWS,;
  37.                                    DLGC_WANTCHARS, DLGC_WANTTAB )
  38.  
  39.    METHOD GotFocus() INLINE Super:GotFocus(), ::SetFore()
  40.  
  41.    METHOD HandleEvent( nMsg, nWParam, nLParam )
  42.  
  43.    METHOD Paint()
  44.  
  45.    METHOD Load( cResName, cBmpFile )
  46.  
  47.    METHOD ReLoad( cResName, cBmpFile )
  48.  
  49.    METHOD ReSize( nType, nWidth, nHeight ) INLINE ;
  50.                              ::ScrollAdjust(),;
  51.                              Super:ReSize( nType, nWidth, nHeight )
  52.  
  53.    METHOD SetBMP( cResName )  INLINE ::ReLoad( cResName )
  54.  
  55.    METHOD SetFore() INLINE SetForeBmp( ::hBmpPal )
  56.  
  57.    METHOD LoadBMP( cBmpFile ) INLINE ::ReLoad( , cBmpFile )
  58.  
  59.    METHOD ScrollAdjust()
  60.  
  61.    METHOD nHeight()    INLINE  pBmpHeight( ::hBmpPal )
  62.  
  63.    METHOD Init( hDlg ) INLINE  Super:Init( hDlg ), ::Default()
  64.  
  65.    METHOD nWidth()     INLINE  pBmpWidth( ::hBmpPal )
  66.  
  67.    METHOD LButtonDown( nRow, nCol, nKeyFlags )
  68.  
  69.    METHOD ScrollUp()
  70.    METHOD ScrollLeft()
  71.  
  72.    METHOD ScrollDown() INLINE  ::nX := Min( ::nX + ::nVStep, 0 ),;
  73.                                ::Refresh( .f. )
  74.  
  75.    METHOD ScrollRight() INLINE  ::nY := Min( ::nY + ::nHStep, 0 ),;
  76.                                 ::Refresh( .f. )
  77.  
  78.    METHOD nXExtra() INLINE ::nHeight() - ( ::nBottom - ::nTop ) + 1
  79.    METHOD nYExtra() INLINE ::nWidth()  - ( ::nRight - ::nLeft ) + 1
  80.  
  81.    METHOD VScroll( nWParam, nLParam )
  82.    METHOD HScroll( nWParam, nLParam )
  83.  
  84. ENDCLASS
  85.  
  86. //----------------------------------------------------------------------------//
  87.  
  88. METHOD New( nTop, nLeft, nWidth, nHeight, cResName, cBmpFile, lNoBorder,;
  89.             oWnd, bLClicked, bRClicked, lScroll, lStretch, oCursor,;
  90.             lUpdate ) CLASS TBitmap
  91.  
  92.    DEFAULT lNoBorder := .f., lScroll := .f., lStretch := .f., lUpdate := .f.
  93.  
  94.    ::hBmpPal   = 0
  95.    ::lStretch := lStretch
  96.  
  97.    ::Load( cResName, cBmpFile )
  98.  
  99.    DEFAULT nWidth  := ::nWidth(), ;
  100.            nHeight := ::nHeight()
  101.  
  102.    ::nTop      = nTop * BMP_CHARPIX_H   // 14
  103.    ::nLeft     = nLeft * BMP_CHARPIX_W     // 8
  104.    ::nBottom   = ::nTop + nHeight - 1
  105.    ::nRight    = ::nLeft + nWidth - 1
  106.    ::nX        = 0
  107.    ::nY        = 0
  108.    ::nStyle    = nOR( If( ! lNoBorder, WS_BORDER, 0 ),;
  109.                       If( lScroll, nOR( WS_VSCROLL, WS_HSCROLL ), 0 ),;
  110.                       WS_CHILD, WS_VISIBLE, WS_CLIPSIBLINGS,;
  111.                       WS_CLIPCHILDREN, WS_GROUP )
  112.    ::nId       = ::GetNewId()
  113.    ::oWnd      = oWnd
  114.    ::lCaptured = .f.
  115.    ::lDrag     = .f.
  116.    ::bLClicked = bLClicked
  117.    ::bRClicked = bRClicked
  118.    ::lScroll   = lScroll
  119.    ::aHotAreas = {}
  120.    ::nVStep    = 1
  121.    ::nHStep    = 1
  122.    ::lUpdate   = lUpdate
  123.  
  124.    ::oCursor   = oCursor
  125.  
  126.    if ! lRegistered
  127.       ::Register( nOR( CS_VREDRAW, CS_HREDRAW, CS_GLOBALCLASS ) )
  128.       lRegistered = .t.
  129.    endif
  130.  
  131.    if oWnd:lVisible
  132.       ::Create()
  133.       ::Default()
  134.       ::lVisible = .t.
  135.       oWnd:AddControl( Self )
  136.    else
  137.       oWnd:DefControl( Self )
  138.       ::lVisible  = .f.
  139.    endif
  140.  
  141. return nil
  142.  
  143. //----------------------------------------------------------------------------//
  144.  
  145. METHOD Default() CLASS TBitmap
  146.  
  147.    if ::lScroll == nil
  148.       ::lScroll = WndHasScrolls( ::hWnd )
  149.    endif
  150.  
  151.    if ::lScroll
  152.       DEFINE SCROLLBAR ::oVScroll VERTICAL   OF Self
  153.       DEFINE SCROLLBAR ::oHScroll HORIZONTAL OF Self
  154.       ::ScrollAdjust()
  155.    endif
  156.    
  157.    if ::oFont != nil
  158.       ::SetFont( ::oFont )
  159.    else
  160.       ::SetFont( ::oWnd:oFont )
  161.    endif
  162.  
  163.    // Register the Bitmap for its later destruction on severe error.
  164.    // From resource and file.
  165.  
  166.    PalBmpNew( ::hWnd, ::hBmpPal )
  167.  
  168. return nil
  169.  
  170. //----------------------------------------------------------------------------//
  171.  
  172. METHOD Release() CLASS TBitmap
  173.  
  174.    if ::hBmpPal != 0
  175.       PalBmpFree( ::hBmpPal )
  176.       ::hBmpPal = 0
  177.    endif
  178.  
  179.    Super:Release()
  180.  
  181. return nil
  182.  
  183. //----------------------------------------------------------------------------//
  184.  
  185. METHOD ReDefine( nId, cResName, cBmpFile, oWnd, bLClicked, bRClicked,;
  186.                  lScroll, lStretch, oCursor, lUpdate ) CLASS TBitmap
  187.  
  188.    DEFAULT lScroll := .f., lStretch := .f., lUpdate := .f.
  189.  
  190.    ::nId       = nId
  191.    ::nX        = 0
  192.    ::nY        = 0
  193.    ::lCaptured = .f.
  194.    ::lDrag     = .f.
  195.    ::bLClicked = bLClicked
  196.    ::bRClicked = bRClicked
  197.    ::lScroll   = lScroll
  198.    ::lStretch  = lStretch
  199.    ::aHotAreas = {}
  200.    ::oCursor   = oCursor
  201.    ::oWnd      = oWnd
  202.    ::nVStep    = 1
  203.    ::nHStep    = 1
  204.    ::lUpdate   = lUpdate
  205.  
  206.    ::Load( cResName, cBmpFile )
  207.  
  208.    if ! lRegistered
  209.       ::Register( nOR( CS_VREDRAW, CS_HREDRAW, CS_GLOBALCLASS ) )
  210.       lRegistered = .t.
  211.    endif
  212.  
  213.    if oWnd != nil
  214.       oWnd:DefControl( Self )
  215.    endif
  216.  
  217. return nil
  218.  
  219. //----------------------------------------------------------------------------//
  220.  
  221. METHOD Paint() CLASS TBitmap
  222.  
  223.    if Empty( ::hBmpPal )
  224.       return nil
  225.    endif
  226.  
  227. return If( ::lStretch,;
  228.            PALBMPDraw( ::hWnd, ::nX, ::nY, ::hBmpPal, ;
  229.                        ::nRight - ::nLeft + 1, ::nBottom - ::nTop + 1 ),;
  230.            PALBMPDraw( ::hWnd, ::nX, ::nY, ::hBmpPal ) )
  231.  
  232. //---------------------------------------------------------------------------//
  233.  
  234. METHOD ReLoad( cResName, cBmpFile ) CLASS TBitmap
  235.  
  236.   local lSuccess := ::Load( cResName, cBmpFile )
  237.  
  238.   if lSuccess
  239.      ::ScrollAdjust()
  240.      ::nX = 0
  241.      ::nY = 0
  242.      ::Refresh()
  243.   endif
  244.  
  245. return lSuccess
  246.  
  247. //---------------------------------------------------------------------------//
  248.  
  249. METHOD Load( cResName, cBmpFile ) CLASS TBitmap
  250.  
  251.    local lChanged := .f.
  252.    local hOld     := ::hBmpPal
  253.  
  254.    DEFAULT cResName := ::cResName,;
  255.            cBmpFile := ::cBmpFile
  256.  
  257.    if ! Empty( cResName )
  258.  
  259.        ::hBmpPal := PalBmpLoad( cResName )
  260.        lChanged  := .t.
  261.        cBmpFile  := nil
  262.  
  263.    elseif File( cBmpFile )
  264.  
  265.        ::hBmpPal := PalBmpRead( ::GetDC(), cBmpFile )
  266.        ::ReleaseDC()
  267.        lChanged  := .t.
  268.        cResName  := nil
  269.  
  270.    endif
  271.  
  272.    if lChanged
  273.  
  274.       ::cResName = cResName
  275.       ::cBmpFile = cBmpFile
  276.  
  277.       if ! Empty( hOld )
  278.          PalBmpFree( hOld )
  279.       endif
  280.  
  281.       PalBmpNew( ::hWnd, ::hBmpPal )
  282.  
  283.    endif
  284.    
  285. return lChanged
  286.  
  287. //----------------------------------------------------------------------------//
  288.  
  289. METHOD HandleEvent( nMsg, nWParam, nLParam ) CLASS TBitmap
  290.  
  291.    do case
  292.       case nMsg == WM_LBUTTONDOWN
  293.            return ::LButtonDown( nHiWord( nLParam ), nLoWord( nLParam ), nWParam )
  294.  
  295.       case nMsg == WM_PAINT
  296.            ::ScrollAdjust()      // It generates WM_PAINT when range == 0
  297.            ::BeginPaint()        // so here we avoid 'flicking'
  298.            ::Paint()
  299.            ::EndPaint()
  300.            return 0
  301.  
  302.       case nMsg == WM_RBUTTONDOWN
  303.            return ::RButtonDown( nHiWord( nLParam ), nLoWord( nLParam ), nWParam )
  304.  
  305.       case nMsg == WM_VSCROLL
  306.            return ::VScroll( nWParam, nLParam )
  307.  
  308.       case nMsg == WM_HSCROLL
  309.            return ::HScroll( nWParam, nLParam )
  310.  
  311.       case nMsg == WM_COMMAND
  312.            return ::Command( nWParam, nLParam )
  313.    endcase
  314.  
  315. return Super:HandleEvent( nMsg, nWParam, nLParam )
  316.  
  317. //----------------------------------------------------------------------------//
  318.  
  319. METHOD LButtonDown( nRow, nCol, nKeyFlags ) CLASS TBitmap
  320.  
  321.    if ::lDrag
  322.       return Super:LButtonDown( nRow, nCol, nKeyFlags )
  323.    else
  324.       if ::bLClicked != nil
  325.          Eval( ::bLClicked, nRow, nCol, nKeyFlags )
  326.       endif
  327.    endif
  328.  
  329. return 0     // Already processed
  330.  
  331. //----------------------------------------------------------------------------//
  332.  
  333. METHOD ScrollUp() CLASS TBitmap
  334.  
  335.    local nVisible := ::nBottom - ::nTop - If( ::oHScroll:nMax != 0, 16, 0 )
  336.    local nStep
  337.  
  338.    nStep := ( ::nHeight() + ::nX ) - nVisible
  339.  
  340.    if ::nHeight() > nVisible
  341.       if ::nHeight() + ::nX >= nVisible
  342.          ::nX = ::nX - Min( nStep, ::nVStep )
  343.          ::Refresh( .f. )
  344.       endif
  345.    endif
  346.  
  347. return nil
  348.  
  349. //----------------------------------------------------------------------------//
  350.  
  351. METHOD ScrollLeft() CLASS TBitmap
  352.  
  353.    local nVisible := ::nRight - ::nLeft - If( ::oVScroll:nMax != 0, 16, 0 )
  354.    local nStep
  355.  
  356.    nStep := ( ::nWidth() + ::nY ) - nVisible
  357.  
  358.    if ::nWidth() > nVisible
  359.       if ::nWidth() + ::nY >= nVisible
  360.          ::nY = ::nY - Min( nStep, ::nHStep )
  361.          ::Refresh( .f. )
  362.       endif
  363.    endif
  364.  
  365. return nil
  366.  
  367. //----------------------------------------------------------------------------//
  368.  
  369. METHOD VScroll( nWParam, nLParam ) CLASS TBitmap
  370.  
  371.    do case
  372.       case nWParam == SB_LINEUP
  373.            ::oVScroll:GoUp()
  374.            ::ScrollDown()
  375.  
  376.       case nWParam == SB_LINEDOWN
  377.            ::oVScroll:GoDown()
  378.            ::ScrollUp()
  379.  
  380.       case nWParam == SB_PAGEUP
  381.  
  382.  
  383.       case nWParam == SB_PAGEDOWN
  384.  
  385.  
  386.       case nWParam == SB_TOP
  387.            ::nX = 0
  388.            ::oVScroll:SetPos( 1 )
  389.            ::Refresh( .f. )
  390.  
  391.       case nWParam == SB_BOTTOM
  392.            ::nX = ::nXExtra()
  393.            ::oVScroll:SetPos( ::oVScroll:nMax )
  394.            ::Refresh( .f. )
  395.  
  396.       case nWParam == SB_THUMBPOSITION
  397.            // ::nColPos = nLParam
  398.            // ::oHScroll:SetPos( nLParam )
  399.            // ::Refresh( .f. )
  400.  
  401.       otherwise
  402.            return nil
  403.    endcase
  404.  
  405. return 0
  406.  
  407. //----------------------------------------------------------------------------//
  408.  
  409. METHOD HScroll( nWParam, nLParam ) CLASS TBitmap
  410.  
  411.    do case
  412.       case nWParam == SB_LINEUP
  413.            ::oHScroll:GoUp()
  414.            ::ScrollRight()
  415.  
  416.       case nWParam == SB_LINEDOWN
  417.            ::oHScroll:GoDown()
  418.            ::ScrollLeft()
  419.  
  420.       case nWParam == SB_PAGEUP
  421.  
  422.       case nWParam == SB_PAGEDOWN
  423.  
  424.       case nWParam == SB_TOP
  425.  
  426.       case nWParam == SB_BOTTOM
  427.  
  428.       case nWParam == SB_THUMBPOSITION
  429.  
  430.       otherwise
  431.            return nil
  432.    endcase
  433.  
  434. return 0
  435.  
  436. //----------------------------------------------------------------------------//
  437.  
  438. METHOD ScrollAdjust() CLASS TBitmap
  439.  
  440.    local nVisHeight
  441.    local nVisWidth
  442.    local lHor := .f., lVer := .f.
  443.  
  444.    ::CoorsUpdate()
  445.    nVisHeight = ::nBottom - ::nTop + 1
  446.    nVisWidth  = ::nRight - ::nLeft + 1
  447.  
  448.    if ::lScroll
  449.       if ::nHeight() <= nVisHeight .or. ::lStretch
  450.          ::oVScroll:SetRange( 0, 0 )
  451.          ::nX = 0
  452.          ::nY = 0
  453.       else
  454.          lVer = .t.
  455.       endif
  456.       if ::nWidth() <= nVisWidth .or. ::lStretch
  457.          ::oHScroll:SetRange( 0, 0 )
  458.          ::nX = 0
  459.          ::nY = 0
  460.       else
  461.          lHor = .t.
  462.       endif
  463.       if lVer
  464.          ::oVScroll:SetRange( 0, ::nXExtra() + If( lHor, 16, 0 ) )
  465.       endif
  466.       if lHor
  467.          ::oHScroll:SetRange( 0, ::nYExtra() + If( lVer, 16, 0 ) )
  468.       endif
  469.    endif
  470.  
  471. return nil
  472.  
  473. //----------------------------------------------------------------------------//
  474.