標籤:刪除 windows 變數 message 分享 程式設計 fine nap return
實驗(實習)名稱 圖形程式設計及其應用 實驗(實習)日期
一、實驗目的
1.熟悉圖形裝置介面的概念及其應用。
二、實驗內容及步驟
實驗任務
1.熟悉基於圖形應用的程式設計;
2.掌握重新整理技術及其應用;
3.掌握映射模式的應用;
4.掌握繪圖工具的使用。
實驗內容
編寫一個程式,在螢幕上出現一個圓心沿正弦曲線軌跡移動的實心圓,且每隔四分之一周期,圓的填充色和圓的周邊顏色都發生變化,同時圓的半徑在四分之一周期之內由正弦曲線幅值的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)) //如果註冊失敗則發出警告
{ MessageBeep(0) ;
return FALSE ;
}
//---------------- 建立視窗 -------------------
hwnd=CreateWindow(
"SIN", //視窗類別名
"4_6", //視窗執行個體的標題名
WS_OVERLAPPEDWINDOW, //視窗的風格
CW_USEDEFAULT,
0, //視窗左上方座標為預設值
CW_USEDEFAULT,
0, //視窗的高和寬為預設值
NULL, //此視窗無父視窗
NULL, //此視窗無主菜單
hInstance, //建立此視窗的應用程式的當前控制代碼
NULL //不使用該值
);
//--------------- 顯示視窗 ----------------------
ShowWindow( hwnd, nCmdShow) ;
//-------------- 繪製使用者區 ---------------------
UpdateWindow(hwnd);
//--------------- 訊息迴圈 ----------------------
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; //訊息迴圈結束即程式終止時將資訊返回系統
}
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); //刪除裝置環境指標
Sleep(100); //停0.1秒
if(i<100) InvalidateRect(hWnd,NULL,1); //重新整理使用者區
return 0;
case WM_DESTROY: //關閉視窗
PostQuitMessage(0);
return 0;
default:
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
}
程式運行結果:
三、實驗結果
通過本次實驗我瞭解了基於圖形應用的程式設計,掌握重新整理技術及其應用;學會了映射模式的應用;並且基本瞭解了繪圖工具的使用;進一步加深了對可視化的瞭解。
第四章 Windows的圖形裝置介面及Windows繪圖 P83 4-6