YOU CAN CODE!

 

With The Case Of UCanCode.net  Release The Power OF  Visual C++ !   HomeProducts | PurchaseSupport | Downloads  
XD++ Library
DocVizor
TFC Library
Free Products
Technical Support
UCanCode.net


Get Ready to Unleash the Power of UCanCode .NET


UCanCode Software focuses on general application software development. We provide complete solution for developers. No matter you want to develop a simple database workflow application, or an large flow/diagram based system, our product will provide a complete solution for you. Our product had been used by hundreds of top companies around the world!

"100% source code provided! Free you from not daring to use components because of unable to master the key technology of components!"


VC++ Example: Drawing an Arrow Line with Source Code

Mayank Malik 
September 28, 2001

Environment: VC 5-6 , Windows 95/98/2000/NT/Me

Recently I had to develop a Graphics Software and wanted to add support for drawing an Arrow Line / Measuring Line. This was essential for the software and I had no option but to go over my trigonometry fundas. After churning for a couple of hours , I came up with this technique for drawing arrowheads at the end of a line.

The Lines are drawn when you drag the mouse . The drawing mode used is R2_NOT .As long as the user is dragging the mouse , the Line is refreshing itself (by redrawing) . You need to include "math.h" in your View.cpp file .

This checks when the User Starts dragging the mouse :

void CPolygonsView::OnLButtonDown(UINT nFlags, CPoint point)
{
  m_Drag = true;   // for mouse drag check
  PointOrigin = point;  // value when mouse drag starts
  CView::OnLButtonDown(nFlags, point);
}

void CPolygonsView::OnLButtonUp(UINT nFlags, CPoint point)
{

  m_Drag = false;  // for mouse drag check
  MotionFix=0;
  CView::OnLButtonUp(nFlags, point);

}

All the drawing is invoked by the MouseMove function . First the previously drawn Line is erased (by redrawing over it - using R2_NOT) and then the new Line is drawn using the new coordinates.

The loop computes all the other coordinates using these elements and draws lines connecting one vertex to the other.

void CPolygonsView::OnMouseMove(UINT nFlags, CPoint point)
{
  if (m_Drag && PointOrigin!=point) // for mouse drag check
  {
    CClientDC ClientDC(this);  // graphics
    ClientDC.SetROP2(R2_NOT);
    if (MotionFix) DrawArrow(&ClientDC,PointOrigin,PointOld);
    MotionFix=1;
 // MotionFix is used to prevent redrawing in case it is the
 // First Element
    DrawArrow(&ClientDC,PointOrigin,point);
  }
  PointOld = point;
  CView::OnMouseMove(nFlags, point);
}

ok , that was the easy part , now the actual computation is done in the Draw Arrow Function

void DrawArrow(CDC *pdc,CPoint m_One, CPoint m_Two)
{
  double slopy , cosy , siny;
  double Par = 10.0;  //length of Arrow (>)
  slopy = atan2( ( m_One.y - m_Two.y ),
    ( m_One.x - m_Two.x ) );
  cosy = cos( slopy );
  siny = sin( slopy ); //need math.h for these functions

  //draw a line between the 2 endpoint
  pdc->MoveTo( m_One );
  pdc->LineTo( m_Two );

  //here is the tough part - actually drawing the arrows
  //a total of 6 lines drawn to make the arrow shape
  pdc->MoveTo( m_One);
  pdc->LineTo( m_One.x + int( - Par * cosy - ( Par / 2.0 * siny ) ),
    m_One.y + int( - Par * siny + ( Par / 2.0 * cosy ) ) );
  pdc->LineTo( m_One.x + int( - Par * cosy + ( Par / 2.0 * siny ) ),
    m_One.y - int( Par / 2.0 * cosy + Par * siny ) );
  pdc->LineTo( m_One );
  /*/-------------similarly the the other end-------------/*/
  pdc->MoveTo( m_Two );
  pdc->LineTo( m_Two.x + int( Par * cosy - ( Par / 2.0 * siny ) ),
    m_Two.y + int( Par * siny + ( Par / 2.0 * cosy ) ) );
  pdc->LineTo( m_Two.x + int( Par * cosy + Par / 2.0 * siny ),
    m_Two.y - int( Par / 2.0 * cosy - Par * siny ) );
  pdc->LineTo( m_Two );

}

Downloads

Download demo project - 88 Kb
Download source - 22 Kb

 

 

Copyright ?1998-2007 UCanCode.Net Software , all rights reserved.
Other product and company names herein may be the trademarks of their respective owners.

Please direct your questions or comments to webmaster@ucancode.net