With The Case Of  Release The Power OF  Visual C++ !   HomeProducts | PurchaseSupport | Downloads  
Download Evaluation
Pricing & Purchase?
E-XD++Visual C++/ MFC Products
Features Tour 
Electronic Form Solution
Visualization & HMI Solution
Power system HMI Solution
CAD Drawing and Printing Solution

Bar code labeling Solution
Workflow Solution

Coal industry HMI Solution
Instrumentation Gauge Solution

Report Printing Solution
Graphical modeling Solution
GIS mapping solution

Visio graphics solution
Industrial control SCADA &HMI Solution
BPM business process Solution

Industrial monitoring Solution
Flowchart and diagramming Solution
Organization Diagram Solution

Graphic editor Source Code
UML drawing editor Source Code
Map Diagramming Solution

Architectural Graphic Drawing Solution
Request Evaluation
ActiveX COM Products
Technical Support
  General Q & A
Discussion Board
Contact Us


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: GetPath, BeginPath, EndPath, True Type Font, Draw Outline of text



Opens a path bracket in the device context.

BOOL BeginPath( );
Return Value

Nonzero if the function is successful; otherwise 0.


After a path bracket is open, an application can begin calling GDI drawing functions to define the points that lie in the path. An application can close an open path bracket by calling the EndPath member function. When an application calls BeginPath, any previous paths are discarded.

See BeginPath in the Platform SDK for a list of the drawing functions that define points in a path for Windows NT and Windows 95/98.

Example Source Code

// This OnDraw() implementation uses GDI paths to draw the outline of
// some text in a TrueType font. The path is used to record the way
// the TrueType font would be drawn. Then, the function uses the data
// returned from CDC::GetPath() to draw the font--without filling it.

void COutlineView::OnDraw(CDC* pDC)
   // Describe a 24-point truetype font of normal weight
   LOGFONT lf;
   memset(&lf, 0, sizeof(lf));
   lf.lfHeight = -MulDiv(24, pDC->GetDeviceCaps(LOGPIXELSY), 72);
   lf.lfWeight = FW_NORMAL;
   lf.lfOutPrecision = OUT_TT_ONLY_PRECIS;

   // create and select it
   CFont newFont;
   if (!newFont.CreateFontIndirect(&lf))
   CFont* pOldFont = pDC->SelectObject(&newFont);

   // use a path to record how the text was drawn
   pDC->TextOut(10, 10, _T("Hockey is Best!"));

   // Find out how many points are in the path. Note that
   // for long strings or complex fonts, this number might be
   // gigantic!
   int nNumPts = pDC->GetPath(NULL, NULL, 0);
   if (nNumPts == 0)

   // Allocate memory to hold points and stroke types from
   // the path.
   LPPOINT lpPoints = new POINT[nNumPts];
   if (lpPoints == NULL)
   LPBYTE lpTypes = new BYTE[nNumPts];
   if (lpTypes == NULL)
      delete [] lpPoints;

   // Now that we have the memory, really get the path data.
   nNumPts = pDC->GetPath(lpPoints, lpTypes, nNumPts);

   // If it worked, draw the lines. Win95 and Win98 don't support
   // the PolyDraw API, so we use our own member function to do
   // similar work. If you're targeting only Windows NT, you can
   // use the PolyDraw() API and avoid the COutlineView::PolyDraw()
   // member function.

   if (nNumPts != -1)
      PolyDraw(pDC, lpPoints, lpTypes, nNumPts);

   // Release the memory we used
   delete [] lpPoints;
   delete [] lpTypes;

   // Put back the old font


void COutlineView::PolyDraw(CDC* pDC, CONST LPPOINT lppt, CONST LPBYTE lpbTypes,
   int cCount)
   int nIndex;
   LPPOINT pptLastMoveTo = NULL;

   // for each of the points we have...
   for (nIndex = 0; nIndex < cCount; nIndex++)
      // React to information from the path by drawing the data
      // we received. For each of the points, record our own
      // "last active point" so we can close figures, lines, and
      // Beziers.

      case PT_MOVETO:
         if (pptLastMoveTo != NULL && nIndex > 0)
            pDC->LineTo(pptLastMoveTo->x, pptLastMoveTo->y);
         pDC->MoveTo(lppt[nIndex].x, lppt[nIndex].y);
         pptLastMoveTo = &lppt[nIndex];

         pDC->LineTo(lppt[nIndex].x, lppt[nIndex].y);
         if (pptLastMoveTo != NULL)
            pDC->LineTo(pptLastMoveTo->x, pptLastMoveTo->y);
         pptLastMoveTo = NULL;

      case PT_LINETO:
         pDC->LineTo(lppt[nIndex].x, lppt[nIndex].y);

         ASSERT(nIndex + 2 <= cCount);
         pDC->PolyBezierTo(&lppt[nIndex], 3);
         nIndex += 2;
         if (pptLastMoveTo != NULL)
            pDC->LineTo(pptLastMoveTo->x, pptLastMoveTo->y);
         pptLastMoveTo = NULL;

      case PT_BEZIERTO:
         ASSERT(nIndex + 2 <= cCount);
         pDC->PolyBezierTo(&lppt[nIndex], 3);
         nIndex += 2;

   // If the figure was never closed and should be,
   // close it now.
   if (pptLastMoveTo != NULL && nIndex > 1)
      pDC->LineTo(pptLastMoveTo->x, pptLastMoveTo->y);



Copyright ?1998-2022 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