分享

基于VC++的GDI常用坐标系统及应用 (5)

 伤心莫哭 2010-11-07
 五、实例代码
 
  为了灵活使用逻辑坐标系,下面给出了几个例子代码:
 
  例1:绘制带箭头的坐标轴
 
void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // device context for painting
 CBrush bgBrush(BLACK_BRUSH);
 dc.SelectObject(bgBrush);
 dc.Rectangle(Recto);
 dc.SetMapMode(MM_ISOTROPIC);
 dc.SetViewportOrg(0, 440);
 dc.SetWindowExt(480, 480);
 dc.SetViewportExt(440, -680);
 CPen PenWhite(PS_SOLID, 1, RGB(255, 255, 255));
 dc.SelectObject(PenWhite);
 dc.MoveTo(21, 20);
 dc.LineTo(21, 75);
 // Up arrow
 dc.MoveTo(16, 75);
 dc.LineTo(21, 90);
 dc.LineTo(26, 75);
 dc.LineTo(16, 75);
 dc.MoveTo(21, 22);
 dc.LineTo(75, 22);
 // Right arrow
 dc.MoveTo(75, 17); 
 dc.LineTo(90, 22);
 dc.LineTo(75, 27);
 dc.LineTo(75, 17);
 
 dc.SetBkMode(TRANSPARENT);
 dc.SetTextColor(RGB(255, 255, 255));
 dc.TextOut(16, 114, ’Y’);
 dc.TextOut(100, 32, ’X’);
 dc.Rectangle(15, 15, 30, 30);
}


图二十二、代码效果图
 
 
  例2:绘制网格 

void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // device context for painting
 CRect Recto;
 GetClientRect(&Recto);
 CBrush bgBrush(BLACK_BRUSH);
 dc.SelectObject(bgBrush);
 dc.Rectangle(Recto);
 CPen PenBlue(PS_SOLID, 1, RGB(0, 0, 255));
 dc.SelectObject(PenBlue);
 for(int x = 0; x < Recto.Width(); x += 20)
 {
  dc.MoveTo(x, 0);
  dc.LineTo(x, Recto.Height()); 
 }
 
 for(int y = 0; y < Recto.Height(); y += 20)
 { 
  dc.MoveTo(0, y);
  dc.LineTo(Recto.Width(), y); 
 }
 
}


 图二十三、代码效果图
 
  例3:点状网格
 
void CExoDraw1View::OnPaint() 
{
 CPaintDC dc(this); // device context for painting 
 CRect Recto;
 
 GetClientRect(&Recto);
 CBrush bgBrush(BLACK_BRUSH); 
 dc.SelectObject(bgBrush);
 dc.Rectangle(Recto); 
 for(int x = 0; x < Recto.Width(); x += 20)
 { 
  for(int y = 0; y < Recto.Height(); y += 20)
  { 
   dc.SetPixel(x, y, RGB(255, 255, 255));
  } 
 }
}


图二十四、代码效果
 
 
  例4:正弦图形
 
void CExoView::OnPaint() 
{
 CPaintDC dc(this); // device context for painting
 // TODO: Add your message handler code here
 dc.SetMapMode(MM_ANISOTROPIC);
 dc.SetViewportOrg(340, 220);
 dc.SetWindowExt(1440, 1440);
 dc.SetViewportExt(-1440, -220);
 CPen PenBlue(PS_SOLID, 1, RGB(0, 0, 255));
 
 dc.SelectObject(PenBlue);
 // Axes
 dc.MoveTo(-300, 0);
 dc.LineTo( 300, 0);
 dc.MoveTo( 0, -1400);
 dc.LineTo( 0, 1400);
 // I am exaggerating with the PI value here but why not?
 const double PI = 3.141592653589793238462643383279;
 // The following two values were chosen randomly by me.
 // You can chose other values you like
 
 const int MultiplyEachUnitOnX = 50;
 const int MultiplyEachUnitOnY = 250;
 for(double i = -280; i < 280; i += 0.01)
 {
  double j = sin(PI / MultiplyEachUnitOnX * i) * MultiplyEachUnitOnY; 
  dc.SetPixel(i, j, RGB(255, 0, 0));
 }
 
 // Do not call CView::OnPaint() for painting messages
 
}


图二十五、代码效果图

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多