文档库 最新最全的文档下载
当前位置:文档库 › visual c++图形程序设计基础

visual c++图形程序设计基础

visual c++图形程序设计基础
visual c++图形程序设计基础

Visual C++图形程序设计基础

一、前言:

Visual C++是在Microsoft C的基础上发展而来的,随着计算机软、硬件技术的快速发展,如今Visual C++已成为集编辑、编译、运行、调试于一体功能强大的集成编程环境。本章以Visual C++ 6.0为对象,主要介绍Visual C++集成编成环境的使用、图形设备接口和常用图形程序设计、鼠标编程以及菜单设计等基础,目的是通过对Visual C++的学习,掌握Visual C++图形程序设计的方法,为计算机图形学原理部分的算法实现提供程序工具和方法。大致以下目的:

1.学习Visual C++图形程序设计的方法;

2.掌握Visual C++集成编成环境的使用、图形设备接口和常用图形程序设计、鼠标编程、橡皮筋交互技术、画刷与画笔以及菜单设计等;

二、Visual C++图形程序设计基础

2.1 Visual C++ 6.0应用程序开发方法

介绍Visual C++ 6.0集成开发环境,以一个简单的实例介绍利用Visual C++应用程序工程建立方法和程序设计框架。

2.1.1 Visual C++的集成开发环境

从开始菜单中启动Visual C++ 6.0,进入开发集成环境。打开一个项目后,可以看到Visual C++ 6.0的开发环境由标题栏、工具栏、工作区窗口、源代码编辑窗口、输出窗口和状态栏组成,见图2.1所示。

标题栏用于显示应用程序名和所打开的文件名,标题栏的颜色可以表明对应窗口是否被激活。菜单栏包括文件、编辑、显示、插入、工程、编译、工具、窗口和帮助九项主菜单,包含了从源代码的编辑、界面设计、程序调试和编译运行在内的所有功能。工具栏列出了常用的菜单命令功能和对象方法。工具栏的下面是两个窗口,一个是工作区窗口,用于列出工程中的各种对象,一个是源代码编辑窗口,用于各个对象的程序设计。输出窗口显示项目建立过程中所产生的各种信息。屏幕底端是状态栏,它给出当前操作或所选择命令的提示信息。

图2.1 Visual C++ 6.0集成开发环境

2.1.2 应用程序工程的建立方法

Visual C++提供了一种称为App Wizard 的工具,利用该工具,用户可以方便地按照自己的需要创建符合需要的应用程序框架。在这个基础上,用户可以进一步将自己编写的程序加入到这个框架中,实现用户程序的功能。下面介绍建立VcApp 应用程序框架的方法,其它应用程序的方法都与此类似。

第一步:启动Visual C++,选择工程方法

从开始菜单中选择 Visual C++,进入Visual C++集成环境。从文件菜单中选择新建(New)命令,弹出图3-2对话框。切换到工程(Projects )标签,项目类型选择MFC AppWizard(exe),输入工程的名字(如VcApp ),选择项目放置的位置,然后单击“确定”按钮。

图3-2 Visual C++的New 对话框

第二步:设置应用程序的特性。

这些设置包括六个问题,每一个问题都有不同的选项供选择。一个问题选择完后,通过“下一步”(Next)选择下一个问题,直到六个问题选择完毕。还可以通过“上一步”(Back)返回上一个问题重新选择。下面继续上面的例子,在单击“确定”按钮后,弹出第一个问题窗口,如图3-3所示。

第一个问题是建立什么类型的应用程序,有三个选项:单个文档(Single document)、多重文档(Multiple document)和基本对话(Dialog based)。单个文档应用程序主窗口中只有一个窗口,多重文档可以在主窗口中开多个子窗口,基本对话主窗口是一个对话框。例中选择单个文档,单击“确定”,进入下一个问题,如图3-4所示。

第二个问题是数据库的支持,是否用ODBC存取数据库,有四个选项:不包括数据库的支持(None)、仅包含ODBC头文件(Header files only)、指定一个数据库但没有文件支持和指定一个数据库但需要文件支持。当选择了后两项,则需要用户选择一个已经建立的数据库。例中不需要数据库支持,选择第一个选项“否”,进入第三个问题,如图3-5所示。

图3-3 第一个问题:选择应用程序的类型

图3-4 第二个问题:选择是否要用ODBC支持

第三个问题是对ActiveX的支持。有五个选项:(1)没有对ActiveX的支持;(2)ActiveX 容器,它可以包含链接和嵌入对象。容器不能为其它的ActiveX程序提供支持,它只能维护嵌入对象;(3)微型服务器(Mini-server),应用程序不能独立运行,只能被调用为其它程序建立ActiveX对象。(4)完整服务器(Full-server),它能够独立运行,并能够为其它应用程序建立ActiveX对象。(5)容器和服务器,一个应用程序可以同时是容器和服务器。

在例子中,选择第一个选项,没有对ActiveX的支持,单击“下一个”(Next)进入下一个问题。

图3-5 第三个问题:选择是否对ActiveX的支持

第四个问题是应用程序的特性和高级选项,如图3-6所示。

图3-6 应用程序的特性和高级选项

例中全部采用默认选项,进入下一个问题。

第五个问题是项目的风格、原文件注释和MFC库类型,如图3-7所示。

在例子中全部采用默认选项,进入第六个问题。

第六个问题是确定类名和文件名,如图3-8所示。

基于第一个问题到第五个问题的回答,AppWizard会把将要建立的新类的名称通知用户。AppWizard将为应用程序建立四个新类,CVcAppApp是应用程序类,它是CWinApp的派生类。CMainFrame是一个拥有应用程序主窗口的类。CVcAppDoc和CVcAppView是该应用程序的文档和视图类。这些名字用户可以改变。最后单击“完成”(Finish),显示所建项目的信息,单击“确定”后,项目建立完成。

图3-7 项目的风格、原文件注释和MFC库类型

图3-8 通知MFC产生的类名称

2.1.3 输入源程序进行程序设计

应用程序项目工程建立以后,就为应用程序的开发建立了一个框架,这是不输入任何

程序代码,对该项目程序进行编译和运行,可以生成一个完整的窗口程序。用户根据项目工程中的不同类,输入自己设计的程序代码,完成用户的程序设计。

例如,从VcApp Classes中找到CVcAppView的OnDraw()函数,如图3-9所示。双击OnDraw()函数,这时系统会打开VcAppView.cpp文件,而且光标正置于OnDraw()函数中,在其中输入下列语句:

pDc->TextOut(30,30,”同学们好,欢迎使用VC++编程!”);

编译并运行该程序,运行结果如图3-10所示。

图3-9 输入程序源代码

图3-10 运行结果

2.2 图形设备接口和图形程序设计

2.2.1 图形设备接口简介

在Windows系统中,程序都是通过一个叫做图形设备接口(GDI, Graphics Device Interface)的抽象接口和硬件打交道,Windows会自动将设备环境表映射到相应的物理设备,并且会提供正确的输入/输出指令。

GDI是Windows系统核心的三种动态链接库之一,它管理Windows系统的所有程序的图形输出。在Windows系统中,GDI向程序员提供了高层次的绘图函数,只要掌握这些绘图函数,就可以很方便地进行图形程序设计。

另一个概念是设备描述表(DC, Device Context)。DC是一个数据结构,当程序向GDI 设备中绘图时,需要访问该设备的DC。MFC将GDI的DC封装在C++类中,包括CDC类和CDC派生类,这些类中的许多成员都是对本地GDI绘图函数进行简单封装而形成的内联函数。

DC的作用就是提供程序与物理设备或者虚拟设备之间的联系,除此之外,DC还要处理绘图属性的设置,如文本的颜色等。程序员可以通过调用专门的GDI函数修改绘图属性,如SetTextColor()函数。

CDC类是GDI封装在MFC中最大的一个类,它表示总的DC。表2.1列出了CDC中的一些常用绘图函数。

表2.1 CDC类中常用绘图函数

函数描述使用频率Arc() 椭圆弧****

BitBlt() 把位图从一个DC拷贝到另一个DC *

Draw3dRect() 绘制三维矩形**

DrawDragRect() 绘制用鼠标拖动的矩形**

DrawEdge() 绘制矩形的边缘**

DrawIcon() 绘制图标***

Ellipse() 绘制椭圆****

FillRect() 绘制用给定的画刷颜色填充矩形***

FillRgn() 绘制用给定的画刷颜色填充区域***

FillSolidRed() 绘制用给定的颜色填充矩形***

FloodFill() 用当前的画刷颜色填充区域***

FrameRect() 绘制矩形边界**

FrameRgn() 绘制区域边界**

GetBKColor() 获取背景颜色*****

GetCurrentBitmap() 获取所选位图的指针**

GetCurrentBrush() 获取所选画刷的指针***

GetCurrentFont() 获取所选字体的指针***

GetCurrentPalette() 获取所选调色板的指针***

GetCurrentPen() 获取所选画笔的指针***

GetCurrentPosition() 获取画笔的当前位置****

GetDeviceCaps() 获取显示设备能力的信息**

GetMapMode() 获取当前设置映射模式 *** Getpixel() 获取给定像素的RGB 颜色值 ***** GetPolyFillMode() 获取多边形填充模式 *** GetTextColor() 获取文本颜色 **** GetTextExtent()

获取文本的宽度和高度 ** GetTextMetrics() 获取当前文本的信息 ** GetWindow() 获取DC 窗口的指针 ** GrayString() 绘制灰色文本 *** LineTo() 绘制直线 ****** MoveTo() 设置当前画笔位置 ****** Pie() 绘制饼图 *** Polygon() 绘制多边形 *** PolyLine() 绘制一组直线

*** RealizePalette() 将逻辑调色板映射到系统调色板 ** Rectangle() 绘制矩形 **** RoundRect() 绘制圆角矩形 *** SelectObject() 选择GDI 绘图对象 ** SelectPalette() 选择逻辑调色板 ** SelectStockObject() 选择预定义图形对象 ** SetBkColor() 设置背景颜色 ****** SetMapMode() 设置映射模式

*** SetPixel() 把像素设定为给定的颜色 ****** SetTextColor() 设置文本颜色

****** StretchBlt() 把位图从一个DC 拷贝到另一个DC ,并根据需要扩展或压缩位图 * TextOut()

绘制字符串文本

*****

这些函数的语法和使用可以通过MSDN 帮助查询。2.2.2节主要介绍Windows 中基本图形,包括电、直线、圆、圆弧、矩形、椭圆、扇形、折线等程序设计

2.2.2 绘制基本图形

(1)画点

SetPixel()函数可以在指定的坐标位置按指定的颜色画点。函数原型说明如下:

其中,(X ,Y )为点的坐标位置,crColor 参数为点的颜色值。如果函数调用成功,则函数返回像素的颜色值,否则返回值为-1。颜色值通过RGB(Red,Green,Blue)来设置,其中三个参数取值0~255。例如,在VcAPP 项目中,在CVcAppView 类中的OnDraw()函数中加入下列画点语句:

//绘制一组彩色点 //绘制一组彩色点 pDC->TextOut(20,20,"point:");

pDC->SetPixel(100,20,RGB(255,0,0));

pDC->SetPixel(110,20,RGB(0,255,0));

pDC->SetPixel(120,20,RGB(0,0,255));

pDC->SetPixel(100,20,RGB(255,255,0));

pDC->SetPixel(100,20,RGB(255,0,255));

pDC->SetPixel(100,20,RGB(0,255,255));

pDC->SetPixel(100,20,RGB(0,0,0));

pDC->SetPixel(100,20,RGB(255,255,255));

运行程序,查看运行结果。

(2)画直线和折线

画直线需要LineTo()和MoveTo()两个函数的配合使用。

LineTo()函数以当前位置所在的点为直线的起点,另指定一个点为直线的终点,画出一段直线。直线的颜色通过画笔的颜色来设定,在后面介绍。LineTo()函数原型说明如下:

直线的终点位置由(nXEnd, nYEnd)指定。如果函数调用成功,那么该点就成为当前位置,并返回TRUE,否则返回FALSE。

MoveTo()函数只是将当前位置移动到指定位置,它并没有画出直线,其函数说明为:

示例:在CVcAppView类中的OnDraw()函数中加入下列画点语句:

//绘制直线

pDC->TextOut(20,60,"Line:");

pDC->MoveTo(20,90);

pDC->LineTo(160,90);

Polyline()函数用来画一条折线,而PolyPolyline()函数则用来画多条折线,它们的函数原型说明如下:

在Polyline()函数中,lppt是指向折线顶点数组的指针,而cPoints是折线顶点数组中的顶点数。例如,绘制一条具有4个顶点的折线,程序如下:

POINT polylinepoint[4]={{70,240},{20,190},{70,190},{20,240}};

pDC->Polyline(polylinepoint,4);

在PolyPolyline()函数中,lppt是指向保存顶点数组的指针,而各条折线的顶点数则保存在lpdwPolyPoints参数所指向的数组中,最后的cCount参数指定折线的数目。例如:POINT polypolylinePt[9]={{95,160},{120,185},{120,250},{145,160},{120,185},

{90,185},{150,185},{80,210},{160,210}};

DWORD dwPolyPoints[4]={3,2,2,2}; //分四段折线,分别占用3,2,2,2个顶点

pDC->PolyPolyline(polypolylinePt, dwPolyPoints, 4);

注:由于一条折线至少需要2个顶点,因此dwPolyPoints数组中的数不应该小于2。

(3)画弧线和曲线

通过Arc()函数画弧线或整个椭圆。椭圆限定在一个矩形内,称为外接矩形。Arc()函数的圆形说明如下:

其中,(nLeftRect, nTopRect)是外接矩形的左上角坐标值,(nRightRect, nBottomRect)是外接矩形的右下角坐标值。而椭圆中心与点(nXStartArc, nYStartArc)所构成的射线与椭圆的交点成为弧线的起点,椭圆中心与点(nXEndArc, nYEndArc)所构成的射线与椭圆的交点成为弧线的终点。椭圆上从始点到终点就形成一条弧线。

在Windows系统中,弧线从始点到终点的方向是逆时针方向,但可以通过SetArcDirection()函数将绘制弧线方向设置为顺时针方向。

示例,用Arc()绘制圆、圆弧和椭圆,程序如下:

for (i=0;i<6;i++)

{

pDC->Arc(260-5*i,70-5*i,260+5*I,70+5*i,260+5*i,70,260+5*i,70);

}

for (i=3;i<6;i++)

{

pDC->Arc(260-10*i, 70-10*i, 260+10*i, 70+10*i,

(int)260+10*i*cos(60*2.1415926/180),

(int)70+10*i*sin(60*2.1415926/180),

(int)260+10*i*cos(60*2.1415926/180),

(int)70-10*i*sin(60*2.1415926/180));

pDC->Arc(260-10*i, 70-10*i, 260+10*i, 70+10*i,

(int)260-10*i*cos(60*2.1415926/180),

(int)70-10*i*sin(60*2.1415926/180),

(int)260-10*i*cos(60*2.1415926/180),

(int)70+10*i*sin(60*2.1415926/180));

}

Bezier曲线是最常见的非规则曲线之一。Bezier曲线属于三次曲线,需要四个控制顶点来确定一条Bezier曲线,其中曲线通过第一点和最后一点,并且第一条边和最后一条边是曲线在起点和终点处的切线,从而确定了曲线的走向。PolyBezier()函数可以画出一条或多条Bezier曲线,其函数原型说明如下:

其中,lppt 参数是曲线控制顶点所组成的数组,cPoints 参数表示lppt 数组中的顶点数,一条Bezier 曲线需要四个控制顶点。如果lppt 数组用于画多条Bezier 曲线,第二条以后的曲线只需要三个控制顶点,因为后面的曲线总是把前一条曲线的终点作为自己的起点。

示例,给出四个控制顶点,画出一条Bezier 曲线和特征多边形。 //绘制Bezier 曲线

POINT polyBezier[4]={{20,310},{60,240},{120,300},{160,330}}; pDC->Polyline(polyBezier,4); pDC->PolyBezier(polyBezier,4);

(4)画封闭曲线

Windows 中提供了一组画封闭曲线的函数,包括绘制矩形、多边性、椭圆等,这些画封闭曲线的函数不但可以利用画笔来画出轮廓线,同时还可以利用画刷来填充这些封闭曲线所围成的区域。

Rectangle()函数用来画矩形,其函数原型说明如下:

其中,参数nLeftRect 和 nTopRect 给出了矩形左上角的坐标,而nRightRect 和 nBottomRect 则给出矩形的右下角坐标。

Ellipse()函数的作用则是画椭圆形。在Ellipse()函数中,椭圆是由其外接矩形来确定的,外接矩形的中心与椭圆中心重合,矩形的长与宽和椭圆的长短轴相等。函数说明如下:

其中的参数说明与Rectangle()函数相同。

RoundRect()函数用来画圆角矩形,其函数的原型说明如下:

其中的前四个参数与Rectangle()函数相同,nWidth 表示圆角的宽度, nHeight 表示圆角的高度。

Polygon()函数用来画封闭的任意多边形,其函数原型说明如下:

其中的参数说明与Polyline()函数相同。但两个函数有区别,Polygon()

函数会自动将起

点和终点相连形成封闭的多边形,而Polyline()函数则画出多条折线,只有当最后一点与起点相同时才画出封闭的多边形。

示例,绘制矩形、圆角矩形、椭圆和多边形,程序如下:

//绘制矩形、圆角矩形、椭圆和多边形

pDC->Rectangle(190,270,250,310);

pDC->RoundRect(265,270,330,310,30,20);

pDC->Ellipse(260-50,200-30,260+50,200+30);

POINT polygonPts[3]={{390,160},{430,220},{350,210}};

pDC->Polygon(polygonPts,3);

2.2.3 画笔与画刷

(1)画笔

当绘制图形时,线条的属性,包括颜色、宽度、样式等都是由画笔来确定的。程序员可以创建画笔,定义画笔的属性,从而画出多彩的图形。

创建画笔包括CreatePen()和CreatePenIndirect()两个函数。MFC将这些函数封装在CPen 类中,这样画笔就能够被视为对象进行处理。下面介绍创建画笔的方法。

方法一:直接构造一个CPen对象,并将定义画笔的参数传给它,例如:

CPen pen(PS-SOLID,1,RGB(255,0,0));

创建一个宽度为一个像素、实线和红色的画笔。

方法二:首先声明一个没有初始化的CPen类对象,然后再用CreatePen()函数定义画笔的属性。例如,

CPen Pen;

Pen->CreatePen (PS-SOLID,1,RGB(255,0,0));

方法三:先声明一个CPen类对象和一个描述画笔结构的LOGPEN类对象,并填入画笔的属性值,然后调用CreatePenIndirect()函数来创建画笔。如下所示:

CPen Pen;

LOGPEN LogPen;

LogPen.lopnStyle=PS_SOLID;

LogPen.lopnWidth=1;

LogPen.lpenColor=RGB(255,0,0);

Pen.CreatePenIndirect(&LogPen);

如果画笔被成功创建,那么两个函数返回TRUE,否则返回FALSE。

画笔包括样式、宽度和颜色三个属性。表2.2列出了GDI画笔的样式。

表2.2 GDI画笔的样式

样式说明

PS_SOLID 创建实线笔

PS_DASH 创建虚线笔,只有当画笔宽度小于或等于1时有效

PS_DOT 创建点线笔,只有当画笔宽度小于或等于1时有效

PS_DASHDOT 点划线笔,只有当画笔宽度小于或等于1时有效

PS_DASHDOTDOT 双点划线笔,只有当画笔宽度小于或等于1时有效

PS_NULL 创建NULL笔,不绘制任何图形

PS_INSIDEFRAME 创建可以在封闭框架内部绘制直线的画笔。

画笔的宽度用像素个数来确定。PS_DASH、PS_DOT、PS_DASHDOT和PS_DASHDOTDOT参数要求画笔宽度只能为1,其它参数可以创建任意宽度的画笔。画笔的颜色是一个24位的RGB颜色,由RGB(rColor,gColor,bColor)来定义,三个参数取值0~255。

Windows预定义了三个实线、1个像素宽的画笔,它们是WHITE_PEN、BLACK_PEN 和NULL_PEN,程序中可以直接使用这些画笔,方法如下:

CPen Pen;

Pen.CreateStockObject(WHITE_PEN);

示例:在屏幕上绘制三组直线,第一组按不同线型绘制,第二组按不同宽度绘制,第三组按不同颜色绘制。程序如下:

//画笔的样式、宽度和颜色

int i1;

int nPenStyle[]=

{

PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDOT,PS_NULL,

PS_INSIDEFRAME,

};

CPen *pNewPen;

CPen *pOldPen;

//用不同样式的画笔

for (i1=0;i1<7;i1++)

{

//构造新笔

pNewPen=new CPen;

if (pNewPen->CreatePen(nPenStyle[i1],1,RGB(0,0,0)))

{

pOldPen=pDC->SelectObject(pNewPen); //选择新笔,并保存旧笔

//画直线

pDC->MoveTo(20,60+i1*20);

pDC->LineTo(160,60+i1*20);

//恢复原有的笔

pDC->SelectObject(pOldPen);

}

else

{

//出错提示

AfxMessageBox("CreatePen Erroe!!");

}

//删除新笔

delete pNewPen;

}

//用不同的宽度的笔绘图

for(i1=0;i1<7;i1++)

{

//构造新笔

pNewPen=new CPen;

if (pNewPen->CreatePen(PS_SOLID,i1+1,RGB(0,0,0)))

{

pOldPen=pDC->SelectObject(pNewPen);

//画直线

pDC->MoveTo(200,60+i1*20);

pDC->LineTo(340,60+i1*20);

//恢复原有的笔

pDC->SelectObject(pOldPen);

}

else

{

//出错提示

AfxMessageBox("CreatePen Erroe!!");

}

//删除新笔

delete pNewPen;

}

//设置颜色表

struct tagColor

{

int r,g,b;

} color[7]=

{

{255,0,0},{0,255,0},{0,0,255},

{255,255,0},{255,0,255},{0,255,255},{0,0,0},

};

//用不同颜色绘图

for(i1=0;i1<7;i1++)

{

//构造新笔

pNewPen=new CPen;

if (pNewPen->CreatePen(PS_SOLID,2,RGB(color[i1].r,color[i1].g,color[i1].b))) {

pOldPen=pDC->SelectObject(pNewPen);

//画直线

pDC->MoveTo(380,60+i1*20);

pDC->LineTo(520,60+i1*20);

//恢复原有的笔

pDC->SelectObject(pOldPen);

}

else

{

//出错提示

AfxMessageBox("CreatePen Erroe!!");

}

//删除新笔

delete pNewPen;

}

//画笔程序结束

(2)画刷

在进行区域填充或绘制封闭图形时,需要用到画刷。MFC把GDI画刷封装在CBrush 类中。画刷分三种基本类型:纯色画刷、阴影画刷和图案画刷。

纯色画刷绘图使用单色来定义,颜色由RGB()函数来确定。纯色画刷可以采用直接声明的方法,例如:

CBrush Brush(RGB(255,0,0)); 创建一个红色画刷。

也可以采用分步方法,由CreateSolidBrush()函数创建。

CBrush Brush;

Brush->Create->CreateSolidBrush(RGB(255,0,0));

Windows预定义了七种画刷,包括:BLACK_BRUSH、DKGRAY_BRUSH、GRAY_BRUSH、LTGRAY_BRUSH、HOLLOW_BRUSH、NULL_BRUSH和WHITE_BRUSH。可以参照CPen类的方法,采用CreateStockObject()来使用预定义的画刷。

阴影画刷使用预定义的六种阴影样式进行绘图。表2.3列出了六种阴影样式。

表2.3六种阴影样式

阴影样式说明

HS_BDIAGONAL 45度向下阴影线(从左到右)

HS_CROSS 水平线与垂直线交叉阴影

HS_DIAGCROSS 45度方向的交叉阴影线

HS_FDIAGONAL 45度向上阴影线(从左到右)

HS_HORIZONTAL 水平阴影线

HS_VERTICAL 垂直阴影线

创建阴影画刷的方法与纯色画刷的创建方法相似,例如创建一个45度方向的交叉阴影线的画刷,方法如下:

CBrush Brush(HS_DIAGCROSS,RGB(255,0,0));

或者

CBrush Brush;

Brush->CreateHatchBrush(HS_DIAGCROSS,RGB(255,0,0));

函数中有两个参数,第一个参数是画刷的阴影样式,第二个参数是阴影线的颜色。

示例:绘制缺省画刷的矩形,纯色画刷矩形和绘制100单位的矩形,并且用白色45度交叉线阴影将其填充,程序如下:

//画刷程序

pDC->Rectangle(300,300,400,400); //缺省的画刷,白色

//纯色画刷

CBrush *pNewBrush1;

CBrush *pOldBrush1;

pNewBrush1=new CBrush;

if (pNewBrush1->CreateSolidBrush(RGB(255,0,0)))

{

//选择新画刷

pOldBrush1=pDC->SelectObject(pNewBrush1);

//绘制矩形

pDC->Rectangle(200,200,300,400);

//恢复原有画刷

pDC->SelectObject(pOldBrush1);

}

delete pNewBrush1;

//阴影画刷

CBrush Brush(HS_DIAGCROSS,RGB(255,255,255));

CBrush *pOldBrush;

pOldBrush=pDC->SelectObject(&Brush);

pDC->SetBkColor(RGB(192,192,192));

pDC->Rectangle(0,0,100,100);

pDC->SelectObject(pOldBrush);

2.2.4 文本显示

Windows可以显示很多数据,包括在窗口中显示文本信息。由于文本是以图像的形式显示在窗口中的,因此需要处理设备描述表(DC),另外还需要对文本字体的处理,包括:文本的显示、文本的颜色、字符的间距和文本的对齐方式等。

(1)文本显示

在拥有一个设备描述表以后,就可以调用TextOut()函数来显示文本行。例如:pDC->TextOut(20,20,”This is a line of text.”);

TextOut()函数的三个参数分别是输出文本的X坐标和Y坐标以及输出文本串。

(2)设置文本颜色

在默认情况下,Windows绘制黑色文本。可以通过SetTextColor()函数改变文本的颜色。例如:

CDC *pDC=GetDC(); //声明一个设备描述表pDC1

pDC->SetTextColor(RGB(255,0,0)); //设置文本颜色为红色

可以通过GetTextColor()函数检索到当前文本的颜色,例如:

COLORREF color=pDC->GetTextColor();

SetBkColor()和GetBkColor()函数用于设置背景颜色和获取当前的背景颜色。

(2)设置字符间距

SetTextCharacterExtra()函数用来设置文本字符的间距,GetTextCharacterExtra()用来获得当前文本字符的间距,函数说明如下:

pDC-> SetTextCharacterExtra(space);

int space=pDC-> GetTextCharacterExtra();

其中,space表示在文本字符之间使用的额外空间的像素数。

(3)设置文本的对齐方式

SetTextAlign()函数用于设置显示文本的对齐方式,函数说明如下:

pDC->SetTextAlign(alignment);

其中,alignment参数取值:TA_LEFT、TA_CENTER和TA_RIGHT,分别表示左对齐、居中方法和右对齐。Alignment参数取值:TA_TOP、TA_BOTTOM和TA_BASELINE分别表示文本在垂直方向的对齐方式,上对齐、下对齐和字符的基线对齐。

2.3 鼠标编程

在图形操作系统中,鼠标是最重要的输入设备之一。Windows系统为用户提供了统一的鼠标编程接口,而不必过多了解其底层的知识。Windows是基于消息传递、事件驱动的操作系统,当用户移动鼠标、按下或释放鼠标键时都会产生鼠标消息。应用程序可以接收10种鼠标消息,表2.3列出了这些鼠标消息和它们的描述。

表2.3鼠标消息和描述

消息描述

WM_LBUTTONDBLCLK 鼠标左键被双击

WM_LBUTTONDOWN 鼠标左键被按下

WM_LBUTTONUP 鼠标左键被释放

WM_MBUTTONDBLCLK 鼠标中键被双击

WM_MBUTTONDOWN 鼠标中键被按下

WM_MBUTTONUP 鼠标中键被释放

WM_MOUSEMOVE 鼠标移动穿过对象区域

WM_RBUTTONDBLCLK 鼠标右键被双击

WM_RBUTTONDOWN 鼠标右键被按下

WM_RBUTTONUP 鼠标右键被释放

2.2.1 鼠标消息处理

MFC把鼠标消息处理函数封装在CView类中,它们分别是:

OnMouseMove(UINT nFlags, CPoint point);

OnLButtonDblclk(UINT nFlags, CPoint point);

OnLButtonDown(UINT nFlags, CPoint point);

OnLButtonUp(UINT nFlags, CPoint point);

……

分别对应表2.3中10个鼠标消息。在鼠标处理函数中,point参数代表鼠标热点处的坐标位置,point.x为横坐标,point.y为纵坐标。默认坐标原点(0,0)位于窗口的左上角。由于应用程序要求自动捕获鼠标事件,因此应当采用Windows事件处理函数,而不是成员函数,具体使用方法参见2.2.3节示例程序。

nFlags参数中包含了鼠标按钮和键盘组合使用标志,用来描述鼠标按钮和键盘上的Shift

键和Ctrl键的组合状态。nFlag参数取值范围:

(1) MK_LBUTTON:鼠标左键被按下;

(2) MK_RBUTTON:鼠标右键被按下;

(3) MK_MBUTTON:鼠标中键被按下;

(4) MK_SHIFT:键盘上的Shift键被按下;

(5) MK_CONTROL:键盘上的Ctrl键被按下;

如果想知道某个键是否被按下,可用对应的位屏蔽值与nFlags参数作按位逻辑“与”运算,所的结果若为非零值,则表示该按钮被按下,例如:

if (nFlags & LBUTTON)

AfxMessageBox(“LButton is pressed down!”)

Else

AfxMessageBox(“LButton is pressed Up!”);

如何区分两次单击和一次双击,这取决于两次按下按钮之间的时间间隔,只有当时间间隔小于一定值时才被认为是一次双击。Windows默认的时间为500ms。可以用SetDoubleClickTime()函数来重新设置时间间隔值。

若要使窗口函数能接收到鼠标双击产生的消息,在注册窗口类时,必须指明该窗口具有CS_DBLCLKS风格,否则,即使进行了双击操作,该窗口也只能收到两条“WM_LBUTTONDOWN”和“WM_LBUTTONUP”消息,例如:

wndclass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;

2.2.2 捕捉鼠标

在交互式图形程序设计中,经常要使用鼠标的位置拾取、拖动或拖放,这些动作必须进行鼠标的捕捉。

鼠标捕捉只需要调用CWnd::SetCapture()函数。用户完成鼠标捕捉工作后一般是响应一个鼠标按下信息,要释放鼠标捕捉则是调用CWnd::ReleaseCapture()函数。释放被捕捉鼠标的最好时间是在响应鼠标弹起的时候(WM_LBUTTON)。

2.2.3 鼠标编程综合示例

示例1:在窗口中以文本的形式给出鼠标的状态,即当鼠标移动时,给出鼠标的位置;当鼠标按下鼠标左、右键时显示出鼠标按键状态。例如,当鼠标左键按下时,显示“LBUTTON DOWN!”。

第一步:建立一个myMouse工程文件;

第二步:添加鼠标事件处理函数

鼠标右击视图类(如CmyMouseView),选择“add windows message handler…”,弹出事件处理函数列表窗口,如图3-11所示

图3-11 Windows事件处理函数列表窗口

从左边事件消息列表中选择“WM_LBUTTONDOWN”,然后单击“Add and Edit”按钮,即加入鼠标左键按下事件函数,并要求编辑事件处理程序。

第三步:输入事件处理程序

void CMymouseView::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

//获得pDC

CDC* pDC=GetDC();

pDC->TextOut(20,40,”LBUTTONDOWM!”); // 输出显示信息

CView::OnLButtonDown(nFlags, point);

}

其中,阴影部分是用户输入的程序,其它内容都是自动生成的内容。

第四步:重复第二步和第三步,分别添加WM_LBUTTONUP,WM_MOUSEMOVE,WM_RBUTTONDOWN,WM_RBUTTONUP,WM_LBUTTONDBCLK,WM_RBUTTONDBCLK鼠标事件,并输入以下程序:

void CMouseView::OnLButtonUp(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CDC *pDC=GetDC();

pDC->TextOut(20,40,"LButton UP!");

CView::OnLButtonUp(nFlags, point);

}

void CMouseView::OnRButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CDC *pDC=GetDC();

pDC->TextOut(20,60,"RButton Down!");

CView::OnRButtonDown(nFlags, point);

}

void CMouseView::OnRButtonUp(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CDC *pDC=GetDC();

pDC->TextOut(20,40,"RButton UP!");

CView::OnRButtonUp(nFlags, point);

}

void CMouseView::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CDC *pDC=GetDC();

char tbuf[80];

sprintf(tbuf,"Position:(%3d,%3d)",point.x,point.y);

// 输出鼠标当前位置

pDC->TextOut(20,20,tbuf);

CView::OnMouseMove(nFlags, point);

}

void CMouseView::OnLButtonDblClk(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CDC *pDC=GetDC();

pDC->TextOut(20,80,"LButton is double clicked!");

CView::OnLButtonDblClk(nFlags, point);

}

void CMouseView::OnRButtonDblClk(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CDC *pDC=GetDC();

pDC->TextOut(20,80,"RButton is double clicked!");

CView::OnRButtonDblClk(nFlags, point);

}

第五步:编译程序,并验证执行结果。

示例2:采用鼠标橡皮筋技术画圆

鼠标橡皮筋技术画圆就是采用圆心和圆周上任一点画圆技术(简称C+P方法),首先用鼠标左击选择圆心位置,然后移动鼠标,圆随鼠标移动而扩大或缩小,当再次单击鼠标左键时,确定圆周上的一点,从而画出相应的圆。直线、矩形等基本图形都可以采用橡皮筋技术。

第一步:建立MouseSpring工程文件;

实验一:图形用户界面设计

实验一图形用户界面设计 一实验目的和要求 1)熟悉图形用户界面的设计原则 遵循用户友好原则、一致性原则、帮助和提示等原则设计用户界面。 2)利用一种设计工具完成图形化的用户界面设计 二实验内容与步骤 (一)实验内容 利用常用的设计工具(UI界面设计工具GUI Design Studio)完成一个通用图形用户界面设计,要遵循界面设计的一般原则(一致性、快捷方式、提供错误处理),注意颜色的使用,学会图标、按钮、屏幕布局、菜单和对话框的设计。 软件的界面如同人的脸一样,软件界面的好坏决定了用户对软件的第一印象。设计好的界面能够引导用户自己完成相应的操作,起到引导作用。设计合理的界面能给用户带来轻松愉悦的感受。一些专家指出:对于用户,人机界面就是系统本身。这充分说明了软件界面设计的重要性。请完成各自的系统用户界面的设计。 (二)实验步骤 1.设计多个对话框,完成填表输入界面的设计,合理使用图标、按钮、颜色; 2.设计不同形式的菜单,完成对不同对话框的调用; 3.提供简单的错误处理、联机帮助。 GUI Design Studio主界面

三界面示例1、登录界面 2、主界面

3、聊天界面 4、QQ空间界面

四实验总结 1.界面要具有一致性、常用操作要有快捷方式、提供简单的错误处理、对操作人员的重要操作要有信息反馈、操作可逆、设计良好的联机帮助、合理划分并高效地使用显示屏、保证信息显示方式与数据输入方式的协调一致。 2.颜色是一种有效的强化手段,同时具有美学价值。使用颜色时应注意如下几点:限制同时显示的颜色数;画面中活动对象的颜色应鲜明,而非活动对象应暗淡;尽量避免不相容的颜色放在一起,如黄与蓝,红与绿等,除非作对比时用;若用颜色表示某种信息或对象属性,要使用户理解这种表示,并尽量采用通用的表示规则。 3.图标是可视地表示实体信息的简洁、抽象的符号。图标设计是方寸艺术,需要在很小的范围内表现出图标的内涵。设计图标时应该着重考虑视觉冲击力,要使用简单的颜色,利用眼镜对色彩和网点的空间混合效果,做出精彩图标。 1)设计按钮应该具有交互性,应该有3到6种状态效果(点击时的状态、鼠标放在上面但未点击的状态、点击前鼠标未放在上面时的状态、点击后鼠标未放在上面时的状态、不能点击时的状态、独立自动变化的状态),按钮应具备简洁的图示效果,应能够让使用者产生功能上的关联反应。属于一个群组的按钮应该风格统一,功能差异大的按钮应该有所区别。 2)设计屏幕布局(Layout)时应该使各功能区重点突出,应遵循如下几条原则:平衡原则、预期原则、经济原则、顺序原则、规则化。 3)菜单在图形界面的应用程序中使用得非常普遍,是软件界面设计的一个重要组成方面,描述了一个软件的大致功能和风格。菜单中的选项在功能上与按钮相当,一般具有下列一种或几种类型的选项:命令项、菜单项和窗口项。菜单的结构一般有单一菜单、线状序列菜单、树状结构菜单、网状结构菜单等,其中树状结构菜单是最常见的结构。 设计菜单界面时应注意一般性原则:功能组织菜单,合理分类,并力求简短,前后一致;合理组织菜单界面的结构与层次;按一定的规则对菜单项进行排序;菜单选项的标题要力求文字简短、含义明确,并且最好以关键词开始;常用选项要设置快捷键;充分利用菜单选项的使能与禁止、可见与隐藏属性;使用弹出式菜单。 4)在处理大量相关数据的场合下,需要输入一系列的数据,这时填表输入界面是最理想的数据输入界面。在设计填表输入界面时应遵循的原则:一致性;有含义的表格标题;使用易于理解的指导性说明文字;栏目按逻辑分组排序;表格的组织结构和用户任务相一致;光标移动方便;出错提示;提供帮助;表格显示应美观、清楚,避免过分拥挤。

实验三图形用户界面设计(汽院含答案)

实验三图形用户界面设计 实验目的 1.掌握Java语言中GUI编程的基本方法 2.掌握Java语言中AWT组件的基本用法 3.掌握Java语言中Swing组件的基本用法 实验导读 1.通过图形用户界面(GUI:Graphics User Interface),用户和程序之间可以方便地进行 交互。 AWT(Abstract Windowing Toolkit),中文译为抽象窗口工具包,是Java提供的用来建立和设置Java的图形用户界面的基本工具。AWT由Java中的包提供,里面包含了许多可用来建立与平台无关的图形用户界面(GUI)的类,这些类又被称为组件(components)。 Swing是一个用于开发Java应用程序用户界面的开发工具包。它以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。 JDK写程序所有功能都是靠虚拟机去操作本地操作系统。比如window下,就是JDK 用windows API实现功能。而awt包中很多组件是组件自身去调用本地操作系统代码swing包中的组件采用的是调用本地虚拟机方法,由虚拟机再调用本地操作系统代码。意思就是中间多了一层,这样就加强了swing包的移植性,与本地关系不那强了。 图AWT常用组件继承关系图 Container为容器,是一个特殊的组件,该组件中可以通过add方法添加其他组件进来。 2.布局,容器中的组件的排放方式。常见的布局管理器: FlowLayout(流式布局管理器):从左到右的顺序排列。Panel默认的布局管理器。 BorderLayout(边界布局管理器):东,南,西,北,中。Frame默认的布局管理器。 GridLayout(网格布局管理器):规则的矩阵

c语言程序设计课程计算器设计报告

课程设计说明书 题目计算器程序设计 起讫日期2006 年7月3日至2006 年8月6日 所在院系软件学院 专业机械+软件班级04-2 学生姓名偶偶哦学号 指导教师 2006年8 月日

摘要 当今社会是信息社会,科技经济高速发展的社会!为了更方便人们的工作生活和加速人们处理信息的速度,计算器应运而生。由于它体积小巧,携带方便,价格便宜,构造简单等诸多的优点成为人们生活中的必备品! 随着科技的发展计算器的种类变得更多,功能变得更强大,体积变得更小!电脑的出现改变人们的生活习惯,很多事情都可以电脑来完成!电脑的更大一个优点就是可以通过软件的应用无限的延伸电脑功能的外延!下面我们将用我们学习的c语言编写一个简易的计算器程序!实现简单的初步的计算功能! 本程序的编写基础是Tubro C2.0汉化版,它在tubro c的原有基础上实现了多汉字的支持方便了我们的使用。生成的程序可移植性强兼容性好稳定!现在只实现了加、减、乘、除、求幂、求模,求平方根,求Sin,求Cos,求Log10,以及一个时钟原代码。这个系统是基于软件发展的生命周期来研制的,它可以直接输入数学表达式,不需要任何转换,就可以直接输出数学四则运算的结果。但是,每次只能运算一个表达式。不能运算多个表达式。在程序里面在添加一组选择函数即可。本论文主要介绍了本课题的开发背景,开发的过程和所要完成的功能。重点的说明了系统设计思想,设计的步骤、难点技术和解决方案。 关键词:C语言T ubro c 2.0汉化版计算器时钟

目录 第一章综述 (1) 1.1 课题的现实意义 (1) 1.2 软件环境 (1) 1.3 硬件环境 (1) 第二章系统设计流程图 (2) 2.1 系统流程图 (2) 2.2 主要功能表 (2) 第三章系统分析和设计 (3) 3.1 图形的绘制和输出 (3) 3.2 文本的输出显示 (3) 3.3 计算函数的调用 (4) 3.4 程序的运行和退出 (5) 第四章系统测试 (6) 4.1 系统测试 (6) 4.2 调试 (6) 4.3 错误原因分析一 (6) 4.4 错误原因分析二 (6) 第五章用户使用说明书 (8) 5.1 运行Turbo C程序进入计算器界面 (8) 5.2 计算器的使用 (9) 5.3 退出程序 (9) 第六章工作总结 (10) 参考文献 (11) 附录: 源代码

图形图像用户界面设计

实习报告 课程名称多媒体实验 实习题目图形图像用户界面设计专业通信工程 班级通信(2)班 学号 学生姓名 实习成绩 指导教师吴娱 2011年5月

图形图像用户界面设计 一、实验目的 了解句柄图形的基本概念,掌握图形用户界面的基本设计方法。 二、实验要求 上机完成实验题目,独立完成实验报告。 三、实验内容 设计简单的图像用户界面。 四、实验步骤 1、在MATLAB的命令窗口(Command Window)中运行guide命令: 打开GUIDE界面,如下: 然后,选择空模板(Blank GUI),点击OK,即可打开GUIDE的设计界面,如下:

如下: 单下添加菜单项:“打开”、“保存”、“退出”。如下:

文件,所有的程序都是要写在这个M文件里面的。 在编程中,每一个鼠标动作都对应一个Callback函数。那么菜单项也是如此。 在界面上,单击鼠标右键选择“Property Inspector”,即可打 开属性窗口。当点击不同的控件时,其对应的属性都会在这里显示, 根据需要可以进行修改。最主要的属性莫过于Tag属性和String属 性。 设置当前的Figure窗口的Tag属性为:figure_pjimage,窗口的标

题(Name属性)为:图像处理实例。如下: 然后,点击工具栏的保存按钮。之后,点击工具栏的运行按钮(Run)。程序运行时的样子,是这样的: 文件下面的菜单项和快捷键我们都能看见,但是我们没有写程序,所以就算点也没有什么响应。还有如果不想设置快捷键,可以在Menu Editor中设置,只要把其选择为Ctrl+none就行了。这样的话,

C语言图形化编程基础入门

二、C 的图形模式编程 2.1图形编程基础 VC+EasyX 库里提供了图形函数就可以在VC 环境下进行图形编程。对图形函数的操作都是在视口(Viewport )上进行。用户可以在屏幕上定义大小不同的视口,若不定义视口大小,它就是整个屏幕。 视口是在图形屏幕状态下的概念,用户可访问的最小单位是一个像素(像素这一术语最初用来指显示器上最小的、单独的发光点单元。然而现在,其含义拓宽为指图形显示器上的最小可访问点)。文本与图形都可以在视口上显示。 图形视口的左上角坐标为(0,0)。 例如:分辨率为640*480的视口像素点的定位 显示器在图形模式下工作时,显示的单位是像素点,通过控制各像素点的颜色和灰度等级来形成图形。因此绘图的第一步是进行图形模式的初始化,系统进入绘图模式。 (1) initgraph() 图形初始化函数 用法: HWND initgraph( int width, int height, int flag = NULL ); 示例:以下局部代码创建一个尺寸为 640x480 的绘图环境: initgraph(640, 480); 例2-1:调用initgraph()设置640*480的图形模式,在屏幕中央显示如下的图形。 参考代码: #include #include int main(){ initgraph(640, 480); line(200, 240, 440, 240); line(320, 120, 320, 360); getch(); (

closegraph(); return 0; } [学习单步执行] 试着单步执行刚才的程序,由于绘图和多线程等因素的限制,请务必按照以下步骤尝试(熟练了以后就不用了): 1. 将VC取消最大化,并缩小窗口,能看到代码就行。 2. 按一下F10(单步执行),会看到屏幕上出现一个黄色的小箭头,指示将要执行的代码。 3. 当箭头指向initgraph()语句时,按F10,能看到窗口发生了变化。 4. 将新的绘图窗口和VC并排放,相互不要有覆盖。这步很重要,否则绘图内容将会被VC窗口覆盖。 5. F10执行getch后,记得激活绘图窗口,并按任意键,否则程序不会继续执行。 6. closegraph后,直接按F5执行全部剩余程序,结束。 单步执行很重要,可以让你知道程序执行到哪里是什么效果,哪条语句执行出了问题等等。 例2-2:更进一步,打印出分辨率,并在屏幕中央显示如下的图形 参考代码 #include #include #include #define WIDTH 150 /*矩形的宽度*/ #define HEIGHT 100 /*矩形的高度*/ int startX,startY; /*矩形的左上角坐标*/ int maxX; int maxY; void init(); /*图形模式的初始化*/ void showText(); /*显示文本*/ void drawK(); /*画图形*/ int main(){ init(); showText(); drawK(); closegraph(); return 0; } void init(){

C语言课程设计计算器图形界面

C语言课程设计计算器图形界面

扬州大学 C语言课程设计报告 题目一个简易计算器的设计与实现 班级 学号 姓名 指导教师 成绩 老师评语: 扬州大学信息工程学院 年 6 月 25 目录

一、程序设计目的: (1) 二、程序设计内容: (1) 三、课程设计所补充的内容:补充的函数或算法…………3,4 四、系统总体设计 (4) 五、系统详细设计………………………………………5,6,7,8 六、运行结果………………………………………………8,9,10 七、系统调试…………………………………………8,9,10,11 八、课程设计体会总结………………………………8,9,10,11 1 课程设计目的 (1).课程设计是一项综合性实践环节,是对平时实验的一个补充,课程设计内容包括课程的主要理论知识,但由于C语言对初学者较难掌握,因而对一个完整的C语言程序不适合平时实验。

经过课程设计能够达到综合设计C语言程序的目的。 (2)经过本课程设计,能够培养独立思考,综合运用所学有关相应知识的能力,能更好地使用C语言的知识,更好地了解C语言的好处和其可用性!掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级程序设计能力。为后续各门计算机课程的学习和毕业设计打下坚实基础! (3)经过本程序训练程序设计的基本技能,掌握字符串的表示方法和字符串函数的功能、自学掌握四则运算的算法及WIN-TC的图形操作的基本知识、键盘上特殊键的获取及图形方式下光标的显示。 2 课程设计内容 目的:本课程的课程设计要求学生模拟实现一个简单计算器,要求(1)能够实现四则运算,并能支持优先级运算。(2)三角与反三角运算:如sinx,cosx等。(3)指数对数运算:如log (x),lnx,e的x次方等。(4)其它运算:如X!,x的累加等。(4)不允许调用库函数,使用自行开发的程序实现常见函数运算。(5)进一步考虑计算器外观设计,用可视化界面给出计算器外观、功能按键及输入界面。 使用说明:执行加法运算,'—'表示执行减法运算,表示执行乘法运算,'/'表示除法运算.‘Q’表示退出计算器‘C’表示清零,’=’表示得出结果'^'表示执行x的y次方,'e'表示执行e的x次方操

图形用户界面设计

09次上机图形用户界面设计 1、(1)给程序添加注释,并执行。 建立数制转换对话框。 在左边输入一个十进制整数和2~16之间的数,单击“转换”按钮能在右边得到十进制数所对应的2~16进制字符串,单击“退出”按钮退出对话框。 hf=figure('Color',[0,1,1],'Position',[100,200,400,200],... 'Name','数制转换','NumberTitle','off','MenuBar','none'); uicontrol(hf,'Style','Text', 'Units','normalized',... 'Position',[0.05,0.8,0.45,0.1],'Horizontal','center',... 'String','输入框','Back',[0,1,1]); uicontrol(hf,'Style','Text','Position',[0.5,0.8,0.45,0.1],... 'Units','normalized','Horizontal','center',... 'String','输出框','Back',[0,1,1]); uicontrol(hf,'Style','Frame','Position',[0.04,0.33,0.45,0.45],... 'Units','normalized','Back',[1,1,0]); uicontrol(hf,'Style','Text','Position',[0.05,0.6,0.25,0.1],... 'Units','normalized','Horizontal','center',... 'String','十进制数','Back',[1,1,0]); uicontrol(hf,'Style','Text','Position',[0.05,0.4,0.25,0.1],... 'Units','normalized','Horizontal','center',... 'String','2~16进制','Back',[1,1,0]); he1=uicontrol(hf,'Style','Edit','Position',[0.25,0.6,0.2,0.1],... 'Units','normalized','Back',[0,1,0]); he2=uicontrol(hf,'Style','Edit','Position',[0.25,0.4,0.2,0.1],... 'Units','normalized','Back',[0,1,0]); uicontrol(hf,'Style','Frame','Position',[0.52,0.33,0.45,0.45],... 'Units','normalized','Back',[1,1,0]); ht=uicontrol(hf,'Style','Text','Position',[0.6,0.5,0.3,0.1],... 'Units','normalized','Horizontal','center','Back',[0,1,0]); COMM=['n=str2num(get(he1,''String''));',... 'b=str2num(get(he2,''String''));',... 'dec=trdec(n,b);','set(ht,''string'',dec);']; uicontrol(hf,'Style','Push','Position',[0.18,0.1,0.2,0.12],... 'String','转换','Units','normalized','Call',COMM); uicontrol(hf,'Style','Push','Position',[0.65,0.1,0.2,0.12],... 'String','退出','Units','normalized','Call','close(hf)'); 2、做一个带按钮的界面,当按动按钮时,在计算机声卡中播放一段音乐。(提示,找一个.wav 文件,简单起见可以在windows目录下找一个文件,将其放在当前工作目录下或搜索路径上,当按动“开始”按钮时调入该文件并播放,发声功能由sound函数完成,具体用法请查阅帮助信息)

c语言编程打印基本图形

#include main() { int i,j,k,a=1; for(i=1;i<=6;i++) { for(j=1;j<=10;j++) { printf("%c",'A'); } printf("\n"); } printf("\n"); for(i=1;i<=6;i++) { for(k=1;k1;k--) printf(" "); for(j=1;j<=10;j++) { printf("%c",'A'); } printf("\n"); } printf("\n"); for(i=1;i<=6;i++) { for(j=1;j<=2*i-1;j++) { printf("%c",'A'); } printf("\n"); } printf("\n");

for(i=6;i>=1;i--) { for(j=1;j<=2*i-1;j++) { printf("%c",'A'); } printf("\n"); } printf("\n"); for(i=1;i<=6;i++) { for(k=10-i;k>1;k--) printf(" "); for(j=1;j<=2*i-1;j++) { printf("%c",'A'); } printf("\n"); } printf("\n"); for(i=6;i>=1;i--) { for(k=10-i;k>1;k--) printf(" "); for(j=1;j<=2*i-1;j++) { printf("%c",'A'); } printf("\n"); } printf("\n"); for(i=1;i<=6;i++) { for(k=1;k<10-i;k++) printf(" "); for(j=1;j<=2*i-1;j++) { printf("%d",a); } a++; printf("\n"); } printf("\n"); for(i=6;i>=1;i--)

图形用户界面的设计课案

人机交互基础教程 实验报告 实验题目:图形用户界面的设计 专业计算机科学与技术 学生姓名 班级学号 教师 指导单位计算机软件学院 日期

教师 评语教师签名: 年月日 成绩评定 备注

一、实验目的 (1)熟悉图形用户界面的设计原则 (2)利用一种设计工具完成图形化的用户界面设计 二、预备知识 图形用户界面又称为WIMP界面,由窗口(windows)、图标(icons)、菜单(menu)、指点设备(pointing device)四位一体,形成桌面(desktop) ,如图所示。 WIMP界面 用 户 手 眼 击键/指点 窗口、图标 菜单、文本 应用例程 图形用户界面是当前用户界面的主流,广泛应用于各档台式微机和图形工作站。图形用户界面的共同特点是以窗口管理系统为核心,使用键盘和鼠标器作为输入设备。窗口管理系统除了基于可重叠多窗口管理技术外,广泛采用的另一核心技术是事件驱动(event-driven)技术。 WIMP界面可看作是第二代人机界面,是基于图形方式的人机界面。在WIMP界面中,人被称为用户,人机通过对话进行工作。用户只能使用手这一种交互通道输入信息,通过视觉通道获取信息。在WIMP界面中,界面的输出可以为静态或动态的二维图形或图像等信息。

这种方式能同时输出不同种类的信息,用户也可以在几个工作环境中切换而不丢失几个工作之间的联系,通过菜单可以执行控制型和对话型任务。由于引入了图标、按钮和滚动条技术,大大减少键盘输入,提高了交互效率。基于鼠标和图形用户界面的交互技术极大地推动了计算机技术的普及。 (1)图形用户界面的三个重要思想 1)桌面隐喻(desktop metaphor) 指在用户界面中用人们熟悉的桌面上的图例清楚地表示计算机可以处理的能力。隐喻的表现方法:静态图标、动画、视频2)所见即所得(What You See Is What You Get,WYSIWYG) 显示的用户交互行为与应用程序最终产生的结果是一致的。 3)直接操纵(direct manipulation) 直接操纵是指可以把操作的对象、属性、关系显式地表示出来,用光笔、鼠标、触摸屏或数据手套等指点设备直接从屏幕上获取形象化命令与数据的过程。直接操纵的对象是命令、数据或是对数据的某种操作。 (2)设计图形用户界面的原则 1) 一般性原则:界面要具有一致性、常用操作要有快捷方式、提供简单的错误处理、对操作人员的重要操作要有信息反馈、操作可逆、设计良好的联机帮助、合理划分并高效地使用显示屏、保证信息显示方式与数据输入方式的协调一致 2) 颜色的使用:颜色是一种有效的强化手段,同时具有美学价

C语言图形编程

C的图形编程 一、屏幕显示模式 1、文本模式 在文本模式又称字符模式。在此模式下整个屏幕被划分成(25行,80列),共25*80个文本单元,每个单元包括一个字符和一个属性, 字符即ASCII 码字符, 属性规定该字符的颜色和强度。 坐标原点在屏幕的左上角。如下图所示: 在头文件中定义了文本模式下一些函数常用的有; (1)定义一个文本窗口 void window(int left, int top, int right, int bottom); 如要定义一个窗口左上角在屏幕(20, 5)处, 大小为30列15行的窗口可写成: window(20, 5, 50, 25); (2)文本窗口颜色的设置 void textbackground(int color); //设置背景颜色: void textcolor(int color); //设置字符颜色: 有关颜色的定义见表1。 (3)光标定位 void gotoxy(int x, int y); (4)清屏 void clrscr(void); (5)其它函数 一、窗口内文本的输出函数

int cprintf("<格式化字符串>", <变量表>); int cputs(char *string);

int putch(int ch); cprintf()函数输出一个格式化的字符串或数值到窗口中。它与printf() 函数的用法完全一样, 区别在于cprintf()函数的输出受窗口限制, 而printf() 函数的输出为整个屏幕。 cputs()函数输出一个字符串到屏幕上, 它与puts()函数用法完全一样, 只是受窗口大小的限制。 putch()函数输出一个字符到窗口内。 二、窗口内文本的输入函数 int getche(void); getche()函数从键盘上获得一个字符, 在屏幕上显示的时候, 如果字符超过了窗口右边界, 则会被自动转移到下一行的开始位置。 例1:下面这个程序使用了关于窗口大小的定义、颜色的设置等函数, 在一个屏幕上不同位置定义了7个窗口, 其背景色分别使用了7种不同的颜色。 #include #include //文本模式下的函数 void main(void) { int i; char *c[]={"BLACK", "BLUE", "GREEN", "CYAN", "RED", "MAGENTA", "BROWN", "LIGHTGRAY"}; textbackground(0); /* 设置屏幕背景色 */ clrscr(); /* 清除文本屏幕 */ cputs(c[0]); for(i=1; i<8; i++) { window(10+i*5, 5+i, 30+i*5, 15+i); /* 定义文本窗口 */ textbackground(i); /* 定义窗口背景色 */ clrscr(); cputs(c[i]); /* 清除窗口 */ } getch(); } 表1. 有关颜色的定义 ━━━━━━━━━━━━━━━━━━━━━━━━━━━ 符号常数数值含义字符或背景 ─────────────────────────── BLACK 0 黑 两者均可 BLUE 1 兰 两者均可 GREEN 2 绿 两者均可 CYAN 3 青 两者均可

实验九Java图形用户界面设计1

实验九Java图形用户界面设计(1) 一实验目的 (1)掌握Frame与面板的使用 (2)布局管理器的使用 (3)布局管理器的使用 (4)边界风格的使用 (5)掌握简单Java事件的处理 二实验内容 1、创建并显示一个标题为“My Frame”,背景色为白色,大小为1000×1000的框架。在该框架中放置八个按钮,按钮的标题分别为“按钮1”、……“按钮8”。采用FlowLayout布局管理器。 程序: import java.awt.*; import javax.swing.*; public class Con1{ private JFrame f; private JButton b1,b2,b3,b4,b5,b6,b7,b8; public static void main(String args[]){ Con1 c=new Con1(); c.go(); } public void go(){

f=new JFrame("My Frame"); Container con=f.getContentPane(); con.setLayout(new FlowLayout()); con.setBackground(Color.white); con.setLayout(new FlowLayout(FlowLayout.RIGHT,920,50)); b1=new JButton("按键1"); b2=new JButton("按键2"); b3=new JButton("按键3"); b4=new JButton("按键4"); b5=new JButton("按键5"); b6=new JButton("按键6"); b7=new JButton("按键7"); b8=new JButton("按键8"); con.add(b1); c on.add(b2); c on.add(b3); c on.add(b4); con.add(b5); c on.add(b6); c on.add(b7); c on.add(b8); f.setSize(1000,1000); f.setVisible(true); } } 结果:

实验6 图形用户界面设计

实验6. 图形用户界面设计 一、 实验目的 1. 掌握图形对象属性的基本操作; 2. 掌握菜单及对话框设计、建立控件对象的方法。 二、 实验环境 1. 计算机 2. matlab7.1 三、 实验说明 1. 正确操作,认真观察; 2. 实验学时:2学时; 3. 学会使用help ; 4. 保存整理实验结果,提交实验报告。 四、 实验内容 1.设计如教材P374 图1所示的菜单,并在此基础上增加选项:可以改变曲线的颜色,可以改变窗口背景颜色。 2.(选做)采用图形用户界面,从键盘输入参数a 、b 、n 的值,考察参数对极坐标曲线)cos(θρn b a +=的影响。 五、 实验程序及结果 1. screen=get(0,'ScreenSize'); W=screen(3);H=screen(4); figure('Color','w','Position',[0.2*H,0.2*H,0.5*W,0.3*H],... 'Name','菜单设计实验','NumberTitle','off','MenuBar','none'); hplot=uimenu(gcf,'Label','&Plot'); %定义plot 菜单项 uimenu(hplot,'Label','Sine Wave','Call',... ['t=-pi:pi/20:pi;','h0=plot(t,sin(t));',...

'set(hlr,''Enable'',''on'');',... 'set(hlg,''Enable'',''on'');',... 'set(hlb,''Enable'',''on'');']); uimenu(hplot,'Label','Cosine Wave','Call',... ['t=-pi:pi/20:pi;','h0=plot(t,cos(t));',... 'set(hlr,''Enable'',''on'');',... 'set(hlg,''Enable'',''on'');',... 'set(hlb,''Enable'',''on'');']); uimenu(hplot,'Label','&Exit','Call','close(gcf)'); hc=uimenu(gcf,'Label','&Color'); %定义Color菜单项 hw=uimenu(hc,'Label','&Window Color'); uimenu(hw,'Label','&Red','Call','set(gcf,''Color'',''r'');'); uimenu(hw,'Label','&Green','Call','set(gcf,''Color'',''g'');'); uimenu(hw,'Label','&Blue','Call','set(gcf,''Color'',''b'');'); hl=uimenu(hc,'Label','&Line Color','Separator','on'); hlr=uimenu(hl,'Label','&Red','Call',... 'set(h0,''Color'',''r'');','Enable','off'); hlg=uimenu(hl,'Label','&Green','Call',... 'set(h0,''Color'',''g'');','Enable','off'); hlb=uimenu(hl,'Label','&Blue','Call',... 'set(h0,''Color'',''b'');','Enable','off'); 2. hf=figure('menubar','none','name','图形演示',... 'numbertitle','off'); %定义图形窗口 set(gcf,'unit','normalized','posi',[0.2,0.3,0.55,0.36]); axes('posi',[0.05,0.15,0.55,0.7]); %定义坐标轴 uicontrol(gcf,'style','text','unit','normalized',... %定义静态文本'posi',[0.63,0.85,0.1,0.1],'string','参数 a',... 'horizontal','center'); uicontrol(gcf,'style','text','unit','normalized',...

c语言程序设计 《图形动画,一起去看流星雨》

/* Note:Y our choice is C IDE */ #include "stdio.h" #include"graphics.h" main() { int size,size2,i,size3,size4; void *buffer,*buffer2,*buffer3,*buffer4; int driver=DETECT,mode; initgraph(&driver,&mode,""); setcolor(15); rectangle(0,280,639,479); setfillstyle(0,1); floodfill(1,290,15); setcolor(15); arc(10,0,270,360,10); arc(30,0,180,270,10); arc(10,20,0,90,10); arc(30,20,90,180,10); setfillstyle(1,14); floodfill(20,10,15);/*xingxing*/ setcolor(12); circle(30,400,15); line(30,415,10,435); line(30,415,50,435); line(20,425,20,460); line(40,425,40,465);/*ren*/ circle(70,400,15); line(70,415,50,435); line(70,415,100,435); line(60,425,60,460); line(80,425,80,465); setcolor(15); arc(10,70,270,360,10); arc(30,70,180,270,10); arc(10,90,0,90,10); arc(30,90,90,180,10); setfillstyle(1,14); floodfill(20,80,15); setcolor(15);

C语言课程设计--计算器(图形界面)

扬州大 学 题目一个简易计算器的设计与实现 班级 学号 姓名 指导教师 成绩 老师评语: 扬州大学信息工程学院 2010 年6 月25

目录 一、程序设计目的: (1) 二、程序设计内容: (1) 三、课程设计所补充的内容:补充的函数或算法…………3,4 四、系统总体设计 (4) 五、系统详细设计………………………………………5,6,7,8 六、运行结果………………………………………………8,9,10 七、系统调试…………………………………………8,9,10,11 八、课程设计体会总结………………………………8,9,10,11

1 课程设计目的 (1).课程设计是一项综合性实践环节,是对平时实验的一个补充,课程设计内容包括课程的主要理论知识,但由于C语言对初学者较难掌握,因而对一个完整的C语言程序不适合平时实验。通过课程设计可以达到综合设计C语言程序的目的。 (2)通过本课程设计,可以培养独立思考,综合运用所学有关相应知识的能力,能更好地使用C语言的知识,更好地了解C语言的好处和其可用性!掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级程序设计能力。为后续各门计算机课程的学习和毕业设计打下坚实基础! (3)通过本程序训练程序设计的基本技能,掌握字符串的表示方法和字符串函数的功能、自学掌握四则运算的算法及WIN-TC的图形操作的基本知识、键盘上特殊键的获取及图形方式下光标的显示。 2 课程设计内容 目的:本课程的课程设计要求学生模拟实现一个简单计算器,要求(1)能够实现四则运算,并能支持优先级运算。(2)三角与反三角运算:如sinx,cosx等。(3)指数对数运算:如log(x),lnx,e的x次方等。(4)其他运算:如X!,x 的累加等。(4)不允许调用库函数,使用自行开发的程序实现常用函数运算。(5)进一步考虑计算器外观设计,用可视化界面给出计算器外观、功能按键及输入界面。 使用说明:执行加法运算,'—'表示执行减法运算,表示执行乘法运算,'/'表示除法运算.‘Q’表示退出计算器‘C’表示清零,’=’表示得出结果'^'表示执行x的y次方,'e'表示执行e的x次方操作,'&'表示执行累加操作.,你可以可以用键盘上的上下左右键对光标进行移动,当光标移动到计算器按键上时,按ENTER即可执行该键的操作!最后按“=”则可得出结果。 3 课题设计的补充知识 本程序通过int specialkey(void)和#include来实现对屏幕的操作,通过调用int arrow()函数,int specialkey(void)和#include来实现对光标的操作。计算机图形采用Turbo C 2.0绘图程序制作。因此涉及C的图形程序设计知识。此外,由于不允许调用库函数,则要自行开发程序实现sinx,cosx,e的x次方函数运算,则可以根据幂级数的展开式来设计实现其运算的算法,而x的阶乘和x的累加则可用for语句来实现。 最后,不得不说说四则运算的算法,有两种方法可以实现:(1)利用堆栈实现四则运算(2)还可以用递归整数的四则运算。 sinx函数 #include

C语言程序设计(郑莉)课后习题答案

C语言程序设计(郑莉)课后习题答案

C++语言程序设计(清华大学郑莉)课后习题答案 第一章概述 1-1 简述计算机程序设计语言的发展历程。 解: 迄今为止计算机程序设计语言的发展经历了机器语言、汇编语言、高级语言等阶段,C++语言是一种面向对象的编程语言,也属于高级语言。 1-2 面向对象的编程语言有哪些特点? 解: 面向对象的编程语言与以往各种编程语言有根本的不同,它设计的出发点就是为了能更直接的描述客观世界中存在的事物以及它们之间的关系。面向对象的编程语言将客观事物看作具有属性和行为的对象,通过抽象找出同一类对象的共同属性(静态特征)和行为(动态特征),形成类。通过类的继承与多态可以很方便地实现代码重用,大大缩短了软件开发周期,并使得软件风格统一。因此,面向对象的编程语言使程序能够比较直接地反问题域的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。C++语言是目前应用最广的面向对象的编程语言。 1-3 什么是结构化程序设计方法?这种方法有哪些优点和缺点? 解: 结构化程序设计的思路是:自顶向下、逐步求精;其程序结构是按功能划分为若干个基本模块;各模块之间的关系尽可能简单,在功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成;其模块化实现的具体方法是使用子程序。结构化程序设计由于采用了模块分解与功能抽象,自顶向下、分而治之的方法,从而有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。 虽然结构化程序设计方法具有很多的优点,但它仍是一种面向过程的程序设计方法,它把数据和处理数据的过程分离为相互独立的实体。当数据结构改变时,所有相关的处理过程都要进行相应的修改,每一种相对于老问题的新方法都要带来额外的开销,程序的可重用性差。 由于图形用户界面的应用,程序运行由顺序运行演变为事件驱动,使得软件使用起来越来越方便,但开发起来却越来越困难,对这种软件的功能很难用过程来描述和实现,使用面向过程的方法来开发和维护都将非常困难。 1-4 什么是对象?什么是面向对象方法?这种方法有哪些特点? 解: 从一般意义上讲,对象是现实世界中一个实际存在的事物,它可以是有形的,也可以是无形的。对象是构成世界的一个独立单位,它具有自己的静态特征和动态特征。面向对象方法中的对象,是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位,由一组属性和一组行为构成。 面向对象的方法将数据及对数据的操作方法放在一起,作为一个相互依存、不可分离的整体--对象。对同类型对象抽象出其共性,形成类。类中的大多数数据,只能用本类的方法进行处理。类通过一个简单的外部接口,与外界发生关系,对象与对象之间通过消息进行通讯。这样,程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。通过实现继承与多态性,还可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。 面向对象方法所强调的基本原则,就是直接面对客观存在的事物来进行软件开发,将人们在日常生活中习惯的思维方式和表达方式应用在软件开发中,使软件开发从过分专业化的方法、规则和技巧中回到客观世界,回到人们通常的思维。 1-5 什么叫做封装? 解: 封装是面向对象方法的一个重要原则,就是把对象的属性和服务结合成一个独立的系统单位,并尽可能隐蔽对象的内部细节。 1-6 面向对象的软件工程包括哪些主要内容?

相关文档