高級語言實驗報告_第1頁
高級語言實驗報告_第2頁
高級語言實驗報告_第3頁
高級語言實驗報告_第4頁
高級語言實驗報告_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、 高級語言程序設計實驗報告Technology Chmistry Experiment Report班 級:學 號:學生姓名:指導教師:教 務 處2015年 11 月簡單繪圖軟件的實現(xiàn)實驗內(nèi)容:使用Windows API或MFC設計一個繪圖軟件,可以實現(xiàn)繪制線段、橢圓、矩形和曲線,線的顏色與寬帶、圖形是否填充可以由用戶選擇,可以實現(xiàn)所繪制圖形的保存與打開,窗口大小改變后圖形不消失。實驗步驟:(寫出模塊劃分、函數(shù)的調(diào)用關系、類的關系、關鍵代碼)本繪圖軟件是使用Window API來進行編寫的,主要分為1、 圖形的選擇與繪制2、 顏色的選擇3、 畫筆寬度的選擇4、 圖形的保存、打開與重繪1 圖形的

2、選擇與繪制1.1 畫圖時所需用的結(jié)構體 typedef struct POINT ptStart,ptEnd;BOOL bMouseDown;HPEN hPen;HBRUSH hBr;INT PenWidth;COLORREF icolor;BOOL bFill;DRAWSTRUCT,*PDRAWSTRUCT;1.2 畫圖所用的函數(shù) 畫橢圓時所用的函數(shù)VOID EllipseMouseDown(PDRAWSTRUCT pDs,HWND hWnd,WPARAM wParam,LPARAM lParam)pDs-ptStart.x=GET_X_LPARAM(lParam);pDs-ptStart.

3、y=GET_Y_LPARAM(lParam);pDs-ptEnd.x=pDs-ptStart.x;pDs-ptEnd.y=pDs-ptStart.y;pDs-bMouseDown=TRUE;SetCapture(hWnd);VOID EllipseMouseMove(PDRAWSTRUCT pDs,HWND hWnd,WPARAM wParam,LPARAM lParam)if(pDs-bMouseDown)HDC hdc=GetDC(hWnd);HBRUSH hBrOld;SetROP2(hdc,R2_NOTXORPEN);HPEN hPenOld=(HPEN)SelectObject(hd

4、c,pDs-hPen); if(pDs-bFill) hBrOld=(HBRUSH)SelectObject(hdc,pDs-hBr); else SelectObject(hdc,(HBRUSH)GetStockObject(NULL_BRUSH);Ellipse(hdc,pDs-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);Ellipse(hdc,pDs-ptStart.x,pDs-ptStart.y,pDs

5、-ptEnd.x,pDs-ptEnd.y);SelectObject(hdc,hPenOld);if(pDs-bFill)SelectObject(hdc,hBrOld);ReleaseDC(hWnd,hdc);VOID EllipseMouseUp(PDRAWSTRUCT pDs,HWND hWnd,WPARAM wParam,LPARAM lParam)HDC hdc;HBRUSH hBrOld;pDs-bMouseDown=FALSE;ReleaseCapture();hdc=GetDC(hWnd);SetROP2(hdc,R2_NOTXORPEN);HPEN hPenOld=(HPEN

6、)SelectObject(hdc,pDs-hPen); if(pDs-bFill) hBrOld=(HBRUSH)SelectObject(hdc,pDs-hBr); else SelectObject(hdc,(HBRUSH)GetStockObject(NULL_BRUSH);Ellipse(hdc,pDs-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);SetROP2(hdc,R2_COPYPEN);Ell

7、ipse(hdc,pDs-ptStart.x,pDs-ptStart.y,pDs-ptEnd.x,pDs-ptEnd.y);myshape.shape=SHAPECIRCLE;myshape.DrawCircle.rect.left=pDs-ptStart.x;myshape.DrawCircle.rect.top=pDs-ptStart.y;myshape.DrawCircle.rect.right=pDs-ptEnd.x;myshape.DrawCircle.rect.bottom=pDs-ptEnd.y;myshape.DrawCircle.icolor=pDs-icolor;mysha

8、pe.DrawCircle.PenWidth=pDs-PenWidth;myshape.DrawCircle.bFill=pDs-bFill;graphicArray.Add(myshape);SelectObject(hdc,hPenOld);if(pDs-bFill)SelectObject(hdc,hBrOld);ReleaseDC(hWnd,hdc);ReleaseDC(hWnd,hdc);注:直線、矩形、曲線的繪制函數(shù)由于與橢圓的繪制函數(shù)非常相似,以及限于篇幅的原因就不多寫了。1.3 圖形的選擇case IDM_DRAW_ELLIPSE:pMouseDown=EllipseMouse

9、Down;pMouseUp=EllipseMouseUp; pMouseMove=EllipseMouseMove;CheckMenuItem(hMenu,IDM_DRAW_LINE,MF_BYCOMMAND|MF_UNCHECKED);CheckMenuItem(hMenu,IDM_DRAW_RECTANGLE,MF_BYCOMMAND|MF_UNCHECKED);CheckMenuItem(hMenu,IDM_DRAW_ELLIPSE,MF_BYCOMMAND|MF_CHECKED);CheckMenuItem(hMenu,IDM_DRAW_CURVE,MF_BYCOMMAND|MF_UN

10、CHECKED);break;本段代碼用來實現(xiàn)橢圓這一圖形的選擇。其他圖形的選擇方法類似。1.4 圖形填充與否case IDM_DRAW_FILL:ds.bFill=!ds.bFill;if(ds.bFill)CheckMenuItem(hMenu,IDM_DRAW_FILL,MF_BYCOMMAND|MF_CHECKED);elseCheckMenuItem(hMenu,IDM_DRAW_FILL,MF_BYCOMMAND|MF_UNCHECKED);break;1.5 圖形的繪制case WM_LBUTTONDOWN:pMouseDown(&ds,hWnd,wParam,lParam);b

11、reak;case WM_MOUSEMOVE:pMouseMove(&ds,hWnd,wParam,lParam);break;case WM_LBUTTONUP:pMouseUp(&ds,hWnd,wParam,lParam);break;2 顏色的選擇case IDM_COLOR_RED:ds.icolor=RGB(255,0,0); ChangeColorWidth(ds,hMenu);break;case IDM_COLOR_GREEN:ds.icolor=RGB(0,255,0); ChangeColorWidth(ds,hMenu);break;case IDM_COLOR_BLU

12、E:ds.icolor=RGB(0,0,255); ChangeColorWidth(ds,hMenu);break;3 畫筆寬度的選擇3.1 寬度值的接收與傳遞case WM_COMMAND:if (LOWORD(wParam) = IDOK | LOWORD(wParam) = IDCANCEL)HWND hEdit=GetDlgItem(hDlg,IDC_EDITWITH);GetWindowText(hEdit,buffer,sizeof(buffer);/int a=_wtoi(buffer);/SendMessage(GetParent(hDlg),WM_CHANGWIDTH,(W

13、PARAM)0,(LPARAM)a);SendMessage(GetParent(hDlg),WM_CHANGWIDTH,(WPARAM)0,(LPARAM)buffer);EndDialog(hDlg, LOWORD(wParam);return (INT_PTR)TRUE;case WM_CHANGWIDTH:ds.PenWidth=_wtoi(WCHAR *)lParam);/ds.PenWidth=lParam; ChangeColorWidth(ds,hMenu);break;3.2 改變畫筆顏色與寬度的函數(shù)void ChangeColorWidth(DRAWSTRUCT &ds,H

14、MENU hMenu)DeleteObject(ds.hPen);DeleteObject(ds.hBr);ds.hPen=CreatePen(PS_SOLID,ds.PenWidth,ds.icolor); ds.hBr=CreateSolidBrush(ds.icolor);CheckMenuItem(hMenu,IDM_COLOR_RED,MF_BYCOMMAND|MF_CHECKED); CheckMenuItem(hMenu,IDM_COLOR_GREEN,MF_BYCOMMAND|MF_UNCHECKED); CheckMenuItem(hMenu, IDM_COLOR_BLUE,

15、MF_BYCOMMAND|MF_UNCHECKED);4 圖形的保存、打開與重繪4.1 所需用到的結(jié)構體與主要變量struct DRAWLINEPOINT ptStart,ptEnd;INT PenWidth;COLORREF icolor;typedef structRECT rect;INT PenWidth;COLORREF icolor;BOOL bFill;DRAWRECT,DRAWCIRCLE;enum SHAPESHAPELINE,SHAPERECT,SHAPECIRCLE;typedef structSHAPE shape;unionDRAWLINE DrawLine;DRAW

16、RECT DrawRect;DRAWCIRCLE DrawCircle;DRAWSHAPE;CArray graphicArray;4.2 圖形的保存case IDM_SAVE:CFile file(TEXT(shiyan.shp),CFile:modeWrite|CFile:modeCreate);CArchive ar(&file,CArchive:store);graphicArray.Serialize(ar);break;4.3 圖形的打開case IDM_OPEN:CFile file(TEXT(shiyan.shp),CFile:modeRead);CArchive ar(&fi

17、le,CArchive:load);graphicArray.Serialize(ar);SendMessage(hWnd,WM_PAINT,0,0);break;4.4 圖形的重繪case WM_PAINT:hdc = BeginPaint(hWnd, &ps);for(int i=0;igraphicArray.GetSize();i+) myshape=graphicArrayi; Paint(hWnd,myshape); EndPaint(hWnd, &ps);break;4.5 在圖形的打開與重繪時所需用到的函數(shù)void Paint(HWND hWnd,DRAWSHAPE &mysh

18、ape)HDC hdc=GetDC(hWnd); HPEN hPen,hPenOld;HBRUSH hBr,hBrOld;switch(myshape.shape)case SHAPELINE:hPen=CreatePen(PS_SOLID,myshape.DrawLine.PenWidth,myshape.DrawLine.icolor);hPenOld=(HPEN)SelectObject(hdc,hPen);MoveToEx(hdc,myshape.DrawLine.ptStart.x,myshape.DrawLine.ptStart.y,NULL); LineTo(hdc,myshap

19、e.DrawLine.ptEnd.x,myshape.DrawLine.ptEnd.y);SelectObject(hdc,hPenOld);DeleteObject(hPen);break;case SHAPERECT:hPen=CreatePen(PS_SOLID,myshape.DrawRect.PenWidth,myshape.DrawRect.icolor);hPenOld=(HPEN)SelectObject(hdc,hPen);if(myshape.DrawRect.bFill)hBr=CreateSolidBrush(myshape.DrawRect.icolor); hBrO

20、ld=(HBRUSH)SelectObject(hdc,hBr);elsehBr=(HBRUSH)GetStockObject(NULL_BRUSH);hBrOld=(HBRUSH)SelectObject(hdc,hBr);Rectangle(hdc,myshape.DrawRect.rect.left,myshape.DrawRect.rect.top,myshape.DrawRect.rect.right,myshape.DrawRect.rect.bottom);SelectObject(hdc,hPenOld);SelectObject(hdc,hBrOld);DeleteObject(hPen);DeleteObject(hBr);break;case SHAPECIRCLE:hPen=CreatePen(PS

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論