注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

指南针的天空

你永远也看不到我最寂寞时候的样子,因为只有你不在我身边的时候,我才最寂寞。

 
 
 

日志

 
 

图形设备接口  

2008-04-02 22:19:43|  分类: Visual C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

常用绘图函数实例:

在2DCAD工程中视图类的OnDraw函数中添加绘图代码

void CMy2DCADView::OnDraw(CDC* pDC)
{
 CMy2DCADDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 // TODO: add draw code for native data here
 //绘制一个彩色点
 pDC->TextOut(20, 20, "点");
 pDC->SetPixel(100, 40, RGB(255,0,0));

 //绘制直线
 pDC->TextOut(320, 20, "线段");
 pDC->MoveTo(400, 40);
 pDC->LineTo(500, 40);

 //绘制折线
 pDC->TextOut(20, 170, "折线");
 POINT polyline[4]={{240,240},{80,120},{240,120},{80,240}};
 pDC->Polyline(polyline,4);

 //绘制矩形
 pDC->TextOut(320, 170, "矩形");
 pDC->Rectangle(390, 110, 600, 230);

 //绘制椭圆
 pDC->TextOut(20, 320, "椭圆");
 pDC->Ellipse(80, 260, 280, 380);

 //绘制多边形
 pDC->TextOut(320, 320, "多边形");
 POINT polygon[3]={{380,330},{530,260},{500,360}};
 pDC->Polygon(polygon,3);
}

 

GDI对象的使用步骤:

在视图类的OnDraw函数中

1、创建GDI对象(可以直接构造,或者用Create函数)

2、用CDC::SelectObject函数将GDI对象选入设备环境(DC)中

3、使用完之后,再用CDC::SelectObject函数将GDI对象选落(即选回来),最后释放GDI对象

画笔示例:

void CTestPenView::OnDraw(CDC* pDC)
{
 CTestPenDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 // TODO: add draw code for native data here
 int nPenStyle[]=//用一个数组把7种风格保存起来
 {
  PS_SOLID,
  PS_DASH,
  PS_DOT,
  PS_DASHDOT,
  PS_DASHDOTDOT,
  PS_NULL,
  PS_INSIDEFRAME,
 };
 //不同风格的画笔
 for(int i=0; i<7; i++)
 {
  //第一步:构造一支蓝色的不同风格的画笔;
  CPen NewPen1(nPenStyle[i], 1, RGB(0,0,255));
  //也可以使用(COLORREF)0x000000FF来替代RGB宏

  //第二步:将新画笔选入设备环境中
  CPen *pOldPen = pDC->SelectObject(&NewPen1);
  //开始画线
  pDC->MoveTo(10, 20*i+10);
  pDC->LineTo(500, 20*i+10);

  //第三步:使用完毕后,将老画笔选回去,这一步不要忘记了!
  pDC->SelectObject(pOldPen);
 }
}

画刷示例:

void CTestBrushView::OnDraw(CDC* pDC)
{
 CTestBrushDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 // TODO: add draw code for native data here
 int nBrushPattern[6]= //阴影线模式画刷的图案索引值
 {
  HS_BDIAGONAL,  //右下45度对角线
  HS_CROSS,   //十字交叉线
  HS_DIAGCROSS,  //45度十字交叉线
  HS_FDIAGONAL,  //右上45度对角线
  HS_HORIZONTAL,  //水平线
  HS_VERTICAL,  //垂直线
 };

 pDC->TextOut(0, 20, "阴影画刷");
 //创建阴影线模式画刷
 for(int i=0; i<6; i++)
 {
  //第一步:构造新画刷
  CBrush NewBrush1(nBrushPattern[i],RGB(0,0,255));

  //第二步:将新画刷选入设备环境中
  CBrush * pOldBrush = pDC->SelectObject(&NewBrush1);
  //绘制矩形
  pDC->Rectangle(100, 20+i*60, 600, 70+i*60);

  //第三步:恢复设备环境中原有的画刷
  pDC->SelectObject(pOldBrush);
 }

 pDC->TextOut(0, 20+6*60, "实体画刷");
 //创建一支红色实体模式画刷
 CBrush NewBrush2(RGB(255,0,0));
 //将新画刷选入设备环境中
 CBrush * pOldBrush = pDC->SelectObject(&NewBrush2);
 //绘制矩形
 pDC->Rectangle(100, 20+6*60, 600, 70+6*60);
 //恢复设备环境中原有的画刷
 pDC->SelectObject(pOldBrush);
}

字体示例:

void CTestFontView::OnDraw(CDC* pDC)
{
 CTestFontDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 // TODO: add draw code for native data here
 for(int i=0; i<7; i++)
 {
  //第一步:创建字体
  CFont NewFont;
  //调用CreateFont成员函数实际创建字体
  NewFont.CreateFont(30-i,
   0,
   300*i,
   0,
   400,
   FALSE, FALSE, 0,
   DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
   CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
   DEFAULT_PITCH&FF_SWISS,
   "Arial");

  //第二步:将新的字体选入设备环境,并保存旧字体
  CFont * pOldFont = (CFont *)pDC->SelectObject(&NewFont);
  //用TextOut输出文本
  pDC->TextOut(100*cos(3.1415926/6.0*i)+300,
   -100*sin(3.1415926/6.0*i)+300,
   "使用CFont对象");

  //第三步:恢复设备环境中的旧字体
  pDC->SelectObject(pOldFont);
 }
}

 

显示一个在资源中的位图的步骤:

1、声明一个CBitmap对象,并用CBitmap的成员函数LoadBitmap从资源中装入位图

2、使用CDC的成员函数CreateCompatibleDC创建一个兼容DC

3、使用CDC的成员函数SelectObject将位图选入兼容DC中

4、使用CDC的成员函数BitBlt函数显示位图

注意:事先已经将位图资源插入到工程中了。方法是,将位图文件复制到当前工程目录下。在Resource View中的任意一个资源项上单击鼠标右键,选择Import菜单项导入位图资源

示例:

void CTestBitmapView::OnDraw(CDC* pDC)
{
 CTestBitmapDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 // TODO: add draw code for native data here
 //从资源中装入位图
 {
  //第一步:声明一个CBitmap对象,并从资源中装入位图
  CBitmap bitmap;
  bitmap.LoadBitmap(IDB_BITMAP1);

  //第二步:创建一个兼容DC
  CDC dcComp;
  dcComp.CreateCompatibleDC(pDC);

  //第三步:将位图选入兼容DC中
  dcComp.SelectObject(&bitmap);

  BITMAP bmInfo;
  bitmap.GetObject(sizeof(bmInfo), &bmInfo);

  //第四步:使用BitBlt函数显示位图
  pDC->BitBlt(0,0,     //显示位置
   bmInfo.bmWidth, bmInfo.bmHeight,//显示位图的宽度和高度
   &dcComp,      //位图所在的兼容DC
   0,0,       //兼容DC中的位置
   SRCCOPY);      //显示方式
 }
}

注意:BitBlt函数只能按位图原来的比例显示,如需放大或压缩,可以使用CDC::StretchBlt函数,可以在上面函数中用下面的代码替代对BitBlt函数的调用),位图随窗口大小而变化:

  CRect rect;
  GetClientRect(rect);    //获取视图窗口客户区大小

  pDC->StretchBlt(0, 0,    //显示位置
   rect.Width(), rect.Height(), //显示的宽度和高度
   &dcComp,      //位图所在的兼容DC
   0, 0,       //兼容DC中的位置
   bmInfo.bmWidth, bmInfo.bmHeight,//位图的宽度和高度
   SRCCOPY);      //显示方式

如果要直接从文件中加载位图,而不是从应用程序的资源中加载位图,要使用全局函数LoadImage。可以将上面函数中的第一步加载位图的代码修改如下:

  CBitmap bitmap;
  HBITMAP hbitmap = (HBITMAP)LoadImage( //此函数可以从文件中加载一幅位图
   NULL,    //如果从资源加载,则指明包含位图资源的程序实例句柄
   "ppmm.bmp",   //位图文件的名字或者位图资源的ID
   IMAGE_BITMAP,  //加载的图像类型为位图
   0, 0,    //宽度和高度,0表示使用默认值
   LR_LOADFROMFILE); //加载标志,表明从文件加载

  bitmap.Attach(hbitmap);

  评论这张
 
阅读(98)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018