2020/6/22北京邮电大学信息与通信工程学院1C++程序设计实践第1章绘图程序设计北京邮电大学信息与通信工程学院2020/6/22北京邮电大学信息与通信工程学院-2-第一章绘图程序设计1.1项目分析和设计1.2窗口程序基础知识1.3绘图基础知识1.4绘图程序Draw的实现2020/6/22北京邮电大学信息与通信工程学院-3-1.1项目分析和设计2020/6/22北京邮电大学信息与通信工程学院-4-1.1项目分析和设计需求分析1.功能需求能绘制由基本图元(点、线、圆、椭圆、文字)组成的各种图形或动画,可以响应鼠标事件(菜单项)。2.界面要求应用程序提供用户区供绘图使用,用户区可以显示坐标轴、原点等。2020/6/22北京邮电大学信息与通信工程学院-5-1.1项目分析和设计界面设计在界面上可设置菜单,布置菜单项,按用户需求完成特定绘图功能,在绘图客户区可以显示坐标轴、原点等。2020/6/22北京邮电大学信息与通信工程学院-6-1.1项目分析和设计总体设计1.软件架构2020/6/22北京邮电大学信息与通信工程学院-7-1.1项目分析和设计总体设计1.类关系图2020/6/22北京邮电大学信息与通信工程学院-8-1.2窗口程序基础知识2020/6/22北京邮电大学信息与通信工程学院-9-1.2窗口程序基础知识WINDOWSAPI基础1.句柄句柄(handle)是整个Windows编程的基础,用于标识应用程序中不同的对象。比如一个窗口、图标、输出设备或文件,均对应着一个句柄。句柄是指一个对象的标识,而指针是一个对象的首地址。但从实际处理的角度讲,即可以把句柄定义为指针,又可以把它定义为同类对象数组的索引。句柄通常是一个32位的整数(32位计算机系统)。2020/6/22北京邮电大学信息与通信工程学院-10-2020/6/22北京邮电大学信息与通信工程学院-11-1.2窗口程序基础知识WINDOWSAPI基础2.事件和消息Windows应用程序是基于事件驱动的,对于每个事件(如鼠标事件,窗口改变事件,定时器事件等),系统都将产生相应的消息。消息会被放入应用程序的消息队列中,然后应用程序将从消息队列中取出消息,最后分发给相应的窗口过程函数进行处理。2020/6/22北京邮电大学信息与通信工程学院-12-1.2窗口程序基础知识WINDOWSAPI基础2.事件和消息2020/6/22北京邮电大学信息与通信工程学院-13-1.2窗口程序基础知识WINDOWSAPI基础2.事件和消息2020/6/22北京邮电大学信息与通信工程学院-14-1.2窗口程序基础知识WINDOWSAPI基础2.事件和消息对于WindowsAPI应用程序的编写者,他所能看到的是事件的分发(仅一点点)和事件的响应,而事件的响应则是编程的主要工作所在。2020/6/22北京邮电大学信息与通信工程学院-15-1.2窗口程序基础知识基本的WINDOWS应用程序1.Winmain()函数intAPIENTRYWinMain(HINSTANCEhInstance,//当前实例句柄HINSTANCEhPrevInstance,//前实例句柄LPSTRlpCmdLine,//命令行参数intnShowCmd)//指明窗口如何显示{MSGmsg;//声明一个保存消息的变量WNDCLASSwndclass;2020/6/22北京邮电大学信息与通信工程学院-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);}2020/6/22北京邮电大学信息与通信工程学院-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消息2020/6/22北京邮电大学信息与通信工程学院-18-while(GetMessage(&msg,NULL,0,0))//消息循环,对用户操作进行响应{TranslateMessage(&msg);//将虚拟键消息转换成字符消息,再送入消息队列DispatchMessage(&msg);//分发消息,将消息队列中消息发送到窗口处理函数}returnmsg.wParam;}2020/6/22北京邮电大学信息与通信工程学院-19-1.2窗口程序基础知识基本的WINDOWS应用程序2、窗口过程函数窗口过程函数是一个对每一个消息都进行处理的函数。其一般形式为带有多个分支的switch结构。通过把传送来的消息和系统中预定义的消息常量进行比较,从而判断消息的类型,执行不同的操作。2020/6/22北京邮电大学信息与通信工程学院-20-LRESULTCALLBACKccc_win_proc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){PAINTSTRUCTps;//thedisplay'spaintstructHDCmainwin_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;}2020/6/22北京邮电大学信息与通信工程学院-21-1.2窗口程序基础知识基本的WINDOWS应用程序3、例1-1编写一个简单的windows程序,只有基本框架代码,没有具体功能。2020/6/22北京邮电大学信息与通信工程学院-22-1.2窗口程序基础知识基本的WINDOWS应用程序3、例1-1第一步:建立一个新的工程启动VisualStudio,选择菜单项“文件”,点击“新建---项目”,在弹出窗口中项目类型选择“win32”,继续选择“win32项目”,为项目起名“Draw”。2020/6/22北京邮电大学信息与通信工程学院-23-1.2窗口程序基础知识基本的WINDOWS应用程序3、例1-1第一步:建立一个新的工程点击“确定”后,在弹出窗口中进行“应用程序设置”,选择“windows应用程序”,选中“空项目”,然后点击“完成”。2020/6/22北京邮电大学信息与通信工程学院-24-1.2窗口程序基础知识基本的WINDOWS应用程序3、例1-1第二步:设置字符集在生成的解决方案名称上,单击鼠标右键,在弹出的菜单条上,选择“属性”2020/6/22北京邮电大学信息与通信工程学院-25-1.2窗口程序基础知识基本的WINDOWS应用程序3、例1-1第二步:设置字符集在弹出的窗口中,选择“配置属性”=“常规”,点击“字符集”右侧下拉框选中“未设置”。然后“确定”。2020/6/22北京邮电大学信息与通信工程学院-26-1.2窗口程序基础知识基本的WINDOWS应用程序3、例1-1第三步:为工程添加源文件/头文件/资源文件。可以新建源文件,把上面WinMain和窗口过程函数的代码复制,也可以直接把本书附带的程序添加到工程里。要记得包含头文件。#includecstdlib#includewindows.husingnamespacestd;然后就可以编译运行了!2020/6/22北京邮电大学信息与通信工程学院-27-1.2窗口程序基础知识资源文件Windows资源可以是标准的,也可以是自定义的。标准资源中的数据描述了图标、光标、菜单、对话框、位图和加速键表等。应用程序自定义的资源,则包含任何特定应用程序需要的数据。2020/6/22北京邮电大学信息与通信工程学院-28-1.2窗口程序基础知识资源文件例1-2增加菜单第四步:为工程添加如下资源文件。//fig.rc#include“resource.h”//MenuIDC_TEST2MENUBEGINPOPUP&FileBEGINMENUITEM时钟,IDM_FIG1MENUITEMFig2,IDM_FIG2MENUITEME&xit,IDM_EXITENDEND2020/6/22北京邮电大学信息与通信工程学院-29-1.2窗口程序基础知识资源文件例1-2增加菜单第四步:为工程添加如下资源文件。//Resource.h#defineIDM_FIG1104#defineIDM_FIG2105#defineIDM_EXIT106#defineIDC_TEST21092020/6/22北京邮电大学信息与通信工程学院-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;2020/6/22北京邮电大学信息与通信工程学院-31-1.2窗口程序基础知识资源文件例1-2增加菜单第五步:窗口类注册之前需要添加菜单资源,在RegisterClass(&wndclass);语句之前增加下面的语句。wndclass.lpszMenuName=MAKEINTRESOURCE(IDC_TEST2);然后就可以编译运行了!2020/6/22北京邮电大学信息与通信工程学院-32-1.3绘图基础知识2020/6/22北京邮电大学信息与通信工程学院-33-1.3绘图基础知识图形处理技术GDI图形技术OpenGL技术DirectX技术2020/6/22北京邮