Posted on 1998-09-16
Last Modified: 2013-11-20
Someone please explain me how SetViewportOrg(), SetWindowOrg(), SetWindowExt() and SetViewportExt() works?
Question by:daknight2000
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
  • 2

Expert Comment

ID: 1322174
Sure, wondered about that myself for the longest time.  

1) SetWindowOrg.  Just leave this to 0,0 and ignore this one.
2) SetViewportOrg.  Whenever you want to change the origin of the drawing, move the origin to a certain location.  Then if you use a BitBlt or StretchDIBits then the image will be automatically updated
3) Extents.  All the extents do is create a 'zoom' factor.  It could have just as easily been SetExtentZoom( float ) and it would have been a whole lot simpler.  Take a look at the following code I wrote to convert LP to DP coordinates.  Don't over think the extents.  Set the WindowExtent to some useful number (I use 600 dpi so it's at 600 for me).  And set your viewport extents to the same number for a non-zoomed image.  If you change your ViewportExtents to lets say (1200,1200), then the image will be twice as large.  If it's (300,300) then it's shrunk.  Get the idea?

void CAfixCtrl::QuickLPtoDP( CPoint& ptPoint )
   float fZoomX = (float) / (float);
   float fZoomY = (float) / (float);

   ptPoint.x = (int)( ptPoint.x * fZoomX + 0.5 ) + m_ptViewportOrg.x;
   ptPoint.y = (int)( ptPoint.y * fZoomY + 0.5 ) + m_ptViewportOrg.y;

void CAfixCtrl::QuickDPtoLP( CPoint& ptPoint )
   float fZoomX = (float) / (float);
   float fZoomY = (float) / (float);

   ptPoint.x = (int)(((float)( ptPoint.x - m_ptViewportOrg.x ) / fZoomX ) + 0.5 );
   ptPoint.y = (int)(((float)( ptPoint.y - m_ptViewportOrg.y ) / fZoomY ) + 0.5 );


Author Comment

ID: 1322175
sorry Philip .. I am a kid in mfc world... I guess, I failed to explain the question ...
Please explain me what this piece of code is supposed to do :-

CRect rectClient;
pDC->SetViewPortExt(rectClient.right, -rectClient.bottom);
pDC->SetViewPortOrg(rectClient.right/2, rectClient.bottom/2);

please also explain me that what  that "-" sign with "y" co-ordinate in SetViewPortExt() is supposed to do?
thanx alot

Accepted Solution

psdavis earned 50 total points
ID: 1322176
// Get the size of the current window

CRect rectClient;

// Means that you will be responsible for setting the viewport/window extents.  The 'ANISOTROPIC' means that you'll have a different X and Y 'zoom' factor.  If you use ISOTROPIC, then the X and Y will have the same 'zoom' factor.  Other values will ignore the viewport/window extents.  For example MM_TWIPS will automatically expect each pixel to represent 1/1440 of an inch.


// Since SetViewportOrg is missing, I'm assuming it's at 0,0 like it should be.  The viewport org is set the the exact middle of the screen.  So when drawing, the origin of 0,0 is in the middle of the window at all times.

pDC->SetViewPortOrg(rectClient.right/2, rectClient.bottom/2);

// Moved this line up one.  This means that the total width and height of the extent is the entire width and height of the image.  The negative is because Y is exactly the opposite of what you were taught in school.  The only Y that isn't is the MM_TEXT mode, but it's only a 1:1 relationship.

pDC->SetViewPortExt(rectClient.right, -rectClient.bottom);

// OK, now we're finally having fun.  The 1000,1000 means that when you draw a point, it will be scaled to the entire window.


// Let's do an example. If you started with

pDC->MoveTo( 0, 0 );  

// That would move to the center of the screen

pDC->LineTo( 500, 0 );

// This will draw a line from the center of the image to the right HALF way towards the edge of the window.

pDC->LineTo( 1000, 0 );

// This would draw it from the center to the right edge of the window

pDC->LineTo( -1000, 0 );

// To the left edge.

pDC->LineTo( 0, 500 );

// Half way up the image

// Get the idea.  Whatever the drawing measurements, the 500 is placed in the right ratio from the window extents to the viewport extents.

Good luck

Author Comment

ID: 1322177
thanx alot Phillip ...  Now i got something in my mind ...


Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Error on moodle after upgrade 3 155
Replacement selected text 2 69
sumDigits challenge 9 178
Not needed 13 133
Introduction: Dynamic window placements and drawing on a form, simple usage of windows registry as a storage place for information. Continuing from the first article about sudoku.  There we have designed the application and put a lot of user int…
Introduction: Ownerdraw of the grid button.  A singleton class implentation and usage. Continuing from the fifth article about sudoku.   Open the project in visual studio. Go to the class view – CGridButton should be visible as a class.  R…
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit If you want to manage em…
Suggested Courses

737 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question