版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2023/2/5北京邮电大学信息与通信工程学院1C++程序设计实践第1章绘图程序设计
北京邮电大学信息与通信工程学院
2023/2/5北京邮电大学信息与通信工程学院-2-第一章绘图程序设计1.1项目分析和设计1.2窗口程序基础知识1.3绘图基础知识1.4绘图程序Draw的实现2023/2/5北京邮电大学信息与通信工程学院-3-1.1项目分析和设计
2023/2/5北京邮电大学信息与通信工程学院-4-1.1项目分析和设计需求分析1.功能需求
能绘制由基本图元(点、线、圆、椭圆、文字)组成的各种图形或动画,可以响应鼠标事件(菜单项)。2.界面要求
应用程序提供用户区供绘图使用,用户区可以显示坐标轴、原点等。2023/2/5北京邮电大学信息与通信工程学院-5-1.1项目分析和设计界面设计
在界面上可设置菜单,布置菜单项,按用户需求完成特定绘图功能,在绘图客户区可以显示坐标轴、原点等。2023/2/5北京邮电大学信息与通信工程学院-6-1.1项目分析和设计总体设计软件架构2023/2/5北京邮电大学信息与通信工程学院-7-1.1项目分析和设计总体设计类关系图2023/2/5北京邮电大学信息与通信工程学院-8-1.2窗口程序基础知识
2023/2/5北京邮电大学信息与通信工程学院-9-1.2窗口程序基础知识WINDOWSAPI基础1.句柄句柄(handle)是整个Windows编程的基础,用于标识应用程序中不同的对象。比如一个窗口、图标、输出设备或文件,均对应着一个句柄。句柄是指一个对象的标识,而指针是一个对象的首地址。但从实际处理的角度讲,即可以把句柄定义为指针,又可以把它定义为同类对象数组的索引。句柄通常是一个32位的整数(32位计算机系统)。2023/2/5北京邮电大学信息与通信工程学院-10-2023/2/5北京邮电大学信息与通信工程学院-11-1.2窗口程序基础知识WINDOWSAPI基础2.事件和消息Windows应用程序是基于事件驱动的,对于每个事件(如鼠标事件,窗口改变事件,定时器事件等),系统都将产生相应的消息。消息会被放入应用程序的消息队列中,然后应用程序将从消息队列中取出消息,最后分发给相应的窗口过程函数进行处理。2023/2/5北京邮电大学信息与通信工程学院-12-1.2窗口程序基础知识WINDOWSAPI基础2.事件和消息2023/2/5北京邮电大学信息与通信工程学院-13-1.2窗口程序基础知识WINDOWSAPI基础2.事件和消息2023/2/5北京邮电大学信息与通信工程学院-14-1.2窗口程序基础知识WINDOWSAPI基础2.事件和消息
对于WindowsAPI应用程序的编写者,他所能看到的是事件的分发(仅一点点)和事件的响应,而事件的响应则是编程的主要工作所在。2023/2/5北京邮电大学信息与通信工程学院-15-1.2窗口程序基础知识基本的WINDOWS应用程序Winmain()函数
intAPIENTRYWinMain(HINSTANCEhInstance,//当前实例句柄HINSTANCEhPrevInstance,//前实例句柄LPSTRlpCmdLine,//命令行参数intnShowCmd)//指明窗口如何显示{ MSGmsg; //声明一个保存消息的变量WNDCLASSwndclass;2023/2/5北京邮电大学信息与通信工程学院-16-//初始化窗口类,并向操作系统注册该窗口类if(!hPrevInstance) {wndclass.style=CS_HREDRAW|CS_VREDRAW;wndclass.lpfnWndProc=ccc_win_proc;//指定窗口函数(消息处理入口)wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;wndclass.hInstance=hInstance;wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //指定窗口类的图标wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); //指定窗口类的光标wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//指定填充窗口背景的画刷wndclass.lpszMenuName=NULL;wndclass.lpszClassName="CCC_WIN";//窗口类名称
RegisterClass(&wndclass); }2023/2/5北京邮电大学信息与通信工程学院-17-//初始化窗口,生成窗口并显示更新窗口 chartitle[80]; GetModuleFileName(hInstance,title,sizeof(title));//得到当前运行程序的全路径 HWNDhwnd=CreateWindow("CCC_WIN", title, WS_OVERLAPPEDWINDOW&~WS_MAXIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, GetSystemMetrics(SM_CYFULLSCREEN)*3/4, GetSystemMetrics(SM_CYFULLSCREEN)*3/4, NULL, NULL, hInstance, 0);//用注册的窗口类生成窗口实例//显示窗口 ShowWindow(hwnd,nShowCmd); UpdateWindow(hwnd);//若UpdateRegion不空,则发送WM_PAINT消息2023/2/5北京邮电大学信息与通信工程学院-18-
while(GetMessage(&msg,NULL,0,0)) //消息循环,对用户操作进行响应 { TranslateMessage(&msg); //将虚拟键消息转换成字符消息,再送入消息队列 DispatchMessage(&msg); //分发消息,将消息队列中消息发送到窗口处理函数 } returnmsg.wParam;}2023/2/5北京邮电大学信息与通信工程学院-19-1.2窗口程序基础知识基本的WINDOWS应用程序2、窗口过程函数
窗口过程函数是一个对每一个消息都进行处理的函数。其一般形式为带有多个分支的switch结构。通过把传送来的消息和系统中预定义的消息常量进行比较,从而判断消息的类型,执行不同的操作。2023/2/5北京邮电大学信息与通信工程学院-20-LRESULTCALLBACKccc_win_proc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){ PAINTSTRUCTps; //thedisplay'spaintstruct HDCmainwin_hdc; switch(message) { caseWM_PAINT://窗口刷新消息 mainwin_hdc=BeginPaint(hwnd,&ps);//置UpdateRegion为空 //ccc_win_main(); //调用用户的绘图程序
EndPaint(hwnd,&ps); break; caseWM_DESTROY: PostQuitMessage(0); break;
default://调用默认的消息处理函数,对其他的消息进行处理 returnDefWindowProc(hwnd,message,wParam,lParam); }return0;}2023/2/5北京邮电大学信息与通信工程学院-21-1.2窗口程序基础知识基本的WINDOWS应用程序3、例1-1编写一个简单的windows程序,只有基本框架代码,没有具体功能。
2023/2/5北京邮电大学信息与通信工程学院-22-1.2窗口程序基础知识基本的WINDOWS应用程序3、例1-1第一步:建立一个新的工程启动VisualStudio,选择菜单项“文件”,点击“新建---项目”,在弹出窗口中项目类型选择“win32”,继续选择“win32项目”,为项目起名“Draw”。
2023/2/5北京邮电大学信息与通信工程学院-23-1.2窗口程序基础知识基本的WINDOWS应用程序3、例1-1第一步:建立一个新的工程点击“确定”后,在弹出窗口中进行“应用程序设置”,选择“windows应用程序”,选中“空项目”,然后点击“完成”。
2023/2/5北京邮电大学信息与通信工程学院-24-1.2窗口程序基础知识基本的WINDOWS应用程序3、例1-1第二步:设置字符集在生成的解决方案名称上,单击鼠标右键,在弹出的菜单条上,选择“属性”2023/2/5北京邮电大学信息与通信工程学院-25-1.2窗口程序基础知识基本的WINDOWS应用程序3、例1-1第二步:设置字符集在弹出的窗口中,选择“配置属性”=>“常规”,点击“字符集”右侧下拉框选中“未设置”。然后“确定”。2023/2/5北京邮电大学信息与通信工程学院-26-1.2窗口程序基础知识基本的WINDOWS应用程序3、例1-1第三步:为工程添加源文件/头文件/资源文件。可以新建源文件,把上面WinMain和窗口过程函数的代码复制,也可以直接把本书附带的程序添加到工程里。要记得包含头文件。#include<cstdlib>#include"windows.h"usingnamespacestd;然后就可以编译运行了!2023/2/5北京邮电大学信息与通信工程学院-27-1.2窗口程序基础知识资源文件Windows资源可以是标准的,也可以是自定义的。标准资源中的数据描述了图标、光标、菜单、对话框、位图和加速键表等。应用程序自定义的资源,则包含任何特定应用程序需要的数据。2023/2/5北京邮电大学信息与通信工程学院-28-1.2窗口程序基础知识资源文件例1-2增加菜单第四步:为工程添加如下资源文件。//fig.rc#include“resource.h”//MenuIDC_TEST2MENUBEGINPOPUP"&File"BEGIN MENUITEM"时钟", IDM_FIG1 MENUITEM"Fig2", IDM_FIG2 MENUITEM"E&xit", IDM_EXITENDEND2023/2/5北京邮电大学信息与通信工程学院-29-1.2窗口程序基础知识资源文件例1-2增加菜单第四步:为工程添加如下资源文件。//Resource.h
#defineIDM_FIG1 104#defineIDM_FIG2 105#defineIDM_EXIT 106
#defineIDC_TEST2 1092023/2/5北京邮电大学信息与通信工程学院-30-1.2窗口程序基础知识资源文件例1-2增加菜单第五步:消息循环部分需要增加菜单命令消息处理。staticintmenuId=0;
caseWM_COMMAND: wmId=LOWORD(wParam); wmEvent=HIWORD(wParam);
switch(wmId) { caseIDM_FIG1: menuId=IDM_FIG1; InvalidateRect(hwnd,NULL,TRUE); break;
caseIDM_FIG2: menuId=IDM_FIG2; InvalidateRect(hwnd,NULL,TRUE); break;
caseIDM_EXIT: DestroyWindow(hwnd); break; } break;2023/2/5北京邮电大学信息与通信工程学院-31-1.2窗口程序基础知识资源文件例1-2增加菜单第五步:窗口类注册之前需要添加菜单资源,在RegisterClass(&wndclass);语句之前增加下面的语句。wndclass.lpszMenuName=MAKEINTRESOURCE(IDC_TEST2);然后就可以编译运行了!2023/2/5北京邮电大学信息与通信工程学院-32-1.3绘图基础知识
2023/2/5北京邮电大学信息与通信工程学院-33-1.3绘图基础知识图形处理技术GDI图形技术OpenGL技术DirectX技术2023/2/5北京邮电大学信息与通信工程学院-34-1.3绘图基础知识图形设备接口GDI设备描述表(DeviceContext,DC),用于应用程序和物理设备之间进行交互,它是GDI的关键元素。设备描述表是一种数据结构,它包括了一个设备(如显示器和打印机)绘制属性的相关信息。所有的绘制操作通过设备描述表进行。应用程序不能直接访问设备描述表,只能由各种相关的API函数通过设备描述表句柄来间接访问该结构。
2023/2/5北京邮电大学信息与通信工程学院-35-1.3绘图基础知识图形设备接口GDI显示器设备描述表,总是与某个窗口或这窗口上的某个显示区域相关。
Windows窗口一旦创建,它就自动地产生了与之相对应的设备描述表数据结构,用户可运用该结构,实现对窗口显示区域的GDI操作,如划线、写文本、绘制位图、填充等,并且所有这些操作均要通过设备描述表句柄来进行。2023/2/5北京邮电大学信息与通信工程学院-36-1.3绘图基础知识图形设备接口GDI画笔和画刷是最重要的绘图工具,而选用绘图工具进行绘图操作的一般步骤是:(1)获得设备环境句柄;(2)获得绘图工具;(3)在设备环境中选择绘图工具;(4)调用输出函数进行输出;(5)在设备环境中选择原来的绘图工具,并删除新的绘图工具。2023/2/5北京邮电大学信息与通信工程学院-37-1.3绘图基础知识基本图形绘制(熟悉GDI函数)例1-3在屏幕上画若干个点,并显示一个文本在例1-1的基础上,编写DrawPixels函数,并在消息处理时调用它。caseWM_PAINT: hdc=BeginPaint(hwnd,&ps); DrawPixels(hwnd,hdc); EndPaint(hwnd,&ps);2023/2/5北京邮电大学信息与通信工程学院-38-1.3绘图基础知识基本图形绘制(熟悉GDI函数)如果要在窗口工作区中绘图,则必须遵守某些规则。每当将WM_PAINT消息发送到应用程序时,就必须重画工作区。这是因为有许多外部事件需要应用程序重新绘制这个窗口——如用户调整了正在绘图的窗口大小,或者是在用户移动另一个窗口以暴露以前隐藏的窗口。caseWM_PAINT: hdc=BeginPaint(hwnd,&ps); DrawPixels(hwnd,hdc); EndPaint(hwnd,&ps);2023/2/5北京邮电大学信息与通信工程学院-39-1.3绘图基础知识基本图形绘制(熟悉GDI函数)例1-3在屏幕上画若干个点,并显示一个文本voidDrawPixels(HWNDhwnd,HDChdc){ //获得客户区域 RECTr; GetClientRect(hwnd,&r); //设置映像模式 SetMapMode(hdc,MM_ISOTROPIC);
//设置窗口坐标范围 SetWindowExtEx(hdc,100,100,NULL); //设置视口坐标范围 SetViewportExtEx(hdc,r.right,r.bottom,NULL); //客户区背景为黑色 FillRect(hdc,&r,(HBRUSH)GetStockObject( BLACK_BRUSH)); //输出一个文本 TextOut(hdc,50,50,TEXT("TEST"), lstrlen(TEXT("TEST"))); //画20个点 for(inti=0;i<20;i++) SetPixelV(hdc,20+i,20+i,RGB(255,255,255));}2023/2/5北京邮电大学信息与通信工程学院-40-1.3绘图基础知识基本图形绘制(熟悉GDI函数)2023/2/5北京邮电大学信息与通信工程学院-41-1.3绘图基础知识基本图形绘制(熟悉GDI函数)例1-4在屏幕上画一个三角形voidDrawTriangle(HWNDhwnd,HDChdc){ //获得客户区域 RECTr; GetClientRect(hwnd,&r);
//设置映像模式 SetMapMode(hdc,MM_ISOTROPIC); //设置窗口坐标范围 SetWindowExtEx(hdc,100,100,NULL); //设置视口坐标范围 SetViewportExtEx(hdc,r.right,r.bottom,NULL); //绘制三角形 Pointp[]={Point(10,10),Point(10,19),Point(22,19)}; MoveToEx(hdc,p[0].get_x(),p[0].get_y(),NULL); for(inti=0;i<3;i++) { if(i==2) {LineTo(hdc,p[0].get_x(),p[0].get_y()); continue; } LineTo(hdc,p[i+1].get_x(),p[i+1].get_y()); }}classPoint{public:Point(doublex1=0.0,doubley1=0.0){x=x1;y=y1;}doubleget_x()const{returnx;}doubleget_y()const{returny;}private:doublex,y;};2023/2/5北京邮电大学信息与通信工程学院-42-1.3绘图基础知识基本图形绘制(熟悉GDI函数)例1-4在屏幕上画一个三角形在例1-1的基础上,编写DrawTriangle函数,并在消息处理时调用它。caseWM_PAINT: hdc=BeginPaint(hwnd,&ps); DrawTriangle(hwnd,hdc); EndPaint(hwnd,&ps);2023/2/5北京邮电大学信息与通信工程学院-43-1.4绘图程序Draw的实现基本图元类基类Shape类是抽象类classShape{public: virtualvoidmove(doubledx,doubledy)=0; virtualvoidSetColor(COLORREFmColor)=0;};2023/2/5北京邮电大学信息与通信工程学院-44-1.4绘图程序Draw的实现基本图元类classPoint:publicShape{public:Point(){x=0.0,y=0.0;}Point(doublex1,doubley1){x=x1;y=y1;}doubleget_x()const{returnx;}doubleget_y()const{returny;}COLORREFget_color()const{returncolor;}
virtualvoidmove(doubledx,doubledy) {x+=dx;y+=dy;}virtualvoidSetColor(COLORREFmColor) {color=mColor;}private:doublex;doubley;COLORREFcolor;};2023/2/5北京邮电大学信息与通信工程学院-45-1.4绘图程序Draw的实现基本图元类classLine:publicShape{public:Line(){}Line(Pointp1,Pointp2){from=p1;to=p2;}Pointget_start()const{returnfrom;}Pointget_end()const{returnto;}COLORREFget_color()const{returncolor;}
virtualvoidmove(doubledx,doubledy);virtualvoidSetColor(COLORREFmColor) {color=mColor;}private:Pointfrom;Pointto;COLORREFcolor;};voidLine::move(doubledx,doubledy){from.move(dx,dy);to.move(dx,dy);}2023/2/5北京邮电大学信息与通信工程学院-46-1.4绘图程序Draw的实现基本图元类classCircle:publicShape{public:Circle(){radius=0.0;}Circle(Pointp,doubler){center=p;radius=r;}Pointget_center()const{returncenter;}doubleget_radius()const{returnradius;}COLORREFget_color()const{returncolor;}virtualvoidmove(doubledx,doubledy) {center.move(dx,dy);}virtualvoidSetColor(COLORREFmColor) {color=mColor;}private:Pointcenter;doubleradius;COLORREFcolor;};2023/2/5北京邮电大学信息与通信工程学院-47-1.4绘图程序Draw的实现基本图元类classMessage{public:Message(){}Message(Points,doublex);Message(Points,conststring&m) {start=s;text=m;}Pointget_start()const{returnstart;}stringget_text()const{returntext;}voidmove(doubledx,doubledy) {start.move(dx,dy);}private:Pointstart;stringtext;};Message::Message(Points,doublex){start=s;charbuf[20];sprintf(buf,"%g",x);text=buf;}2023/2/5北京邮电大学信息与通信工程学院-48-1.4绘图程序Draw的实现绘图类classGraphicWindow{public:GraphicWindow():_user_xmin(-10),_user_xmax(10),_user_ymin(10),_user_ymax(-10){}//设置窗口坐标voidcoord(doublexmin,doubleymin,doublexmax,doubleymax){_user_xmin=xmin,_user_xmax=xmax;_user_ymin=ymin,_user_ymax=ymax;}//清除窗口voidclear();
2023/2/5北京邮电大学信息与通信工程学院-49-//显示一个点GraphicWindow&operator<<(Pointp);//显示一个圆GraphicWindow&operator<<(Circlec);//显示一条线GraphicWindow&operator<<(Lines);//显示一个文本串GraphicWindow&operator<<(Messaget);//打开一个窗口voidopen(HWNDhwnd,HDCmainwin_hdc);
private://逻辑到设备x坐标转换intuser_to_disp_x(doublex)const;//逻辑到设备y坐标转换intuser_to_disp_y(doubley)const;//设备到逻辑x坐标转换doubledisp_to_user_x(intx)const;//设备到逻辑y坐标转换doubledisp_to_user_y(inty)const;2023/2/5北京邮电大学信息与通信工程学院-50-//画一个点voidpoint(doublex,doubley,COLORREFmColor);//画一条线voidline(doublexfrom,doubleyfrom,doublexto,doubleyto,COLORREFmColor);//画一个椭圆voidellipse(doublex,doubley,doublera,doublerb,COLORREFmColor);//图形方式输出一个文本串voidtext(stringt,doublex,doubley);
//逻辑坐标double_user_xmin,_user_xmax,_user_ymin,_user_ymax;
//设备坐标(像素为单位)int_disp_xmax,_disp_ymax;//设备环境句柄HDC_hdc;};2023/2/5北京邮电大学信息与通信工程学院-51-1.4绘图程序Draw的实现例1-7绘制一个能够实时走动的时钟:表盘是黑色的,时针红色,分针绿色,秒针黄色,表盘上的时钟点为白色。2023/2/5北京邮电大学信息与通信工程学院-52-#include"ctime"#include"cmath"#include"cstdlib"#include"Resource.h"#include"ccc_shap.h"#include"ccc_msw.h"
#definePI3.1415926GraphicWindowcwin;
voidmclock(){ Shape*pShape;
cwin<<Message(Point(-2,7),"会走动的时钟");
2023/2/5北京邮电大学信息与通信工程学院-53- /*画表盘*/ intradius=6; Pointorg(0,0); pShape=&org; pShape->SetColor(RGB(255,255,255));//白色 cwin<<org; CircleclkPlate(org,radius); pShape=&clkPlate; pShape->SetColor(RGB(0,0,255)); //蓝色 cwin<<clkPlate;
doublex,y,x_s,y_s,x_m,y_m,x_h,y_h; inti; for(i=0;i<12;i++) { x=0.9*radius*sin(PI*i/6); y=0.9*radius*cos(PI*i/6);
PointmPoint(x,y); pShape=&mPoint; pShape->SetColor((RGB(255,255,255))); cwin<<mPoint; }
2023/2/5北京邮电大学信息与通信工程学院-54- structtmlocal; time_tt; //获取系统日历时间 t=time(NULL); //将日历时间转化为本地时间 localtime_s(&local,&t);
x_s=0.89*radius*sin(PI*(local.tm_sec)/30); y_s=0.89*radius*cos(PI*(local.tm_sec)/30);
x_m=0.7*radius*sin(PI*(local.tm_min)/30); y_m=0.7*radius*cos(PI*(local.tm_min)/30);
x_h=0.5*radius*sin(PI*(local.tm_hour)/6); y_h=0.5*radius*cos(PI*(local.tm_hour)/6);
2023/2/5北京邮电大学信息与通信工程学院-55- *画表针*/ PointhEnd(x_h,y_h),mEnd(x_m,y_m),sEnd(x_s,y_s); LinehLine(org,hEnd),mLine(org,mEnd),sLine(org,sEnd);
hLine.SetColor((RGB(255,0,0))); //红色 mLine.SetColor((RGB(0,255,0))); //绿色 sLine.SetColor((RGB(255,255,0))); //黄色 cwin<<hLine<<mLine<<sLine<<org;}2023/2/5北京邮电大学信息与通信工程学院-5
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高一迎期末系列专栏001期-名篇名句默写(教师版)
- 房地产公司个人年终工作总结 15篇
- 感恩节感恩父母演讲稿范文15篇
- 总经理年会致辞(集合15篇)
- 养老保险知识
- 数据中心运维服务投标方案(技术标)
- 市场监管案件审核培训
- 初级会计实务-初级会计《初级会计实务》模拟试卷479
- 智研咨询-2024年中国消化类药物行业市场全景调查、投资策略研究报告
- 二零二五年度个人与物流企业货物运输信息保密及合作协议2篇
- 江苏省扬州市蒋王小学2023~2024年五年级上学期英语期末试卷(含答案无听力原文无音频)
- 数学-湖南省新高考教学教研联盟(长郡二十校联盟)2024-2025学年2025届高三上学期第一次预热演练试题和答案
- 决胜中层:中层管理者的九项修炼-记录
- 2024年海南公务员考试申论试题(A卷)
- 临床药师进修汇报课件
- 北京市首都师大附中2025届数学高三第一学期期末达标测试试题含解析
- 2024年贵州省高职(专科)分类考试招收中职毕业生文化综合考试语文试题
- 政治丨广东省2025届高中毕业班8月第一次调研考试广东一调政治试卷及答案
- 铸石防磨施工工艺
- 临时用电安全培训(汇编)
- 玻璃钢烟囱方案
评论
0/150
提交评论