VC图形编程-创建应用程序_第1页
VC图形编程-创建应用程序_第2页
VC图形编程-创建应用程序_第3页
VC图形编程-创建应用程序_第4页
VC图形编程-创建应用程序_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、VC图形编程-创建应用程序 VC图形编程-创建应用程序 下面我们介绍建立一个Hello程序的步骤。 1. 启动VC+6.0, 从File菜单中选择New选 项, 并在对话框中,选择Projects标签,然 后单击MFC AppWizard(exe)。在Location 域中输入一个合适的路径名或单击 Browse按钮来选择一个。在Project name 中输入hello作为项目名称。这时候你会 看到hello也会出现在Location域中 VC图形编程-创建应用程序 VC图形编程-创建应用程序 VC图形编程-创建应用程序 VC图形编程-创建应用程序 VC图形编程-创建应用程序 VC图形编程-

2、创建应用程序 VC图形编程-创建应用程序 图形设备接口(Graphical Device Interface,GDI) 是windows用来管理图形操作 的一个与设备无关的函数库,提供了许多 有关图形操作的API函数。 Windows图形编程主要是利用图形设备接口 (GDI)中的相关函数实现的。 VC图形编程-创建应用程序 设备环境DC(Device Context)又称设备上下文,也 称设备描述表。 DC实际上是一个关于如何绘制图形的方法的集 合,它不仅可以绘制各种图形,而且还可以确定在应 用窗口中绘制图形的方式,即确定绘图模式和映射模 式。 用户在绘图之前,必须获取窗口区域的一个设备 环境

3、DC。接着才能进行GDI函数的调用,执行适合于 设备环境DC的命令。 VC图形编程-创建应用程序 lWindows设备环境是GDI的关键元素。它代表了 不同的物理设备,一般分为显示器型,打印机 型,内存型和信息型。 lMFC(Microsoft)类库中提供了设备环境 类CDC,CDC封装了Windows的DC,其 父类是CObject。 lMFC还提供了CDC的派生类CClientDC、 CPaintDC、CMetafileDC和CWindowDC. VC图形编程-创建应用程序 派生类名称说 明 CClientDC这是一个设备描述表,提供对窗口客户区域的图形访问。 在窗口中画图时可使用此类DC

4、,但对WM_PAINT Windows消息除外。 CMetaFileDC这个设备描述表代表Windows元文件,它包含一系列命令 已重新产生图像,想要创建独立于设备的文件是可用此类 DC,用户可以回放这种文件来创建图像。 CPaintDC这是创建响应WM_PAINT Windows消息的设备描述表。应 用程序可以使用此DC更新Windows显示,通常在MFC应用 程序的OnPaint()函数中使用。 CWindowDC可以提供在整个窗口(包括客户区和非客户区)中画图的 设备描述表。 VC图形编程-创建应用程序 用CPaintDC类和CClientDC类的对象绘制图形时,绘制区 只能是客户区,而

5、不能在非客户区,而CWindowsDC可以 在非客户区进行图形绘制。 CWindowsDC一般在框架窗口类中(CMainFrame)引用, 在视图窗口中引用CwindowsDC类时,由于视图类只能管理 客户区,所以并不能在非客户区进行绘制。 在CWindowsDC绘图类下,坐标系是建立在整个屏幕上的, 在像素坐标方式下,坐标原点在屏幕的左上角,而在 CPaintDC和CClientDC绘图类下,坐标系是建立在客户区上 的,在像素坐标方式下,坐标原点在客户区的左上角。 VC图形编程-创建应用程序 CPaintDC类应用在OnPaint函数中,以响应Windows的 WM_PAINT消息。而CCl

6、ientDC应用在非响应消息 WM_PAINT的情况。 CPaintDC类响应WM_PAINT消息,自动完成绘制,这对维 护图形的完整性有着重要的作用。 例如在一个窗口中,已经绘制了n条直线,这个窗口的完整 性可能会被破坏(如被对话框覆盖),当破坏完整性的程 序结束时,这个窗口就会接受到一个WM_PAINT消息,得 到此消息后,激活消息处理函数(如OnPaint)进行窗口绘 制。如果现在想在屏幕上再绘制一条直线,就要用到 CClientDC类,这个类可以的将图形绘制在屏幕上。 VC图形编程-创建应用程序 1. 在视图类的OnDraw成员函数中使用 在视图内绘图最常用的是使用在视图内绘图最常用的

7、是使用OnDraw函数。该函数是函数。该函数是Cview类中的类中的 一个虚函数,每次当视图需要重新绘制时,应用程序框架都会自动调用一个虚函数,每次当视图需要重新绘制时,应用程序框架都会自动调用 OnDraw函数。当用户改变了窗口尺寸,或者当窗口恢复了先前被遮盖的函数。当用户改变了窗口尺寸,或者当窗口恢复了先前被遮盖的 部分,或者当应用程序改变了窗口数据时,应用程序框架都会自动调用部分,或者当应用程序改变了窗口数据时,应用程序框架都会自动调用 OnDraw函数。函数。 void CHelloView:OnDraw(CDC* pDC) CPixelDoc* pDoc = GetDocument(

8、); ASSERT_VALID(pDoc); / TODO: add draw code for native data here pDC-TextOut(100,100,Hello!); VC图形编程-创建应用程序 2. 在视图窗口以外的窗口中使用 窗口类提供WM_PANT消息响应函数OnPaint,以便绘制或重绘,还 必须使用CPaintDC 派生类对象。在使用OnPaint后,OnDraw失效。 void CHelloView:OnPaint() CPaintDC dc(this); / device context for painting / TODO: Add your messa

9、ge handler code here dc.TextOut(0,0,在OnPaint函数中使用); dc.Ellipse(20,20,100,100); / Do not call CView:OnPaint() for painting messages VC图形编程-创建应用程序 3. 在OnDraw与OnPaint以外的消息响应函数中使 用 必须使用CClientDC派生类对象,如果函数在支持滚动的视窗中使用, 还需调用CscrollView:OnPrepareDC函数。 void CMainFrame:On32771() / TODO: Add your command handl

10、er code here CClientDC dc(this); dc.TextOut(200,100,在菜单命令消息响应函数中使用); dc.Ellipse(100,200,200,300); VC图形编程-创建应用程序 1.点 调用CDC类成员函数SetPixel 可以绘制一个点,调用 GetPixel可以获取点的颜色。 COLORREF SetPixel(int x ,int y ,COLORREF crColor); COLORREF SetPixel(POINT point ,COLORREF crColor); COLORREF GetPixel(int x ,int y ) co

11、nst; COLORREF GetPixel(POINT point ,) const; VC图形编程-创建应用程序 32位的COLORREF类型值来确定图形颜色值,其结构为0 x00bbggrr, bb:代表蓝色值,范围从00到FF; gg:代表绿色值,范围从00到FF; rr:代表红色值,范围从00到FF; 还可以用RGB宏来完成相同的功能: RGB(short red ,short green, short blue) red 代表红色值,范围从0到255; green代表绿色值,范围从0到255; blue代表蓝色值,范围从0到255; VC图形编程-创建应用程序 void CHell

12、oView:OnDraw(CDCvoid CHelloView:OnDraw(CDC* * pDC) pDC) CPixelDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); for(int i=0;i200;i+)for(int i=0;iSetPixel(1pDC-SetPixel(1* *i,50,RGB(0,0,255);i,50,RGB(0,0,255); for(int j=0;j200;j+)for(int j=0;jSetPixel(2pDC-SetPixel(2* *j,100,(COLORREF)0 x0000ff00);j,100

13、,(COLORREF)0 x0000ff00); for(int p=0;p200;p+)for(int p=0;pSetPixel(5pDC-SetPixel(5* *p,250,(COLORREF)0 x00ff00ff);p,250,(COLORREF)0 x00ff00ff); VC图形编程-创建应用程序 2. 直线 CPoint MoveTo(int x,int y); CPoint MoveTo(POINT point); BOOL LineTo(int x,int y); BOOL LineTo(POINT point); MoveTo移动坐标到当前点 LineTo从当前点到终点

14、画一条直线 VC图形编程-创建应用程序 void CHelloView:OnDraw(CDC* pDC) CHelloDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here pDC-MoveTo(30,30); pDC-LineTo(200,300); VC图形编程-创建应用程序 3. 弧 BOOL Arc(int x1,int y1,int x2,int y2,int x3,int y3, int x4,int y4); BOOL Arc(LPCRECT lpRect,

15、POINT ptStart,POINT ptEnd); BOOL ArcTo(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4); BOOL ArcTo(LPCRECT lpRect,POINT ptStart,POINT ptEnd); x1,y1, x2,y2 : 边界矩形左上角和右下角坐标 x3,y3, x4,y4 :弧线起点和终点坐标 lpRect:指定边界矩形 ptStart:指定弧线起点 ptEnd:指定弧线终点 VC图形编程-创建应用程序 void CHelloView:OnDraw(CDC* pDC) CHelloD

16、oc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here pDC-Arc(50,50,200,150,10,30,500,200); VC图形编程-创建应用程序 void CHelloView:OnDraw(CDC* pDC) CHelloDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here CRect rect(45,25,85,150); CPoi

17、nt pt1,pt2; pt1.x=5;pt1.y=5; pt2.x=250;pt2.y=30; pDC-ArcTo(rect,pt1,pt2); VC图形编程-创建应用程序 4. 折线 BOOL Polyline(LPPOINT lpPoints,int nCount) BOOL PolylineTo(const POINT *lpPoints,int nCount) lpPoints:指定折线的各个顶点坐标 nCount: 指定顶点的数目 VC图形编程-创建应用程序 5. 矩形 BOOL Rectangle(int x1,int y1,int x2,int y2); BOOL Rectan

18、gle(LPCRECT lpRect); BOOL RoundRect(int x1,int y1,int x2,int y2,int x3,int y3); BOOL RoundRect(LPCRECT lpRect,POINT point); RoundRect:绘制圆角矩形 x3,y3,point :矩形圆角椭圆的宽度和高度 VC图形编程-创建应用程序 void CHelloView:OnDraw(CDC* pDC) CHelloDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native

19、data here pDC-Rectangle(20,20,100,60); pDC-RoundRect(150,20,200,150,20,15); VC图形编程-创建应用程序 6. 椭圆 BOOL Ellipse(int x1,int y1,int x2,int y2); BOOL Ellipse(LPCRECT lpRect); 7. 扇形 BOOL Pie(int x1,int y1,int x2,int y2,int x3,int y3); BOOL Pie(LPCRECT lpRect,POINT ptStart,POINT ptEnd); 8. 多边形 BOOL Polygon(

20、LPPOINT lpPoints,int nCount); VC图形编程-创建应用程序 void CHelloView:OnDraw(CDC* pDC) CHelloDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here pDC-Ellipse(20,70,140,150); CRect rect(250,150,300,100); CPoint pt1,pt2; pt1.x=250; pt1.y=20; pt2.x=300; pt2.y=100; pDC-Pie(rec

21、t,pt1,pt2); CPoint p1(340,20); CPoint p2(320,80); CPoint p3(350,120); CPoint p4(420,100); CPoint p5(400,20); CPoint p5=p1,p2,p3,p4,p5; pDC-Polygon(p,5); VC图形编程-创建应用程序 CBitmap类:用于管理、绘制位图资源的类。 CPen:用于管理线条绘制的类,通过Cpen类对象,可以设置绘 图时的线型、线条宽度、颜色等属性。 CBrush:定义了画刷,通过Cbrush对象,可以设置绘制封闭图 形的填充色、填充模式等属性。 Cpalette:该

22、类用于管理应用程序的调色板,使应用程序的调色 板与其他应用程序不干扰。 CRgn:该类定义了区域,区域是由一个或多个封闭几何体构成 的一个范围,来进行填充、鼠标测试等工作。 Cfont:该类用于管理字体,设置绘制文本的字体大小、字体样 式等属性。 VC图形编程-创建应用程序 画笔是一种用来画线及绘制有形边框的 工具,用户可以指定它的颜色及厚度,并 且可以指定它画实线、点线或虚线。 画刷是用来填充封闭图形的。 VC图形编程-创建应用程序 .使用库存画笔与画刷 Windows提供的个库存画笔: BLACK_PEN:黑色画笔 NULL_PEN:空画笔 WHITE_PEN:白色画笔 Windows提供

23、的个库存画刷: BLACK_BRUSH:黑色画刷 DKGRAY_BRUSH:深灰色画刷 GRAY_BRUSH:灰色画刷 HOLLOW_BRUSH:透明窗口画 刷 LTGRAY_BRUSH:浅灰色画刷 NULL_BRUSH:空画刷 WHITE_BRUSH:白色画刷子 通过调用 SelectStockObject 选择画笔或画刷子 VC图形编程-创建应用程序 void CHelloView:OnDraw(CDC* pDC) CHelloDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CRect rect1(20,20,320,220); CRect r

24、ect2(95,95,245,195); CPoint pt; pt.x=pt.y=10; CBrush *pBrush=(CBrush*) pDC- SelectStockObject(KGRAY_BRUSH); pDC-RoundRect(rect1,pt); CPen *pPen=(CPen*) pDC-SelectStockObject(WHITE_PEN); pDC-RoundRect(rect2,pt); pDC-SelectObject(pPen);/恢复画笔 pDC-SelectObject(pBrush);/恢复画刷 VC图形编程-创建应用程序 .自定义画笔 调用CPen 类

25、成员函数CPen、CreatePen、 CreatePenIndirect可以创建画笔。 CPen(int nPenStyle,int nWidth,COLORREF crColor); BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor); BOOL CreatePenIndirect(LPLOGPEN lpLogPen); VC图形编程-创建应用程序 nPenStyle:设置画笔的样式。常用样式如下: PS_SOLID:实线画笔。 PS_DASH:虚线画笔,仅当线宽为1时有效。 PS_DOT:点线画笔,仅当线宽为1时有效。 PS

26、_DASHDOT:点划线画笔,仅当线宽为1时有效。 PS_DASHDOTDOT:双点划线画笔,线宽为1时有效 PS_NULL: 空笔不划线。 nWidth :指定画笔宽度。 VC图形编程-创建应用程序 lpLogPen:指向包含画笔信息的LOGPEN结构变量。 LOGPEN结构定义如下: typedef struct tagLOGPEN UNIT lopnStyle; /设置画笔的样式 POINT lopnWidth; /设置画笔的宽度 COLORREF lopnColor; /设置画笔的颜色 LOGPEN; VC图形编程-创建应用程序 void CHelloView:OnDraw(CDC*

27、pDC) CHelloDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here CPen NewPen(PS_SOLID,5,RGB(0,0,255); CPen *pOldPen=pDC-SelectObject( pDC-MoveTo(10,20); pDC-LineTo(500,200); pDC-SelectObject(pOldPen); VC图形编程-创建应用程序 3. 自定义画刷 调用CBrush类成员函数CBrush、CreateSolidBush、 Cre

28、ateHatchBrush、CreatePatternBrush和CreateBrushIndirect 等 可以创建画刷。 CBrush(COLORREF crColor); CBrush(int nIndex,COLORREF crColor); BOOL CreateSolidBrush(COLORREF crColor); BOOL CreateHatchBrush(int nIndex,COLORREF crColor); BOOL CreatePatternBrush(CBitmap *pBitmap); BOOL CreateBrushIndirect(const LOGBRUS

29、H* lpLogBrush); VC图形编程-创建应用程序 nIndex:指定图案的模式。可供选择的模式如下: HS_BDIAGONAL:从左到右向下成45度的对角线。 HS_CROSS:水平线和垂直线相交的十字交叉线。 HS_DIAGCROSS:夹角为45度的斜十字交叉线。 HS_FDIAGONAL:从左到右向上成45度的对角线。 HS_HORIZONAL:水平阴影线。 HS_VERTICAL: 垂直阴影线。 pBitmap:指定位图对象 lpLogBrush:指向包含画刷信息的LOGBRUSH结构变量 VC图形编程-创建应用程序 void CHelloView:OnDraw(CDC* pD

30、C) CHelloDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here CBrush NewBrush1(RGB(0,255,0); CBrush *pOldBrush1=pDC-SelectObject( pDC-Rectangle(50,50,200,300); pDC-SelectObject(pOldBrush1); VC图形编程-创建应用程序 .绘制矩形边框 void FrameRect(LPCRECT lpRect,CBrush* pBrush); 2. 用

31、画刷子填充矩形区域 void FillRect(LPCRECT lpRect,CBrush* pBrush); .用指定颜色填充矩形区域 void FillSolidRect(LPCRECT lpRect,COLORREF clr); void FillSolidRect(int x int y,int cx,int cy,COLORREF clr); 4. 用当前颜色的相反色填充 void InvertRect(LPCRECT lpRect); VC图形编程-创建应用程序 void CHelloView:OnDraw(CDC* pDC) CHelloDoc* pDoc = GetDocume

32、nt(); ASSERT_VALID(pDoc); CRect rect1(50,50,150,100); CRect rect2(160,50,260,100); CRect rect3(50,110,150,160); CRect rect4(160,110,260,160); CBrush brush1(RGB(0,0,255); CBrush brush2(RGB(255,0,0); pDC-FillRect(rect1, pDC-FrameRect(rect2, pDC-FillSolidRect(rect3,RGB(0,255,0); pDC-FillRect(rect4, pDC-InvertRect(rect4); VC图形编程-创建应用程序 .菜单设计 .对话框的设计 .用鼠标绘图 VC图形编程-创建应用程序 在VC中,鼠

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论