windows三级项目_第1页
windows三级项目_第2页
windows三级项目_第3页
windows三级项目_第4页
windows三级项目_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、 Windows程 序 设 计 实 验 报 告Technology Chmistry Experiment Report学 生 所 在 学 院:软 件 学 院学 生 所 在 班 级:软件一班指 导 教 师:穆运峰、李可、李季辉、王艳芬教 务 处2016年 5 月实验目的掌握用C/C+语言采用API在Windows平台下编写软件的方法,熟悉消息驱动的本质;熟悉Windows平台基本控件的本质、熟悉动态链接库的使用,加深对课堂知识的掌握。实验内容仿照Windows操作系统附件的绘图软件设计一个绘图程序,依次为程序增加绘图函数、菜单选择、工具选择、颜色选择、文件操作等功能,可以在此基础上进行扩充,最

2、终完成一个相对完整的绘图程序。实验步骤整体设计进行分类:一 窗口描述本项目共创建四个窗口,分别是:(1)类名为 MyRegisterClass 的父窗口,包括各种菜单项;(2)绘图窗口(RegisterDrawWndClass):主要实现基本的绘图功能;(3)工具选择窗口(RegisterToolbarClass):实现绘图工具的选择功能;(4)调色板窗口(ColorSelectDlgRegisterClass):实现颜色的选择功能。本项目还包括一个改变画笔宽度的菜单项,通过发送消息 WM_CHANGEPENWIDTH 给绘图窗口以改变绘图中画

3、笔的宽度。主界面截图:二各项目文件中的函数及其主要功能2绘制弧线绘制直线绘制矩形绘制椭圆鼠标落下PenMouseDownLineMouseDownRectMouseDownEllipseMouseDown鼠标弹起PenMouseUpLineMouseUpRectMouseUpEllipseMouseUp鼠标移动PenMouseMoveLineMouseMoveRectMouseMoveEllipseMouseMove2.1 colorSelectDlgS 文件(1)ATOM ColorSelectDlgRegisterClass(HINSTANCE hI

4、nstance)/进行调色板窗口的注册。(2)LRESULT CALLBACK ColorBoxProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAMlParam)/调色板窗口过程函数,创建调色板,并捕获颜色改变消息,并发送给绘图窗口。(3)HWND CreateColorSelectDlg(LPCTSTR lpWindowName,DWORD dwStyle,HWNDhWndParent,HINSTANCE hInstance,HWND hWndSendTo)

5、/对外提供创建调色板窗口的函数。2.2 drawfun 文件(1)typedef VOID (*PDRAWFUN)( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);指针函数,带入相应的函数名即可完成相应的绘图操作,可带入的函数名如下表格:(2)VOID DrawShape(HDC hdc,PDRAWSHAPE &pShp)/根据传入的图形参数,绘制相应的图形。(3)VOID DrawGraphics(HDC

6、 hdc,GRAPHICS &g)/根据传入的图形列表,逐个绘制保存的图形。2.3 drawwnd 文件(1)LRESULT CALLBACK WndDrawProc(HWND, UINT , WPARAM , LPARAM)/绘图窗口过程函数,完成文件新建,打开,保存,鼠标落下、弹起、移动,工具改变,颜色改变,画笔宽度改变等消息的处理。(2)ATOM RegisterDrawWndClass(HINSTANCE hInstance)/进行绘图窗口注册。(3

7、)HWND CreateDrawWindod(HWND ,HINSTANCE ,UINT)/对外提供创建绘图窗口的函数。2.4 graphicfile 文件(1)VOID SaveGraphic(LPCTSTR lpszFilename,GRAPHICS &g)/将传入的图形列表 g 存入 lpszFilename 中。(2)VOID OpenGraphic(LPCTSTR lpszFilename,GRAPHICS &g)/将传

8、入的 lpszFilename 中所存的图形载入列表 g 中。(3)VOID ClearGraphic(GRAPHICS &g)/将列表 g 中存储的图形清空。2.5 tololbox 文件(1)ATOM RegisterToolbarClass(HINSTANCE hInstance)/注册工具窗口类的创建和工具按钮窗口类的创建。(2)void InitToolBox(PTOOLBOX pTb,HINSTANCE hInstance,H

9、WND hwnd,HWNDhWndWork)/设置工具窗口的初始化参数,并且创建显示。3(3)VOID ToolboxCreate(PTOOLBOX pTb)/创建工具窗口。(4)VOID ToolboxShow(PTOOLBOX pTb,BOOL fShow)/完成显示窗口或隐藏窗口。(5)VOID ToolboxUpdate(PTOOLBOX pTb)/有新文件打开或编辑时被调用,刷新工具窗口。(6)LRESULT CALLBACK ToolboxWndProc(HWND ,

10、60;UINT ,WPARAM ,LPARAM )/工具窗口过程函数,完成工具窗口的相关创建、关闭和销毁的相关处理。(7)LRESULT CALLBACK ToolBtnWndProc(HWND , UINT ,WPARAM ,LPARAM )/工具按钮窗口过程函数,完成按钮的绘制,按钮选择消息发送的功能。(8)VOID  ToolboxDrawBitmap(PTOOLBOX pTb,HDC hDC,INT tool)/绘制对应的 Bi

11、tmap图。(9)VOID ToolboxSelectTool(PTOOLBOX pTb,INT tool)/将选择的工具按钮及其对应鼠标操作进行更新,并且将工具按钮改变消息发送给绘图窗口。2.6 Util 文件(1)VOID CenterWindow(HWND hwnd)/将传入的窗口至于他的 GW_OWNER 中间。(2)VOID FitRectToScreen(PRECT prc)/保证给定的矩形在可见的窗口范围内。(3)HBITMAP MyCreateBitmap(H

12、DC hdc, INT cx, INT cy, INT nColors)/根据设定的条件创建 Bitmap。(4)BOOL ReadWindowPos(PSTR , PINT , PINT, PINT , PINT,BOOL ,PSTR ,PSTR )/读取对应的 windows 相应位置及状态信息。(5)VOID WriteWindowPos(PRECT, BOOL

13、, PSTR,PSTR ,PSTR )/暂时保存 PRECT 中的信息。(6)VOID DrawSunkenRect(PRECT prc,HDC hdc)/(7)VOID DrawMarginBorder(HWND hwnd,HDC hdc)/绘制 hwnd 的矩形窗口。2.7 PopFile 文件(1)void PopFileInitialize (HWND hwnd)/设置文件初始的属性。(2)BOOL 

14、;PopFileOpenDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)/设置对应打开文件时的特定属性设置。(3)BOOL PopFileSaveDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)/设置对应保存文件时的特定属性设置。2.8 MYDRAW 文件(1)在 int APIENTRY 

15、WinMain 函数中添加如下代码:if(!ColorSelectDlgRegisterClass(hInstance)return FALSE;If(!RegisterToolbarClass(hInstance)return FALSE;if(!RegisterDrawWndClass(hInstance)4return FALSE;(2)LRESULT CALLBACK DlgPenWidth(HWND, UINT , WPARAM , LPARAM )完成画笔宽度对话

16、框的相关实现。(3)在 WndProc 函数中,如果画笔对话框中改变了参数值则将该消息发送给绘图窗口。(4)在 WM_CREATE 消息中,完成绘图窗口,调色板,工具栏的创建。(5)实现菜单栏中文件保存、打开、新建的消息传递,传送给绘图窗口。以及完成各子窗口的显示和隐藏处理。(6)在 WM_SIZE 中根据调色板的大小,相应的调整绘图窗口的大小。三 绘图窗口的实现3.1 DrawWnd 窗口的产生3.1.1 在主窗口的WM_CREATE中初始化窗口hWndDraw=CreateDrawWindo

17、d(hWnd,(LPCREATESTRUCT)(lParam)->hInstance,2);3.1.2 在主窗口WM_SIZE中调整颜色选择窗口和绘图窗口的相对大小case WM_SIZE:if(GetWindowLong(hWndColor,GWL_STYLE)&WS_CHILD)RECT rt;GetWindowRect(hWndColor,&rt);ScreenToClient(hWnd,(LPPOINT)&rt);ScreenToClient(hWnd,(LPPOINT)&rt+1);MoveWindow(hWndDr

18、aw,0,rt.bottom,LOWORD(lParam),HIWORD(lParam)-rt.bottom,TRUE);elseMoveWindow(hWndDraw,0,0,LOWORD(lParam),HIWORD(lParam),TRUE);break;53.2 结构体定义typedef struct tagDrawStruPOINT ptStart,ptEnd,ptPrev;COLORREF color;BOOL bMouseDown;HPEN hPen;HBRUSH hBr;BOOL bFil

19、l;INT iPenWidth;PDRAWFUN pMouseDown,pMouseMove,pMouseUp;GRAPHICS g;PDRAWSHAPE pCurShp; DRAWSTRU,*PDRAWSTRU;3.3 drawfun.cpp 文件中函数定义定义函数指针类型 :typedef VOID (*PDRAWFUN)( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);绘制直线:VOID&

20、#160;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&

21、#160;RectMouseDown( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);VOID RectMouseUp( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);VOID RectMouseMove( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);绘制椭圆:VOID&

22、#160;EllipseMouseDown( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);VOID EllipseMouseUp( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);6VOID EllipseMouseMove( PVOID pDs,HWND hWnd,WPARAM wParam,LPARAM lParam);

23、绘制线条: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);VOI

24、D DrawShape(HDC hdc,PDRAWSHAPE &pShp);VOID DrawGraphics(HDC hdc,GRAPHICS &g);绘制橡皮擦:VOID EraserMouseDown(PVOID pDs, HWND hWnd, WPARAM wParam, LPARAM lParam);VOID EraserMouseUp(PVOID pDs, HWND hWnd, WPARAM wParam, LPARAM lParam);VOID EraserMouseMove(PVOID pDs, HWN

25、D hWnd, WPARAM wParam, LPARAM lParam);3.4 图形的绘制3.4.1 基本原理鼠标按下时,即产生 WM_LBUTTONDOWN 消息时记录鼠标按下点的坐标,鼠标移动产生WM_MOUSEMOVE 消息并进行进行相应绘制,且在过程中将上一次所画图像用背景色擦掉。鼠标弹起产生 WM_LBUTTONUP 消息,记录相应最终坐标并绘制图形。3.4.2 主要代码(以矩形为例)(1)鼠标按下VOID RectMouseDown( PVOID pV,HWND hWnd,WPARAM wParam

26、,LPARAM 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对象以存储矩形的信息PDRAWRECT pRect;PDRAWSHAPE pShp;pShp=new DRAWSHAPE;pDs->p

27、CurShp=pShp;pShp->color=pDs->color;pShp->shape=SHAPERECT;pShp->penWidth=pDs->iPenWidth;pRect=new DRAWRECT;pShp->pData=pRect;pRect->rect.left=pDs->ptStart.x;pRect->rect.top=pDs->ptStart.y;pRect->rect.right=pDs->ptEnd.x;pRect->rect.bottom=pDs->ptEnd.y;pRect-&g

28、t;bFill=pDs->bFill;/-新建DRAWSHAPE对象以存储矩形的信息SetCapture(hWnd); (2)鼠标移动VOID RectMouseMove( PVOID pV,HWND hWnd,WPARAM wParam,LPARAM lParam)PDRAWSTRU pDs;pDs=(PDRAWSTRU)pV;HDC hdc;if(pDs->bMouseDown)hdc=GetDC(hWnd);SetROP2(hdc,R2_NOT);SelectObject(hdc,GetStockObject(NULL_BRUSH);Rectangle(hdc,pDs->

29、;ptStart.x,pDs->ptStart.y,pDs->ptEnd.x,pDs->ptEnd.y);pDs->ptEnd.x=GET_X_LPARAM(lParam);pDs->ptEnd.y=GET_Y_LPARAM(lParam);Rectangle(hdc,pDs->ptStart.x,pDs->ptStart.y,pDs->ptEnd.x,pDs->ptEnd.y);ReleaseDC(hWnd,hdc);(3)鼠标弹起VOID RectMouseUp( PVOID pV,HWND hWnd,WPARAM wParam,LPA

30、RAM lParam)PDRAWSTRU pDs;pDs=(PDRAWSTRU)pV;HDC hdc;HBRUSH hBrOld;pDs->bMouseDown=FALSE;ReleaseCapture();hdc=GetDC(hWnd);SetROP2(hdc,R2_NOT);SelectObject(hdc,GetStockObject(NULL_BRUSH);Rectangle(hdc,pDs->ptStart.x,pDs->ptStart.y,pDs->ptEnd.x,pDs->ptEnd.y);pDs->ptEnd.x=GET_X_LPARAM(l

31、Param);pDs->ptEnd.y=GET_Y_LPARAM(lParam);SetROP2(hdc,R2_COPYPEN);HPEN hPenOld=(HPEN)SelectObject(hdc,pDs->hPen);/增加的画笔选择代码if(pDs->bFill)hBrOld=(HBRUSH)SelectObject(hdc,pDs->hBr);Rectangle(hdc,pDs->ptStart.x,pDs->ptStart.y,pDs->ptEnd.x,pDs->ptEnd.y);SelectObject(hdc,hPenOld);/

32、增加的选出画笔的代码if(pDs->bFill)SelectObject(hdc,hBrOld);ReleaseDC(hWnd,hdc);/-取得DRAWSHAPE对象以存储矩形的信息PDRAWRECT pRect;PDRAWSHAPE pShp;pShp=pDs->pCurShp;pRect=(PDRAWRECT)pShp->pData;if(pDs->ptStart.x=pDs->ptEnd.x)&&(pDs->ptEnd.y=pDs->ptStart.y)/如果起点与终点相同则删除矩形delete pRect;delete pSh

33、p;pDs->pCurShp=NULL;else/存储矩形pRect->rect.right=pDs->ptEnd.x;pRect->rect.bottom=pDs->ptEnd.y;pDs->g.AddTail(pShp);pDs->pCurShp=NULL;/-将新建DRAWSHAPE对象添加到g中四 工具选择窗口的实现4.1 资源编辑在 Resourse View 中插入资源类型 Bitmap,在 Bitmap 中插入 Bitmap,绘制自己所需的图标,每种

34、图标对应两个位图,鼠标按下和弹起对应不同的位图从而实现按钮效4.2 工具栏窗口的产生在主窗口的 WM_CREATE 消息中调用函数:InitToolBox(&Tb,(LPCREATESTRUCT)(lParam)->hInstance,hWndDraw);产生工具栏窗口。该函数在 ToolBox.cpp 中,包括初始化工具栏的一些设置,设置默认的第一个工具按钮,创建工具窗口,最后使窗口可见。4.3 工具栏按钮效果的实现4.3.1 基本原理初始化时将所有弹起时的位图选入设备描述句柄,并拷贝到窗口对应的矩形区域,当

35、鼠标按下时,在指定位置拷贝新的位图将原位图覆盖即可实现按钮效果4.3.2 结构体和数组static TOOLS aTools =  PenMouseDown,PenMouseMove,PenMouseUp, NULL,IDBM_TUPENCIL,  NULL,IDBM_TDPENCIL,  NULL,FALSE, LineMouseDown,LineMouseMove,LineMouseUp,NULL,IDBM_TULINE,NULL,IDBM_TDLINE,NULL,FAL

36、SE, RectMouseDown,RectMouseMove,RectMouseUp,NULL,IDBM_TURECT,NULL,IDBM_TDRECT,NULL,FALSE, RectMouseDown,RectMouseMove,RectMouseUp,NULL,IDBM_TUSRECT,NULL,IDBM_TDSRECT,NULL,TRUE, EllipseMouseDown,EllipseMouseMove,EllipseMouseUp,NULL,IDBM_TUCIRCLE,  NULL,IDBM_TDCIRCLE, 

37、60;NULL,FALSE, EllipseMouseDown,EllipseMouseMove,EllipseMouseUp,NULL,IDBM_TUSCIRCLE,  NULL,IDBM_TDSCIRCLE,  NULL,TRUE,;/定义一个 aTools 数组保存按钮对应的函数及对应的按下及弹起位图的 ID。4.3.3 实现的部分代码VOID ToolboxCreate(PTOOLBOX pTb)BITMAP bmp;INT i;INT x;INT

38、 y;INT cx;INT cy;RECT rc;RECT rcClient;POINT pt;UINT cxToolBtn,cyToolBtn;11for (i = 0; i < pTb->iToolBtnCount; i+) if (!(pTb->aToolsi.hbmToolBtnUp= LoadBitmap(pTb->hInst,MAKEINTRESOURCE(pTb->aToolsi.i

39、dbmToolBtnUp)return;if (!(pTb->aToolsi.hbmToolBtnDown = LoadBitmap(pTb->hInst,MAKEINTRESOURCE(pTb->aToolsi.idbmToolBtnDown)return;GetObject(pTb->aTools0.hbmToolBtnUp, sizeof(BITMAP), (PSTR)&bmp);cxToolBtn=pTb->cxToolBtn= bmp.bmWidth;cyToolBtn=pTb->

40、cyToolBtn= bmp.bmHeight;rc.left = 0;rc.top = 0;rc.right = PALETTEMARGIN + (pTb->cxToolBtn - 1) * pTb->iToolboxColumns) +1 + PALETTEMARGIN;rc.bottom = PALETTEMARGIN + (pTb->cyToolBtn -

41、60;1) *(pTb->iToolBtnCount +pTb->iToolboxColumns-1)/ pTb->iToolboxColumns)+ 1 + PALETTEMARGIN;AdjustWindowRect(&rc, TOOLBOXSTYLE, FALSE);cx = rc.right - rc.left;cy = rc.bottom - rc.top;GetClientRect(pTb->

42、hwndMain, &rcClient);pt.x = rcClient.right - cx - (2 * PALETTEMARGIN);pt.y = rcClient.top + pTb->yBegin + (2 * PALETTEMARGIN);ClientToScreen(pTb->hwndMain, &pt);SetRect(&rc, pt.x, pt

43、.y, pt.x + cx, pt.y + cy);FitRectToScreen(&rc);x = rc.left;y = rc.top;12if  (!(pTb->hwndToolbox  =  CreateWindow(szToolboxClass,  pTb->szTBName,TOOLBOXSTYLE,x, y, cx, cy,pTb->hwndMai

44、n, NULL,pTb->hInst,(LPVOID)pTb )return;x = PALETTEMARGIN;y = PALETTEMARGIN;for (i = 0; i <pTb->iToolBtnCount; i+) CreateWindow(szToolBtnClass, NULL,WS_CHILD | WS_VISIBLE,x, y,pTb->cxToolBtn,pTb->cyToo

45、lBtn,pTb->hwndToolbox, (HMENU)i,pTb->hInst, (LPVOID)pTb );if (i+1)%pTb->iToolboxColumns) x +=pTb->cxToolBtn - 1;else x = PALETTEMARGIN;y += pTb->cyToolBtn - 1;ToolboxUpdate(pTb);4.4 消息传递4.4.1 实现原理在

46、60;ToolBtnWndProc 函数的 WM_LBUTTONDOWN 消息响应在工具窗口中重新选择工具栏中的工具按钮,选择后调用函数 ToolboxSelectTool(pTb,(UINT)GetWindowLong(hwnd),GWL_ID)。如果当前选择改变了工具按钮则发送消息给绘图窗口,并且在 WM_PAINT 中在重新选择后进行重绘。4.4.2 部分代码13在 ToolBtnWndProc 函数中:case WM_LBUTTONDOWN:pTb=(PTOOLBOX)GetWindow

47、Long(hwnd,GWL_USERDATA);ToolboxSelectTool(pTb,(UINT)GetWindowLong(hwnd), GWL_ID);绘图窗口 WndDrawProc 函数中:case WM_TOOLCHANGE:pTb=(PTOOLBOX)wParam;ds.bFill=pTb->bFill;ds.pMouseDown=pTb->pMouseDown;ds.pMouseMove=pTb->pMouseMove;ds.pMouseUp=pTb->pMouseUp;break;case WM_L

48、BUTTONDOWN:(ds.pMouseDown)(&ds,hWnd,wParam,lParam);break;case WM_LBUTTONUP:(ds.pMouseUp)(&ds,hWnd,wParam,lParam);break;case WM_MOUSEMOVE:(ds.pMouseMove)(&ds,hWnd,wParam,lParam);break;五 调色板的实现5.1 窗口的产生5.1.1 注册调色板窗口类,然后在主窗口的 WM_CREATE 消息中调用以下在ColorSelect.

49、cpp 中定义的函数产生调色板窗口。HWND CreateColorSelectDlg(LPCTSTR lpWindowName,DWORD dwStyle,HWNDhWndParent,HINSTANCE hInstance,HWND hWndSendTo)return14CreateWindow(szColorBoxClass,lpWindowName,dwStyle,0,0,0,0,hWndParent,NULL,hInstance,(LPVOID)hWndSendTo);5.1.2 截图5.2 调色功能实现

50、5.2.1 实现原理注册 ColorBoxClass 窗口类,在 ColorBoxProc 函数中定义颜色数组static  DWORD argbDefaultColor =RGB(255, 255, 255), RGB(0, 0, 0),RGB(192, 192, 192), RGB(128, 128, 128),RGB(255, 0, 0),RGB(128, 0, 

51、;0),RGB(255, 255, 0),RGB(128, 128, 0),RGB(0, 255, 0),RGB(0, 128, 0),RGB(0, 255, 255),RGB(0, 128, 128),RGB(0, 0, 255),RGB(0, 0, 128),RGB(255, 0, 255),RGB(128, 0, 128),RGB(255, 255, 128), 

52、;RGB(128, 128, 64),RGB(0, 255, 128),RGB(0, 64, 64),RGB(128, 255, 255), RGB(0, 128, 255),RGB(128, 128, 255), RGB(0, 64, 128),RGB(255, 0, 128),RGB(64, 0, 128),RGB(255, 128, 64),RGB(128, 6

53、4, 0);在 WM_CREATE 消息中确定要产生的调色板的具体参数,并且调整窗口的大小,在WM_PAINT 消息中绘制对应的颜色按钮。155.2.2 部分代码case WM_CREATE:hWndSendTo=(HWND)(LPCREATESTRUCT)(lParam)->lpCreateParams);argbCurrent=argbDefaultColor;nMargin=5;cxColorBox=30;xColorBoxStart=nMargin;yColorBoxStart=nMargin;nColorRows=2;

54、nColorCols=14;nColorCount=28;nWidth=nMargin*2+cxColorBox*nColorCols;nHeight=nMargin*2+cxColorBox*nColorRows;pt.x=0;pt.y=0;if(!(GetWindowLong(hWnd,GWL_STYLE)&WS_CHILD)ClientToScreen(GetParent(hWnd),&pt);rt.top=pt.y;rt.left=pt.x;rt.bottom=pt.y+nHeight;rt.right=pt.x+nWidth;AdjustWindowRect(&

55、;rt,GetWindowLong(hWnd,GWL_STYLE),FALSE);MoveWindow(hWnd,rt.left,rt.top,rt.right-rt.left,rt.bottom-rt.top,TRUE);break;case WM_PAINT:hdc = BeginPaint(hWnd, &ps);x=xColorBoxStart;y=yColorBoxStart;for(i=1;i<=nColorCount;i+)16hbr=CreateSolidBrush(argbCurrenti-1);hbrOld=(HBRUSH

56、)SelectObject(hdc,hbr);Rectangle(hdc,x,y,x+cxColorBox,y+cxColorBox);SelectObject(hdc,hbrOld);DeleteObject(hbr);if(i%nColorRows)y+=cxColorBox;elsey=yColorBoxStart;x+=cxColorBox;EndPaint(hWnd, &ps);break;5.3 消息处理点击调色板中的颜色选择按钮,在在ColorBoxProc函数中产生相应的消息case WM_LBUTTONDOWN:pt.x=GET_X_LP

57、ARAM(lParam);pt.y=GET_Y_LPARAM(lParam);nCol=(pt.x-xColorBoxStart)/cxColorBox;nRow=(pt.y-yColorBoxStart)/cxColorBox;if(nCol>=0 && nCol<nColorCols)&& (nRow>=0 && nRow<nColorRows)i=nCol*nColorRows+nRow;color=argbCurrenti;17SendMessage(hWndSen

58、dTo,WM_CHANGECOLOR,(WPARAM)0,(LPARAM)color);break;将消息发送给绘图窗口,并产生相应的消息处理:case WM_CHANGECOLOR:DeleteObject(ds.hBr);DeleteObject(ds.hPen);ds.color=(COLORREF)(lParam);ds.hBr=CreateSolidBrush(ds.color);ds.hPen=CreatePen(PS_SOLID,ds.iPenWidth,ds.color);六 画笔宽度调节实现6.1 创建画笔宽度调节对话框设计对话框,如下图:6.2

59、 实现原理在 MYDRAW.cpp 中 创 建 对 话 框 , 并 且 在 WndProc 函 数 中 的 IDM_PEN 中 将WM_CHANGEPENWIDTH 的消息传递给绘图窗口。6.3 部分代码在 DlgPenWidth 函数中重要处理代码如下:case WM_INITDIALOG:18piPenWidth=(INT *)(lP

60、aram);hWndSpin=GetDlgItem(hDlg,IDC_SPIN_PEN);SetDlgItemInt(hDlg,IDC_PEN,*piPenWidth,FALSE);SendMessage(hWndSpin,UDM_SETRANGE ,(WPARAM)0,(LPARAM)MAKELONG (10 ,1);return TRUE;case IDOK:*piPenWidth=GetDlgItemInt(hDlg,IDC_PEN,&bSuccessed,FALSE);EndDialog(hDlg, LOWORD(wP

61、aram);break;在主窗口中 WndProc 函数中:(传送消息给绘图窗口)case IDM_PEN:if (DialogBoxParam(hInst, (LPCTSTR)IDD_DLG_PENWIDTH, hWnd,(DLGPROC)DlgPenWidth,(LPARAM)&iPenWidth)=IDOK)SendMessage(hWndDraw,WM_CHANGEPENWIDTH,(WPARAM)0,(LPARAM)iPenWidth);break;在绘图窗口中处理 WM_CHANGEPENWIDTH

62、60;消息代码:case WM_CHANGEPENWIDTH:ds.iPenWidth=(INT)(lParam);DeleteObject(ds.hPen);ds.hPen=CreatePen(PS_SOLID,ds.iPenWidth,ds.color);break;七 保存、新建与打开功能的实现7.1 实现截图当在 File 菜单下,选择对应的 Open,Save,Save As,New 时弹出如下对话框。197.2 部分代码void PopFileInitialize (HWN

63、D hwnd)初始化定义的 static OPENFILENAME ofn 变量。BOOL PopFileOpenDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)ofn.hwndOwner= hwnd ofn.lpstrFile= pstrFileName ofn.lpstrFileTitle= pstrTitleName ofn.Flags= OFN_HIDEREADONLY | OFN_CREATEPROMPT return GetOpenFileName (&ofn) /对应打开时文件的属性设置BOOL PopFileSaveDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)of

温馨提示

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

评论

0/150

提交评论