第四章 Windows的圖形裝置介面及Windows繪圖 P83 4-6

來源:互聯網
上載者:User

標籤:刪除   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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.