南京信息工程大學 實驗(實習)報告 實驗(實習)名稱 圖形程序設計及其應用 實驗(實習)日期 一、實驗目的 1.熟悉圖形設備接口的概念及其應用。
二、實驗內容及步驟 實驗任務 1.熟悉基于圖形應用的程序設計; 2.掌握刷新技術及其應用; 3.掌握映射模式的應用; 4.掌握繪圖工具的使用。 實驗內容 編寫一個程序,在屏幕上出現一個圓心沿正弦曲線軌跡移動的實心圓,且每隔四分之一周期,圓的填充色和圓的周邊顏色都發(fā)生變化,同時圓的半徑在四分之一周期之內由正弦曲線幅值的0.2倍至0.6倍線性增長。 程序代碼: #include<windows.h> #include<stdlib.h> #include<string.h> #include<math.h> #define Pi 3.1415926
long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam); double dfTheta=0,dfRange=100.0; long i=0,j=0; long lCentreX=0,lCentreY=0,lRadious=(long)(0.2*dfRange); POINT lpSin[100]; int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow) { HWND hwnd ; MSG Message ; WNDCLASS wndclass ; wndclass.cbClsExtra=0; //窗口類無擴展 wndclass.cbWndExtra=0; //窗口實例無擴展 wndclass.hInstance=hInstance; //當前實例句柄 wndclass.hCursor=LoadCursor(NULL,IDC_ARROW) ; //窗口采用箭頭光標 wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //窗口背景為白色 wndclass.lpszMenuName=NULL; //窗口中無菜單 wndclass.lpszClassName="SIN" ; //窗口類名為"窗口" wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //窗口的最小化圖標為缺省圖標 wndclass.lpfnWndProc=WndProc; //定義窗口處理函數 wndclass.style=0; if(!RegisterClass( &wndclass)) //如果注冊失敗則發(fā)出警告 { MessageBeep(0) ; return FALSE ; } //---------------- 創(chuàng)建窗口 ------------------- hwnd=CreateWindow( "SIN", //窗口類名 "4_6", //窗口實例的標題名 WS_OVERLAPPEDWINDOW, //窗口的風格 CW_USEDEFAULT, 0, //窗口左上角坐標為缺省值 CW_USEDEFAULT, 0, //窗口的高和寬為缺省值 NULL, //此窗口無父窗口 NULL, //此窗口無主菜單 hInstance, //創(chuàng)建此窗口的應用程序的當前句柄 NULL //不使用該值 ); //--------------- 顯示窗口 ---------------------- ShowWindow( hwnd, nCmdShow) ; //-------------- 繪制用戶區(qū) --------------------- UpdateWindow(hwnd); //--------------- 消息循環(huán) ---------------------- for(int j=0;j<100;j++) //生成正弦曲線的點坐標 { lpSin[j].x=(long)(j*2*Pi/100*60); lpSin[j].y=(long)(dfRange*sin(j*2*Pi/100)); }
while( GetMessage(&Message, 0, 0, 0)) { TranslateMessage( &Message) ; DispatchMessage( &Message) ; } return Message.wParam; //消息循環(huán)結束即程序終止時將信息返回系統(tǒng) } long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam) { HDC hDC; //定義指向設備的句柄 HBRUSH hBrush; //定義指向畫刷的句柄 HPEN hPen; //定義指向畫筆的句柄 PAINTSTRUCT PtStr;//定義指向包含繪圖信息的結構體變量 switch(iMessage) //處理消息 { case WM_PAINT: //處理繪圖消息 hDC=BeginPaint(hWnd,&PtStr); SetWindowOrgEx(hDC,-200,-200,NULL); //設置映像模式 hPen=CreatePen(PS_DASH,1,RGB(255,0,0)); //黑色畫筆 SelectObject(hDC,hPen); //選擇畫筆 Polyline(hDC,lpSin,100); if(i<=25) //第一個1/4周期 { hPen=CreatePen(PS_DASH,1,RGB(255,0,0));
hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0)); lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);//計算半徑 } else if(i<=50) { hPen=CreatePen(PS_DASH,1,RGB(0,255,0));
hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(0,255,0)); lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);//計算半徑 } else if(i<=75) { hPen=CreatePen(PS_DASH,1,RGB(0,0,255));
hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(0,0,255)); lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);//計算半徑 } else { hPen=CreatePen(PS_DASH,1,RGB(255,255,0));
hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(255,255,0)); lRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);//計算半徑 } SelectObject(hDC,hBrush); //選擇畫刷 SelectObject(hDC,hPen); lCentreX=lpSin[i].x; //圓心x坐標 lCentreY=lpSin[i].y; //圓心y坐標 Ellipse(hDC,lCentreX-lRadious,lCentreY-lRadious, lCentreX+lRadious,lCentreY+lRadious); //畫圓
i++; DeleteObject(hPen); //刪除畫筆 DeleteObject(hBrush); //刪除畫刷 EndPaint(hWnd,&PtStr); //刪除設備環(huán)境指針 Sleep(100); //停0.1秒 if(i<100) InvalidateRect(hWnd,NULL,1); //刷新用戶區(qū) return 0; case WM_DESTROY: //關閉窗口 PostQuitMessage(0); return 0; default: return(DefWindowProc(hWnd,iMessage,wParam,lParam)); } } 程序運行結果:
三、實驗結果 通過本次試驗我了解了基于圖形應用的程序設計,掌握刷新技術及其應用;學會了映射模式的應用;并且基本了解了繪圖工具的使用;進一步加深了對可視化的了解。
|
|
來自: wangprince2017 > 《C 》