Visual C++實現 沿正弦…

#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,m=99;
long lCentreX=0,lCentreY=0,lRadious=(long)(0.2*dfRange);
//定義圓心座標和圓座標.
POINT lpSin[100]; //定義正弦曲線的點座標.

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) //主函數
{
MSG Message; //定義消息變量.
HWND hWnd; //定義窗口句柄.

WNDCLASS WndClass; //定義窗口類.
WndClass.cbClsExtra=0; //無窗口類擴展.
WndClass.cbWndExtra=0; //無窗口實例擴展.
WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));//背景爲白色.
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); //窗口採用箭頭光標.
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //採用缺省圖標.
WndClass.hInstance=hInstance; //當前應用程序句柄.
WndClass.lpfnWndProc=WndProc; //窗口處理函數.
WndClass.lpszClassName="SIN"; //窗口類名稱.
WndClass.lpszMenuName=NULL; //無窗口菜單.
WndClass.style=0; //窗口類型爲缺省類型.

if(!RegisterClass(&WndClass)) //註冊窗口.
{
MessageBeep(0);
return FALSE;
}
hWnd=CreateWindow("SIN", //窗口類名.
"沿正弦曲線往復運動的變化圓", //標題名.
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); //設置原點座標爲(-200,-200).
hPen=CreatePen(PS_INSIDEFRAME,1,RGB(255,0,0)); //創新畫筆.
SelectObject(hDC,hPen); //選入畫筆.
Polyline(hDC,lpSin,100); //繪製正弦曲線.
        if(i==199) {i=0;m=99;}
if(i<100)
{
if(i<=25) //第一個1/4週期.
{
hPen=CreatePen(PS_INSIDEFRAME,1,RGB(255,0,0));//創新紅筆.
hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0));//創新紅畫刷.
lRadious=(long)(dfRange*0.2+i%*dfRange*0.4/25);//計算半徑.
}
   else if(i<=50)//第二個1/4週期.
{
hPen=CreatePen(PS_INSIDEFRAME,1,RGB(0,255,0));//創新綠筆.
hBrush=CreateHatchBrush(HS_DIAGCROSS,RGB(0,255,0));//創新綠刷.
lRadious=(long)(dfRange*0.2+i%*dfRange*0.4/25);//計算半徑.
}
   else if(i<=75)//第三個週期.
{
hPen=CreatePen(PS_INSIDEFRAME,1,RGB(0,0,255));//創新藍筆
hBrush=CreateHatchBrush(HS_CROSS,RGB(0,0,255));//創新藍刷.
lRadious=(long)(dfRange*0.2+i%*dfRange*0.4/25);//計算半徑.
}
   else//第四個週期.
{
hPen=CreatePen(PS_INSIDEFRAME,1,RGB(255,255,0));//創新黃筆
hBrush=CreateHatchBrush(HS_VERTICAL,RGB(255,255,0));//創新黃刷.
lRadious=(long)(dfRange*0.2+i%*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++;
}
        else
{
if(m<=25) //第一個1/4週期.
{
hPen=CreatePen(PS_INSIDEFRAME,1,RGB(255,0,0));//創新紅筆.
hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0));//創新紅畫刷.
lRadious=(long)(dfRange*0.2+m%*dfRange*0.4/25);//計算半徑.
}
   else if(m<=50)//第二個1/4週期.
{
hPen=CreatePen(PS_INSIDEFRAME,1,RGB(0,255,0));//創新綠筆.
hBrush=CreateHatchBrush(HS_DIAGCROSS,RGB(0,255,0));//創新綠刷.
lRadious=(long)(dfRange*0.2+m%*dfRange*0.4/25);//計算半徑.
}
   else if(m<=75)//第三個週期.
{
hPen=CreatePen(PS_INSIDEFRAME,1,RGB(0,0,255));//創新藍筆
hBrush=CreateHatchBrush(HS_CROSS,RGB(0,0,255));//創新藍刷.
lRadious=(long)(dfRange*0.2+m%*dfRange*0.4/25);//計算半徑.
}
   else//第四個週期.
{
hPen=CreatePen(PS_INSIDEFRAME,1,RGB(255,255,0));//創新黃筆
hBrush=CreateHatchBrush(HS_VERTICAL,RGB(255,255,0));//創新黃刷.
lRadious=(long)(dfRange*0.2+m%*dfRange*0.4/25);//計算半徑.
}
SelectObject(hDC,hBrush); //選入畫刷.
SelectObject(hDC,hPen); //選入畫筆.
lCentreX=lpSin[m].x; //圓心x座標.
lCentreY=lpSin[m].y; //圓心y座標.
Ellipse(hDC,lCentreX-lRadious,lCentreY-lRadious,lCentreX+lRadious,lCentreY+lRadious); //畫圓.
i++;
m--;
}
DeleteObject(hPen); //刪除畫筆.
DeleteObject(hBrush); //刪除畫刷.
EndPaint(hWnd,&PtStr); //刪除設備環境指針.
Sleep(80); //停0.08秒.
if(i<200) InvalidateRect(hWnd,NULL,1); //刷新用戶區.
return 0;
case WM_DESTROY: //關閉窗口.
PostQuitMessage(0);
return 0;
default:
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
}
發佈了54 篇原創文章 · 獲贊 3 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章