home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / vos2-121.zip / v / srcos2 / vcanvas.cpp < prev    next >
C/C++ Source or Header  |  1999-02-14  |  20KB  |  593 lines

  1. //===============================================================
  2. // vCanvas - a scrolling window canvas for drawing
  3. //
  4. // Copyright (C) 1995-1999  Bruce E. Wampler
  5. //
  6. // This file is part of the V C++ GUI Framework, and is covered
  7. // under the terms of the GNU Library General Public License,
  8. // Version 2. This library has NO WARRANTY. See the source file
  9. // vapp.cxx for more complete information about license terms.
  10. //===============================================================
  11. #include <v/vos2.h>            // for OS/2 stuff
  12. #include <v/vcanvas.h>         // our header
  13. #include <v/vwindow.h>         // need to use some vwindow stuff
  14.  
  15.   VCursor vCanvasPane::_currentCursor = -1;  // for cursor
  16.  
  17. //================>>> vCanvasPane::vCanvasPane <<<========================
  18.   vCanvasPane::vCanvasPane(PaneType pt) : vPane(pt)
  19.   {
  20.     SysDebug(Constructor,"vCanvasPane::vCanvasPane() constructor\n")
  21.     _cpDC = 0;         // no pane DC
  22.     _currentCursor = VC_Arrow;
  23.   }
  24. //================>>> vCanvasPane::~vCanvasPane <<<========================
  25.   vCanvasPane::~vCanvasPane()
  26.   {
  27.     SysDebug(Destructor,"vCanvasPane::~vCanvasPane() destructor\n")
  28.     if (_cpDC != 0)
  29.       delete _cpDC;   // free the DC
  30.   }
  31.  
  32. //==================>>> vCanvasPane::initialize <<<==========================
  33. // pWidget is client window handle
  34. //
  35.   void vCanvasPane::initialize(vWindow* pWindow, HWND pWidget)
  36.   {
  37.     _HScrlHwnd = 0;   // no scroll bar to start
  38.     _HScrlShown = 1;
  39.     _HScrlTop =  0;
  40.     _VScrlHwnd = 0;   // no scroll bar to start
  41.     _VScrlShown = 1;
  42.     _VScrlTop =  0;
  43.     // now, build the items in the widget provided
  44.     vPane::initialize(pWindow, pWidget);       // initialize base class
  45.     pWindow->_canvasPane = this;               // easy access to/from window
  46.  
  47.     _hasFocus = 0;     // we don't start out with focus
  48.     _drawWindow = pWindow->winHwnd();           // frame window handle
  49.     _drawCanvas = pWidget;                      // client window handle
  50.     // set the height and width of our window
  51.     RECTL rc;
  52.     // CAUTION: returned rc coords are inclusive/exclusive
  53.     WinQueryWindowRect(_drawCanvas, &rc);
  54.     _height = rc.yTop - rc.yBottom;    // update the local stuff
  55.     _width = rc.xRight - rc.xLeft;
  56.  
  57.     // After the drawing widget has been created, we can create
  58.     // the V DC for it to use.
  59.     CreateDC();
  60.     _parentWin->_WinHeight = _height;
  61.     _parentWin->_WinWidth = _width;
  62.     SetHScroll(_HScrlShown, 0);        // initial values for scroll bar
  63.     SetVScroll(_VScrlShown, 0);
  64.     _HOn = _VOn = 0;                   // both start out off
  65.     _parentWin->SetWinCursor(_currentCursor);
  66.  
  67.     // Now need to fake out enter focus so the first mouse
  68.     // click is ignored.
  69.     if (!_hasFocus)
  70.     {
  71.       _hasFocus = 1;
  72.       EnterFocus();           // call the virtual function
  73.     }
  74.   }
  75.  
  76. //==================>>> vCanvasPane::CreateDC <<<========================
  77.   void vCanvasPane::CreateDC(void)
  78.   {
  79.     if (!_cpDC)
  80.        _cpDC = new vCanvasPaneDC(this);        // create a CanvasPaneDC
  81.   }
  82.  
  83. //====================>>> vCanvasPane::ShowPane <<<======================
  84.   void vCanvasPane::ShowPane(int OnOrOff) VCONST
  85.   {
  86.     if (OnOrOff)
  87.     {
  88.       WinSetWindowPos (_drawWindow, HWND_TOP,
  89.         0,0,0,0,
  90.         SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE);
  91.     }
  92.     else
  93.     {
  94.       WinSetWindowPos (_drawWindow, HWND_TOP,
  95.         0,0,0,0,
  96.         SWP_MINIMIZE | SWP_ACTIVATE);
  97.     }
  98.   }
  99.  
  100. //=====================>>> vCanvasPane::SetHeightWidth <<<=========================
  101.   void vCanvasPane::SetWidthHeight(int width, int height)
  102.   {
  103.     if (height <= 0 || width <= 0)
  104.        return;
  105.  
  106.     // we need to compute the total height of all command and status bars
  107.     RECTL oldFrameRcl, oldClientRcl;
  108.     WinQueryWindowRect(_drawWindow, &oldFrameRcl);
  109.     WinQueryWindowRect(_drawCanvas, &oldClientRcl);
  110.     WinCalcFrameRect(_drawWindow, &oldClientRcl, FALSE);
  111.     int barHeight = (oldFrameRcl.yTop - oldFrameRcl.yBottom) -
  112.       (oldClientRcl.yTop - oldClientRcl.yBottom);
  113.  
  114.     _parentWin->_WinHeight = _height = height;
  115.     _parentWin->_WinWidth = _width = width;
  116.  
  117.     RECTL rcl;
  118.     rcl.xLeft = 0;
  119.     rcl.yBottom = 0;
  120.     rcl.xRight = width;   // client width
  121.     rcl.yTop = height;    // client height
  122.  
  123.     // compute the frame size to hold desired client
  124.     WinCalcFrameRect(_drawWindow, &rcl, FALSE);
  125.  
  126.     // resize the frame and subclassed procedure will fix everything else
  127.     WinSetWindowPos(_drawWindow, 0,
  128.       0, 0,
  129.       rcl.xRight - rcl.xLeft,          // width
  130.       rcl.yTop - rcl.yBottom + barHeight,  // height
  131.       SWP_SIZE);
  132.   }
  133.  
  134. // ************************************************************************
  135. //---------------------- Mouse Pointer Stuff -----------------------------
  136. // ************************************************************************
  137. //==================>>> vCanvasPane::SetCursor <<<============================
  138.   void vCanvasPane::SetCursor(VCursor id)
  139.   {
  140.     // Set to current cursor
  141.     if (id < VC_None || id > VC_LAST)
  142.     {
  143.       SysDebug1(BadVals,"vCanvasPane::SetCursor(id=%d)\n",id)
  144.       return;
  145.     }
  146.     if (id == VC_None)              // special case
  147.     UnSetCursor();
  148.     SysDebug1(WindowEvents,"vCanvasPane::SetCursor(id=%d)\n",id)
  149.     _currentCursor = id;
  150.     _parentWin->SetWinCursor(_currentCursor);
  151.   }
  152.  
  153. //===================>>> vCanvasPane::UnSetCursor <<<=========================
  154.   void vCanvasPane::UnSetCursor(void)
  155.   {
  156.     _currentCursor = CA_None;
  157.   }
  158.  
  159. // ************************************************************************
  160. // ---------------------- Scrolling Stuff ---------------------------------
  161. // ************************************************************************
  162.  
  163. //=======================>>> vCanvasPane::HPage <<<============================
  164.   void vCanvasPane::HPage(int Shown, int Top)
  165.   {
  166.     // This is the main way a user app gets scrolling events, and
  167.     // will usually override this guy to handle what is actually
  168.     // drawn in the canvas window.
  169.     // This should then be called to actually change the display.
  170.     SysDebug2(WindowEvents,"vCanvasPane::HPage(Shown: %d, Top: %d)\n",Shown, Top);
  171.     SetHScroll(Shown,Top);
  172.   }
  173. //=======================>>> vCanvasPane::HScroll <<<==========================
  174.   void vCanvasPane::HScroll(int step)
  175.   {
  176.     // This is the way the user app gets step events - either page or
  177.     // single step events. The default doesn't have to do anything.
  178.     SysDebug1(WindowEvents,"vCanvasPane::HScroll(%d)\n",step);
  179.     if (step < 0)
  180.     {
  181.       if (_HScrlTop - 1 >= 0)
  182.         SetHScroll(_HScrlShown, --_HScrlTop);
  183.     }
  184.     else
  185.     {
  186.       if (_HScrlTop + 1 <= 100)
  187.         SetHScroll(_HScrlShown, ++_HScrlTop);
  188.     }
  189.   }
  190.  
  191. //=====================>>> vCanvasPane::ShowHScroll <<<=========================
  192.   void vCanvasPane::ShowHScroll(int OnOff)
  193.   {
  194.     if (OnOff)                 // Turn on
  195.     {
  196.       if (_HOn)               // Already on
  197.         return;
  198.       _HOn = 1;
  199.       // create the scroll bars
  200.       SBCDATA sbcd;
  201.       sbcd.cb = sizeof(SBCDATA);
  202.       sbcd.sHilite = 0;
  203.       sbcd.posFirst = 0;
  204.       sbcd.posLast  = 100;
  205.       sbcd.posThumb = 0;
  206.       sbcd.cVisible = 1;
  207.       sbcd.cTotal = 100;
  208.  
  209.       _HScrlHwnd = WinCreateWindow(_drawWindow,    // parent
  210.                      WC_SCROLLBAR,                // window class
  211.                      NULL,                        // window text
  212.                      SBS_HORZ,                    // horizontal
  213.                      0,0,                         // position
  214.                      0,0,                         // size
  215.                      _drawWindow,                 // owner
  216.                      HWND_TOP,                    // bottom Z-order
  217.                      FID_HORZSCROLL,              // ID
  218.                      &sbcd,                       // class data
  219.                      NULL);                       // no presentation params
  220.  
  221.       // notify frame of changes so can resize client
  222.       WinSendMsg(_drawWindow, WM_UPDATEFRAME,
  223.         MPFROMSHORT(FCF_HORZSCROLL ), 0);
  224.  
  225.       // set range to 0-100
  226. //      WinSendMsg (ScrollBar, SBM_SETSCROLLBAR,
  227. //        MPFROMSHORT(0),MPFROM2SHORT(0,100));
  228.     }
  229.     else                       // Turn off
  230.     {
  231.       if (!_HOn)              // Already off
  232.         return;
  233.       _HOn = 0;
  234.       WinDestroyWindow (WinWindowFromID(_drawWindow, FID_HORZSCROLL));
  235.       // notify frame of changes so can resize client
  236.       WinSendMsg(_drawWindow, WM_UPDATEFRAME,
  237.         MPFROMSHORT(FCF_HORZSCROLL ), 0);
  238.     }
  239.   }
  240.  
  241. //=====================>>> vCanvasPane::ShowVScroll <<<=========================
  242.   void vCanvasPane::ShowVScroll(int OnOff)
  243.   {
  244.     if (OnOff)                 // Turn on
  245.     {
  246.       if (_VOn)               // Already on
  247.         return;
  248.       _VOn = 1;
  249.       SBCDATA sbcd;
  250.  
  251.       // set range to 0-100
  252.       sbcd.cb = sizeof(SBCDATA);
  253.       sbcd.sHilite = 0;
  254.       sbcd.posFirst = 0;
  255.       sbcd.posLast  = 100;
  256.       sbcd.posThumb = 0;
  257.       sbcd.cVisible = 1;
  258.       sbcd.cTotal = 100;
  259.  
  260.       _VScrlHwnd = WinCreateWindow(_drawWindow,    // parent
  261.                      WC_SCROLLBAR,                // window class
  262.                      NULL,                        // window text
  263.                      SBS_VERT,                    // vertical
  264.                      0,0,                         // position
  265.                      0,0,                         // size
  266.                      _drawWindow,                 // owner
  267.                      HWND_TOP,                    // bottom Z-order
  268.                      FID_VERTSCROLL,              // ID
  269.                      &sbcd,                       // class data
  270.                      NULL);                       // no presentation params
  271.  
  272.       // notify frame of changes so can resize client
  273.       WinSendMsg(_drawWindow, WM_UPDATEFRAME,
  274.         MPFROMSHORT(FCF_VERTSCROLL ), 0);
  275.  
  276.       // set range to 0-100
  277. //      WinSendMsg (ScrollBar, SBM_SETSCROLLBAR,
  278. //        MPFROMSHORT(0),MPFROM2SHORT(0,100));
  279.     }
  280.     else                       // Turn off
  281.     {
  282.       if (!_VOn)              // Already off
  283.         return;
  284.       _VOn = 0;
  285.       WinDestroyWindow (WinWindowFromID(_drawWindow, FID_VERTSCROLL));
  286.       // notify frame of changes so can resize client
  287.       WinSendMsg(_drawWindow, WM_UPDATEFRAME,
  288.         MPFROMSHORT(FCF_VERTSCROLL ), 0);
  289.     }
  290.   }
  291.  
  292.  
  293. //=====================>>> vCanvasPane::GetHScroll <<<=========================
  294.   int vCanvasPane::GetHScroll(int& Shown, int& Top) VCONST // V:1.13
  295.   {
  296.     Shown = _HScrlShown; Top = _HScrlTop;
  297.     return _HOn;
  298.   }
  299.  
  300.  
  301. //=====================>>> vCanvasPane::SetHScroll <<<=========================
  302.   void vCanvasPane::SetHScroll(int Shown, int Top)
  303.   {
  304.     // Make sure we are setting to valid values, and are changing things!
  305.     if (Shown < 0 || Shown > 100 || Top < 0 || Top > 100)
  306.       return;
  307.     _HScrlShown = Shown;
  308.     _HScrlTop = Top;
  309.  
  310.     WinSendMsg (WinWindowFromID(_drawWindow, FID_HORZSCROLL),
  311.       SBM_SETPOS, MPFROMSHORT(Top), 0);
  312.  
  313.     WinSendMsg (WinWindowFromID(_drawWindow, FID_HORZSCROLL),
  314.       SBM_SETTHUMBSIZE, MPFROM2SHORT(Shown, 100), 0);
  315.   }
  316.  
  317. //========================>>> vCanvasPane::VPage <<<===========================
  318.   void vCanvasPane::VPage(int Shown, int Top)
  319.   {
  320.     SysDebug2(WindowEvents,"vCanvasPane::VPage(Shown: %d, Top: %d)\n",Shown, Top);
  321.     SetVScroll(Shown,Top);
  322.   }
  323.  
  324. //========================>>> vCanvasPane::VScroll <<<=========================
  325.   void vCanvasPane::VScroll(int step)
  326.   {
  327.     // This is the way the user app gets step events - either page or
  328.     // single step events. Default updates the display
  329.     SysDebug1(WindowEvents,"vCanvasPane::VScroll(%d)\n",step);
  330.     if (step < 0)
  331.     {
  332.       if (_VScrlTop - 1 >= 0)
  333.         SetVScroll(_VScrlShown, --_VScrlTop);
  334.     }
  335.     else
  336.     {
  337.       if (_VScrlTop + 1 <= 100)
  338.         SetVScroll(_VScrlShown, ++_VScrlTop);
  339.     }
  340.   }
  341.  
  342. //=====================>>> vCanvasPane::GetVScroll <<<=========================
  343.   int vCanvasPane::GetVScroll(int& Shown, int& Top) VCONST  // V:1.13
  344.   {
  345.     Shown = _VScrlShown; Top = _VScrlTop;
  346.     return _VOn;
  347.   }
  348.  
  349. //=====================>>> vCanvasPane::SetVScroll <<<=========================
  350.   void vCanvasPane::SetVScroll(int Shown, int Top)
  351.   {
  352.     // Make sure we are setting to valid values, and are changing things!
  353.     if (Shown < 0 || Shown > 100 || Top < 0 || Top > 100)
  354.        return;
  355.     _VScrlShown = Shown;
  356.     _VScrlTop = Top;
  357.  
  358.     WinSendMsg (WinWindowFromID(_drawWindow, FID_VERTSCROLL),
  359.       SBM_SETPOS, MPFROMSHORT(Top), 0);
  360.  
  361.     WinSendMsg (WinWindowFromID(_drawWindow, FID_VERTSCROLL),
  362.       SBM_SETTHUMBSIZE, MPFROM2SHORT(Shown, 100), 0);
  363.   }
  364.  
  365. //====================>>> vCanvasPane::HScrollEV <<<=======================
  366.   void vCanvasPane::HScrollEV(int code, int pos, HWND control)
  367.   {
  368.     switch (code)
  369.     {
  370.       case SB_LINERIGHT:              // Right one unit
  371.         HScroll(1);
  372.         break;
  373.  
  374.       case SB_LINELEFT:               // Left one unit
  375.         HScroll(-1);
  376.         break;
  377.  
  378.       case SB_PAGERIGHT:              // Page Right - use 10
  379.         if (_HScrlTop <= 90)
  380.         {
  381.           _HScrlTop += 10;
  382.           HPage(_HScrlShown, _HScrlTop);
  383.         }
  384.         else
  385.         {
  386.           _HScrlTop = 100;
  387.           HPage(_HScrlShown, 100);
  388.         }
  389.         break;
  390.  
  391.       case SB_PAGELEFT:               // Page Left - use -10
  392.         if (_HScrlTop >= 10)
  393.         {
  394.           _HScrlTop -= 10;
  395.           HPage(_HScrlShown, _HScrlTop);
  396.         }
  397.         else
  398.         {
  399.           _HScrlTop = 0;
  400.           HPage(_HScrlShown, 0);
  401.         }
  402.         break;
  403.  
  404.       case SB_SLIDERPOSITION:         // move to position given
  405.         _HScrlTop = pos;
  406.         HPage(_HScrlShown, pos);
  407.         break;
  408.  
  409.       case SB_SLIDERTRACK:            // for continuous motion
  410.         _HScrlTop = pos;
  411.         HPage(_HScrlShown, pos);
  412.         break;
  413.       }
  414.   }
  415.  
  416. //====================>>> vCanvasPane::VScrollEV <<<=======================
  417.   void vCanvasPane::VScrollEV(int code, int pos, HWND control)
  418.   {
  419.     switch (code)
  420.     {
  421.       case SB_LINEDOWN:               // Down one unit
  422.         VScroll(1);
  423.         break;
  424.  
  425.       case SB_LINEUP:                 // Up one unit
  426.         VScroll(-1);
  427.         break;
  428.  
  429.       case SB_PAGEDOWN:               // Page Down - use 10
  430.         if (_VScrlTop <= 90)
  431.         {
  432.           _VScrlTop += 10;
  433.           VPage(_VScrlShown, _VScrlTop);
  434.         }
  435.         else
  436.         {
  437.           _VScrlTop = 100;
  438.           VPage(_VScrlShown, 100);
  439.         }
  440.         break;
  441.  
  442.       case SB_PAGEUP:                 // Page Up - use -10
  443.         if (_VScrlTop >= 10)
  444.         {
  445.           _VScrlTop -= 10;
  446.           VPage(_VScrlShown, _VScrlTop);
  447.         }
  448.         else
  449.         {
  450.           _VScrlTop = 0;
  451.           VPage(_VScrlShown, 0);
  452.         }
  453.         break;
  454.  
  455.       case SB_SLIDERPOSITION:         // move to position given
  456.         _VScrlTop = pos;
  457.         VPage(_VScrlShown, pos);
  458.         break;
  459.  
  460.       case SB_SLIDERTRACK:            // continuous motion
  461.         _VScrlTop = pos;
  462.         VPage(_VScrlShown, pos);
  463.         break;
  464.  
  465.       default:
  466.         return;
  467.       }
  468.   }
  469.  
  470. // ************************************************************************
  471. //
  472. // Redraw/resize/focus
  473. //
  474. // ************************************************************************
  475.  
  476. //=====================>>> vCanvasPane::ExposeEV <<<==========================
  477.   void vCanvasPane::ExposeEV(void)
  478.   {
  479.     SysDebug(WindowEvents,"vCanvasPane::ExposeEV()\n")
  480. //    ERRORID errorCode;
  481. //    errorCode = WinGetLastError(theApp->AppHab());
  482. //    SysDebug1(WindowEvents,"1) ExposeEV() ErrorCode = %8x\n", errorCode)
  483.  
  484.     // we need to bracket the WM_PAINT with WinBeginPaint/WinEndPAint
  485.     // this will also update _cpDC->_rcl with the update Rectl
  486.     RECTL rc;
  487.     WinBeginPaint(_drawCanvas, _cpDC->handleDC(), &rc);
  488. //    _cpDC->BeginPaint();
  489.  
  490.     int x = 0, y = 0, width = 0, height = 0;
  491.  
  492.     // convert from OS/2 to V coord space
  493.     // CAUTION: WinQuery return rc coords are inclusive/exclusive
  494.     x = rc.xLeft ;
  495.     y = (_height -1) - rc.yTop;
  496.  
  497.     height = rc.yTop - rc.yBottom;
  498.     width = rc.xRight - rc.xLeft;
  499.  
  500.     _cpDC->ClearRect(x, y, width, height);
  501.  
  502.     Redraw(x, y , width, height);
  503.  
  504.     WinEndPaint(_cpDC->handleDC());
  505. //    _cpDC->EndPaint();
  506.   }
  507.  
  508. //=====================>>> vCanvasPane::EnterFocus <<<========================
  509.   void vCanvasPane::EnterFocus(void)
  510.   {
  511.     SysDebug(WindowEvents,"vCanvasPane::EnterFocus()\n")
  512.   }
  513.  
  514. //=====================>>> vCanvasPane::EnterEV <<<==========================
  515.   void vCanvasPane::EnterEV(void)
  516.   {
  517.     if (_hasFocus)             // don't double enter focus
  518.       return;
  519.     _hasFocus = 1;
  520.     EnterFocus();              // call the virtual function
  521.   }
  522.  
  523. //======================>>> vCanvasPane::FontChanged <<<===========================
  524.   void vCanvasPane::FontChanged(VCONST vFont& vf)
  525.   {
  526.     // Called when the font is changed.
  527.     SysDebug1(WindowEvents,"vCanvasPane::FontChanged(%d)\n",vf)
  528.   }
  529.  
  530. //=====================>>> vCanvasPane::LeaveFocus <<<=======================
  531.   void vCanvasPane::LeaveFocus()
  532.   {
  533.     SysDebug(WindowEvents,"vCanvasPane::LeaveFocus()\n")
  534.   }
  535.  
  536. //=====================>>> vCanvasPane::LeaveEV <<<==========================
  537.   void vCanvasPane::LeaveEV()
  538.   {
  539.  
  540.     if (!_hasFocus)            // don't double leave focus
  541.       return;
  542.     _hasFocus = 0;
  543.  
  544.     LeaveFocus();            // call the virtual function
  545.   }
  546.  
  547. //=====================>>> vCanvasPane::MouseDown <<<==========================
  548.   void vCanvasPane::MouseDown(int x, int y, int button)
  549.   {
  550.     // the mouse coords are in World Space since V interface is in World Space
  551.     SysDebug3(MouseEvents,"vCanvasPane::MouseDown(x:%d,y:%d,btn:%d)\n",x,y,button)
  552.   }
  553.  
  554. //=====================>>> vCanvasPane::MouseUp <<<============================
  555.   void vCanvasPane::MouseUp(int x, int y, int button)
  556.   {
  557.     // the mouse coords are in World Space since V interface is in World Space
  558.     SysDebug3(MouseEvents,"vCanvasPane::MouseUp(x:%d,y:%d,btn:%d)\n",x,y,button)
  559.   }
  560.  
  561. //=====================>>> vCanvasPane::MouseMove <<<==========================
  562.   void vCanvasPane::MouseMove(int x, int y, int button)
  563.   {
  564.     // the mouse coords are in World Space since V interface is in World Space
  565.     SysDebug3(MouseEvents,"vCanvasPane::MouseMove(x:%d,y:%d,btn:%d)\n",x,y,button)
  566.   }
  567.  
  568. //=======================>>> vCanvasPane::Redraw <<<==========================
  569.   void vCanvasPane::Redraw(int x, int y, int width, int height)
  570.   {
  571.     // Redraw in vCanvasPane is a no-op.
  572. #ifdef vDEBUG          // Don't have a SysDebug4 macro, so do it by hand
  573.     if (DebugState.WindowEvents && DebugState.System)
  574.       printf("vCanvasPane::Redraw(x=%d, y=%d, w=%d, h=%d)\n",x,y,width,height);
  575. #endif
  576.   }
  577.  
  578. //=====================>>> vCanvasPane::Resize <<<============================
  579.   void vCanvasPane::Resize(int newW, int newH)
  580.   {
  581.     // This is the routine the user will override to intercept size changes
  582.     SysDebug2(WindowEvents,"vCanvasPane::Resize(newW:%d, newH:%d)\n",newW,newH)
  583.   }
  584.  
  585. //==================>>> vCanvasPane::ResizeEV <<<========================
  586.   void vCanvasPane::ResizeEV(int w, int h)
  587.   {
  588.     _parentWin->_WinHeight = _height = h;
  589.     _parentWin->_WinWidth = _width = w;
  590.     Resize((int)w, (int)h);    // Call the virtual function
  591.   }
  592.  
  593.