燕山大学Windows程序设计实验报告.pdf
《燕山大学Windows程序设计实验报告.pdf》由会员分享,可在线阅读,更多相关《燕山大学Windows程序设计实验报告.pdf(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Windows 程序设计实验报告程序设计实验报告TechnologyChmistryTechnologyChmistryExperimentReportExperimentReport学生所在学院:信息科学与工程学院学生所在班级:12 级信息安全 1 班学生姓名:冯星伟(120104070017)指导教师:穆运峰、李可教务处2015 年 5 月1目录目录目录.11 实验概述.21.1 实验题目.21.2 实验内容.21.3 实验要求.22 整体设计.22.1 窗口描述.22.2 各项目文件中的函数及其主要功能.23 绘图窗口的实现.53.1 DrawWnd 窗口的产生.53.2 结构体定义.6
2、3.3 drawfun.cpp 文件中函数定义.63.4 图形的绘制.74 工具选择窗口的实现.104.1 资源编辑.104.2 工具栏窗口的产生.104.3 工具栏按钮效果的实现.104.4 消息传递.135 调色板的产生.145.1 窗口的产生.145.2 调色功能实现.155.3 消息处理.176 画笔宽度调节实现.186.1 创建画笔宽度调节对话框.186.2 实现原理.186.3 部分代码.187 保存、新建与打开功能的实现.197.1 实现截图.197.2 部分代码.208 实验结果.229 问题分析和解决.229.1 无法接收消息传递.229.2 文件代码过长.2210 总结.2
3、321 实验概述1 实验概述1.1 实验题目1.1 实验题目简单绘图软件的实现。1.2 实验内容1.2 实验内容使用 Windows Api 设计一个简单绘图程序,可以实现绘制线段、填充矩形、非填充矩形、椭圆、非填充椭圆等图形;实现绘图颜色的选择。1.3 实验要求1.3 实验要求基本要求:可以通过菜单与工具条实现不同绘图工具的选择;可以通过工具条实现绘图颜色的选择;当窗口大小改变后窗口图形不消失;高级要求:画笔宽度的修改,实现文件的保存。2 整体设计2 整体设计2.1 窗口描述2.1 窗口描述本项目共创建四个窗口,分别是:(1)类名为MyRegisterClass的父窗口,包括各种菜单项;(2
4、)绘图窗口(RegisterDrawWndClass):主要实现基本的绘图功能;(3)工具选择窗口(RegisterToolbarClass) :实现绘图工具的选择功能;(4)调色板窗口(ColorSelectDlgRegisterClass) :实现颜色的选择功能。本项目还包括一个改变画笔宽度的菜单项,通过发送消息 WM_CHANGEPENWIDTH 给绘图窗口以改变绘图中画笔的宽度。主界面截图:2.2 各项目文件中的函数及其主要功能2.2 各项目文件中的函数及其主要功能32.2.1 colorSelectDlgS 文件(1)ATOM ColorSelectDlgRegisterClass(
5、HINSTANCE hInstance)/进行调色板窗口的注册。(2)LRESULTCALLBACKColorBoxProc(HWNDhWnd,UINTmsg,WPARAMwParam,LPARAMlParam)/调色板窗口过程函数, 创建调色板, 并捕获颜色改变消息, 并发送给绘图窗口。(3)HWND CreateColorSelectDlg(LPCTSTR lpWindowName,DWORD dwStyle,HWNDhWndParent,HINSTANCE hInstance,HWND hWndSendTo)/对外提供创建调色板窗口的函数。2.2.2 drawfun 文件(1)typed
6、ef VOID (*PDRAWFUN)( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);指针函数,带入相应的函数名即可完成相应的绘图操作,可带入的函数名如下表格:绘制弧线绘制直线绘制矩形绘制椭圆鼠标落下PenMouseDownLineMouseDownRectMouseDownEllipseMouseDown鼠标弹起PenMouseUpLineMouseUpRectMouseUpEllipseMouseUp鼠标移动PenMouseMoveLineMouseMoveRectMouseMoveEllipseMouseMove(2)VOID Dra
7、wShape(HDC hdc,PDRAWSHAPE &pShp)/根据传入的图形参数,绘制相应的图形。(3)VOID DrawGraphics(HDC hdc,GRAPHICS &g)/根据传入的图形列表,逐个绘制保存的图形。2.2.3 drawwnd 文件(1)LRESULT CALLBACK WndDrawProc(HWND, UINT , WPARAM , LPARAM)/绘图窗口过程函数,完成文件新建,打开,保存,鼠标落下、弹起、移动,工具改变,颜色改变,画笔宽度改变等消息的处理。(2)ATOM RegisterDrawWndClass(HINSTANCE hInstance)/进行绘
8、图窗口注册。(3)HWND CreateDrawWindod(HWND ,HINSTANCE ,UINT)/对外提供创建绘图窗口的函数。2.2.4 graphicfile 文件(1)VOID SaveGraphic(LPCTSTR lpszFilename,GRAPHICS &g)/将传入的图形列表 g 存入 lpszFilename 中。(2)VOID OpenGraphic(LPCTSTR lpszFilename,GRAPHICS &g)/将传入的 lpszFilename 中所存的图形载入列表 g 中。(3)VOID ClearGraphic(GRAPHICS &g)/将列表 g 中存
9、储的图形清空。2.2.5 tololbox 文件(1)ATOM RegisterToolbarClass(HINSTANCE hInstance)/注册工具窗口类的创建和工具按钮窗口类的创建。(2)void InitToolBox(PTOOLBOX pTb,HINSTANCE hInstance,HWND hwnd,HWNDhWndWork)/设置工具窗口的初始化参数,并且创建显示。4(3)VOID ToolboxCreate(PTOOLBOX pTb)/创建工具窗口。(4)VOID ToolboxShow(PTOOLBOX pTb,BOOL fShow)/完成显示窗口或隐藏窗口。(5)VOI
10、D ToolboxUpdate(PTOOLBOX pTb)/有新文件打开或编辑时被调用, 刷新工具窗口。(6)LRESULT CALLBACK ToolboxWndProc(HWND , UINT ,WPARAM ,LPARAM )/工具窗口过程函数,完成工具窗口的相关创建、关闭和销毁的相关处理。(7)LRESULT CALLBACK ToolBtnWndProc(HWND , UINT ,WPARAM ,LPARAM )/工具按钮窗口过程函数,完成按钮的绘制,按钮选择消息发送的功能。(8)VOIDToolboxDrawBitmap(PTOOLBOX pTb,HDC hDC,INT tool)
11、/绘制对应的 Bitmap图。(9)VOID ToolboxSelectTool(PTOOLBOX pTb,INT tool)/将选择的工具按钮及其对应鼠标操作进行更新,并且将工具按钮改变消息发送给绘图窗口。2.2.6 Util 文件(1)VOID CenterWindow(HWND hwnd)/将传入的窗口至于他的 GW_OWNER 中间。(2)VOID FitRectToScreen(PRECT prc)/保证给定的矩形在可见的窗口范围内。(3)HBITMAP MyCreateBitmap(HDC hdc, INT cx, INT cy, INT nColors)/根据设定的条件创建 Bi
12、tmap。(4)BOOL ReadWindowPos(PSTR , PINT , PINT, PINT , PINT,BOOL ,PSTR ,PSTR )/读取对应的 windows 相应位置及状态信息。(5)VOID WriteWindowPos(PRECT, BOOL, PSTR,PSTR ,PSTR )/暂时保存 PRECT 中的信息。(6)VOID DrawSunkenRect(PRECT prc,HDC hdc)/(7)VOID DrawMarginBorder(HWND hwnd,HDC hdc)/绘制 hwnd 的矩形窗口。2.2.7 PopFile 文件(1)void PopF
13、ileInitialize (HWND hwnd)/设置文件初始的属性。(2)BOOL PopFileOpenDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)/设置对应打开文件时的特定属性设置。(3)BOOL PopFileSaveDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)/设置对应保存文件时的特定属性设置。2.2.8 MYDRAW 文件(1)在 int APIENTRY WinMain 函数中添加如下代码:if(!ColorSelectDlgRegisterC
14、lass(hInstance)return FALSE;If(!RegisterToolbarClass(hInstance)return FALSE;if(!RegisterDrawWndClass(hInstance)5return FALSE;(2)LRESULT CALLBACK DlgPenWidth(HWND, UINT , WPARAM , LPARAM )完成画笔宽度对话框的相关实现。(3)在 WndProc 函数中,如果画笔对话框中改变了参数值则将该消息发送给绘图窗口。(4)在 WM_CREATE 消息中,完成绘图窗口,调色板,工具栏的创建。(5)实现菜单栏中文件保存、打开、
15、新建的消息传递,传送给绘图窗口。以及完成各子窗口的显示和隐藏处理。(6)在 WM_SIZE 中根据调色板的大小,相应的调整绘图窗口的大小。3 绘图窗口的实现3 绘图窗口的实现3.1 DrawWnd 窗口的产生3.1 DrawWnd 窗口的产生3.1.1 在主窗口的WM_CREATE中初始化窗口hWndDraw=CreateDrawWindod(hWnd,(LPCREATESTRUCT)(lParam)-hInstance,2);3.1.2 在主窗口WM_SIZE中调整颜色选择窗口和绘图窗口的相对大小case WM_SIZE:if(GetWindowLong(hWndColor,GWL_STYL
16、E)&WS_CHILD)RECT rt;GetWindowRect(hWndColor,&rt);ScreenToClient(hWnd,(LPPOINT)&rt);ScreenToClient(hWnd,(LPPOINT)&rt+1);MoveWindow(hWndDraw,0,rt.bottom,LOWORD(lParam),HIWORD(lParam)-rt.bottom,TRUE);elseMoveWindow(hWndDraw,0,0,LOWORD(lParam),HIWORD(lParam),TRUE);break;63.2 结构体定义3.2 结构体定义typedef struct
17、 tagDrawStruPOINT ptStart,ptEnd,ptPrev;COLORREF color;BOOL bMouseDown;HPEN hPen;HBRUSH hBr;BOOL bFill;INT iPenWidth;PDRAWFUN pMouseDown,pMouseMove,pMouseUp;GRAPHICS g;PDRAWSHAPE pCurShp; DRAWSTRU,*PDRAWSTRU;3.3 drawfun.cpp 文件中函数定义3.3 drawfun.cpp 文件中函数定义定义函数指针类型 :typedef VOID (*PDRAWFUN)( PVOID pDs,H
18、WND hWnd,WPARAM wParam,LPARAM lParam);绘制直线:VOID LineMouseDown( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);VOID LineMouseUp( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);VOID LineMouseMove( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);绘制矩形:VOID RectMouseDown( PVOID pDs,HWND hWnd,WPARAM
19、wParam,LPARAM lParam);VOID RectMouseUp( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);VOID RectMouseMove( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);绘制椭圆:VOID EllipseMouseDown( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);VOID EllipseMouseUp( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lPa
20、ram);7VOID EllipseMouseMove( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);绘制线条:VOID PenMouseDown( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);VOID PenMouseUp( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);VOID PenMouseMove( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);VOID DrawShape(
21、HDC hdc,PDRAWSHAPE &pShp);VOID DrawGraphics(HDC hdc,GRAPHICS &g);3.4 图形的绘制3.4 图形的绘制3.4.1 基本原理鼠标按下时, 即产生 WM_LBUTTONDOWN 消息时记录鼠标按下点的坐标, 鼠标移动产生WM_MOUSEMOVE 消息并进行进行相应绘制,且在过程中将上一次所画图像用背景色擦掉。鼠标弹起产生 WM_LBUTTONUP 消息,记录相应最终坐标并绘制图形。3.4.2 主要代码(以直线为例)(1)鼠标按下VOID LineMouseDown( PVOID pV,HWND hWnd,WPARAM wParam,L
22、PARAM lParam)PDRAWSTRU pDs;pDs=(PDRAWSTRU)pV;pDs-ptStart.x=GET_X_LPARAM(lParam);pDs-ptStart.y=GET_Y_LPARAM(lParam);pDs-ptEnd.x=pDs-ptStart.x;pDs-ptEnd.y=pDs-ptStart.y;pDs-bMouseDown=TRUE;/-新建 DRAWSHAPE 对象以存储线条的信息PDRAWLINE pLine;PDRAWSHAPE pShp;pShp=new DRAWSHAPE;pDs-pCurShp=pShp;pShp-color=pDs-color
23、;pShp-shape=SHAPELINE;8pShp-penWidth=pDs-iPenWidth;pLine=new DRAWLINE;pShp-pData=pLine;pLine-ptStart=pDs-ptStart;pLine-ptEnd=pDs-ptEnd;/-新建 DRAWSHAPE 对象以存储线条的信息SetCapture(hWnd);(2)鼠标移动VOID LineMouseMove( PVOID pV,HWND hWnd,WPARAM wParam,LPARAM lParam)PDRAWSTRU pDs;pDs=(PDRAWSTRU)pV;HDC hdc;if(pDs-bM
24、ouseDown)hdc=GetDC(hWnd);SetROP2(hdc,R2_NOT);MoveToEx(hdc,pDs-ptStart.x,pDs-ptStart.y,NULL);LineTo(hdc,pDs-ptEnd.x,pDs-ptEnd.y);pDs-ptEnd.x=GET_X_LPARAM(lParam);pDs-ptEnd.y=GET_Y_LPARAM(lParam);MoveToEx(hdc,pDs-ptStart.x,pDs-ptStart.y,NULL);LineTo(hdc,pDs-ptEnd.x,pDs-ptEnd.y);ReleaseDC(hWnd,hdc);(3)
25、鼠标弹起VOID LineMouseUp( PVOID pV,HWND hWnd,WPARAM wParam,LPARAM lParam)9PDRAWSTRU pDs;pDs=(PDRAWSTRU)pV;HDC hdc;pDs-bMouseDown=FALSE;ReleaseCapture();hdc=GetDC(hWnd);SetROP2(hdc,R2_NOT);MoveToEx(hdc,pDs-ptStart.x,pDs-ptStart.y,NULL);LineTo(hdc,pDs-ptEnd.x,pDs-ptEnd.y);pDs-ptEnd.x=GET_X_LPARAM(lParam);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 燕山 大学 Windows 程序设计 实验 报告
限制150内