當前位置:編程學習大全網 - 編程語言 - 用編程語言實現壹個正方形360°旋轉? 下面是我寫的壹個畫正方形的代碼! 我想要的是算法。要求完整代碼。

用編程語言實現壹個正方形360°旋轉? 下面是我寫的壹個畫正方形的代碼! 我想要的是算法。要求完整代碼。

WINDOWS圖像編程

--------------------------------------------------------------------------------

圖形設備接口(GDI,Graphics Device Interface)的主要目標之壹是支持在輸出設備(如視頻顯示器、打印機和繪圖儀)上的與設備無關的圖形。 GDI通過將應用程序與不同輸出設備特性相隔離,使Windows應用程序能夠毫無問題地在Windows支持的任何圖形輸出設備上運行。

Windows中的圖形基本上是由從GDI.EXE模塊中輸出的函數處理的(盡管壹些繪制函數實際上具有USER.EXE的入口點),GDI.EXE模塊調用在不同驅動程序文件中的例程,其中有壹個.DRV驅動程序文件用於控制顯示屏幕,並且可能有壹個或多個其他的.DRV驅動程序文件用來控制打印機或繪圖儀。

Windows GDI使用兩種坐標系統。使用虛擬坐標系統可以使程序不依賴於具體的硬件,使用設備坐標系統可以使程序和硬件緊密相聯。

GDI含有在Windows應用程序內部執行、且與設備無關的圖形操作函數,這些函數可產生各種各樣的線、正文和位圖,它們可以輸出到許多不同的輸出設備上。GDI允許壹個應用程序產生筆、刷子、字體和位圖,以供特定的輸出操作使用。下面列出GDI中幾組比較常用的函數:

·設備上下文函數

·橢圓和多邊形函數

·繪圖工具函數

·位圖函數

·繪圖屬性函數

·正文函救

·映射函數。

·坐標函數

·元文件(metafile)函數

·區域函數

·裁剪(clipping)函數·

窗口應用程序輸出圖形的操作步驟如下:

①取得指定窗口的當前顯示設備上下丈,顯示設備上下文實際上是壹個數據結構,它包括該窗口的參數及各種圖形、文字屬性的現行設定值,它們對以後的圖形、文字輸 出命令起控制作用。

②選擇用戶坐標系及映射方式。

③設定用戶坐標系中的觀察窗口和設備坐標系中的顯示視區。

④輸出圖形、文字和圖象。

⑤釋放所使用的顯示設備上下文。

當想要在圖形輸出設備(例如屏幕或打印機)上繪制圖形時,必須首先獲得設備上下文的句柄。先給出這個句柄,Windows才允許程序使用設備,在GDI函數中將句柄作為壹個參數傳入,向Windows標明需要使用的設備。

設備上下文中包含許多屬性,當GDI在不同的設備上工作時都要用到這些屬性。使用這些屬性可使GDI只關心起始和終止坐標的大小,而不必關心有關對象的其他屬性,如顏色、背景等等,因為這些都是設備上下文的壹部分。當需要修改這些屬性時,只需調用壹個修改設備上下文中屬性的參數,以後的程序中都使用修改後的設備上下文屬性。設備上下文是連接Windows應用程序、設備驅動程序以及輸出設備的紐帶。

獲取設備上下文句柄有多種方法。最壹般的方法是當處理壹條消息時獲得了設備上下文、並在退出窗口之前釋放它。壹般的處理方法如下:

在處理WM_PAINT消息時

case WM_PAINT:

hdc=BeginPaint(hwnd,&ps)

EndPaint (hwnd,&ps);

其數據結構為:

HDC hWnd;

PAINTSTRUCT ps;

而在windows.h中定義了PAINTSTRUCT的數據結構。

type struct tagPAINTSTRUCT {

HDC hdC;

BOOL fErase;

RECT rcPaint;

BOOL fRestore;

BOOL flncUpdate;

BYTE rgbReserved[16];

}PAINTSTRUCT;

其中,hdc用於標識顯式上下文,fErase指出背景是否重畫,rcPaint是塗色矩形,其余的域均為保留。這裏的hdc是BeginPaint返回的設備上下文句柄,有了從DeginPaint獲取的設備上下文句柄,就可以也只能在ps指出的rcPaint的矩形內繪圖,EndPaint調用使這壹區域有效。

第二種方法如下所示,使用這種方法獲取和釋放設備上下文可以在整個用戶區內畫圖,圖形在整個用戶區域內都有效:

hdC=GetDc (hwnd );

…畫圖操作…

ReleaseDC (hwnd , hdc );

使用下面第三種方法獲取和釋放設備上下文,可以在整個窗口內畫圖,圖形在整個窗口內有效:

hdC=GetWindowDc(hwnd);

…畫圖操作…

ReleaseDc(hwnd,hdc);

使用下面第四種方法獲取和釋放設備上下文,可以在整個顯示器區域內畫圖,圖形在整個顯示器區域內部有效:

hdc=CreateDC (lpszDriver ,lpszDevice ,lpszOutput , lpData);

…畫圖操作…

ReleaseDC(hdc);

其中lpszDriver指向設備驅動程序的DOS文件名(不帶擴展名),lpszDevice指向專用設備名(例如Epson Fx-80),lpszOutput指向物理輸出介質(文件或輸出端口)的DOS文件名或設備名,lpData指向含有設備驅動程序的設備專用的初始化數據的DEVMODE數據結構。例如:

hdc=CreateDC("DISPLAY",NULL,NULL,NULL);

使用屏幕畫圖,而:

hdc= CreateDC ("IBMGRX","IBM Graphics","LPT1",NULL );

在打印機上輸出圖形,這裏的lpData置為默認值,可以在WIN.INI中找到初始化值。

如果不需要獲取設備上下文,即不需要在設備上下文中操作,只需了解有關設備上下文的信息,可以用如下語句:

hdcInfo = CreateDC (lpszDriver, lpszDevice,lpszOutput, lpData );

……

DeteteDC (hdcInfo);

另外,還可以使用設備上下文來對位圖的內存進行控制,如下所示:

hdcMem = CreateCompatibleDC (hdc)

OeleteDc(hdcMem );

壹個元文件是以二進制形式編碼的GDI調用集合,可通過獲取壹個元文件設備上下文來建立壹個文件:

hdcMeta=CreateMetaFile(lpszFilename);

……

hmf=CloseMetaFile(hdCMeta);

在元文件設備上下文有效期間,使用hdcMeta所進行的任何GDI調用都成為元文件的壹部分,當調用CloseMetaFile時,設備上下文句柄變化無效,函數返回元文件(hmf)的句柄。

壹個設備上下文通常涉及物理設備,如視頻顯示器、打印機等,所以需要獲取有關該設備的信息,如顯示器大小和彩色能力等。可以通過調用GetDeviceCaps函數來獲取這樣的信息:

nValue=GetDeviceCaps (hdc,nIndex);

這裏的hdc標識設備上下文,nIndex確定返回值,它可以是window.h中所定義的28個標識符中的壹個,例如nIndex=DRIVEVERSION,則該函數返回的是版本號。

真正影響在用戶區域上繪制過程的設備上下文屬性是“映射方式”,與映射方式屬性密切相關的還有如下四個設備上下義屬性:窗口原點、視窗原點、窗口範圍和視窗範圍。

Windows定義了八種映射方式,即:

這裏的TWIP指的是1/1440英寸,in.代表英寸。

可以調用函數setMapMode(hdc,MapMode)來設置這八種映射方式中的壹種。hdc用來標識設備上下文,nMapMode可以取MM_TEXT、MM_LOMETRIC、MM_HIMETRIC等八個值中的壹個。在設置了映射方式之後,到下壹次設置映射方式之前,Windows壹直使用這種映射方式。如果想要獲取當前的映射方式,可用:

nMapMode= GetMapMode (hdc)

在設置了映射方式之後,就規定了邏輯單位的大小和增量的方式,在GDI畫圖函數中,可以不必考慮這些內容而直接使用邏輯數字,如:

SetMapMode(hdc ,MM_TEXT);

TextOut(hdc,8 ,16,szBuffer ,nLength)

即正文從用戶區域左起第八個象素,頂邊起第16個象素的位置開始寫操作。不管映射方式如何,Windows函數中所有坐標規定為-32768 到 32767之間的帶符號短整救。

註意映射方式只是壹個設備上下文屬性,因此映射方式唯壹起作用的是將映射方式作為設備上下文句柄屬性,而將該句柄當作參數的GDI函數,因此象GetSystemMetrics這樣的非GDI函數,將繼續以設備單位(象素值)返回尺寸值。

用GDI的SetPixel函數可以繪制壹特定顏色的象素:

rgbActualColor =SetPixel (hdc,x,y,rgbColor);

這裏hdc標識設備上下文,x ,y表示點坐標,rgbColor為壹無符號的長整數,其結構為:

COLORREF rgbColor;

其中低位字節為紅基色的相對亮度值,第二個字節包含綠基色的相對亮度值,第三個字節包含藍基色的相對亮度值,高位字節必須為零。可以使用RGB函數來獲取rgbColor。

rgbColor =RGB(byRed ,byGreen,byBlue);

這裏的byRed、byGreen、byBlue取值範圍為0~255,分別代表紅色、綠色、藍色的亮度。給出正確的參數之後,SetPixel返回的是調色板中最靠近所需彩色的顏色。還可以使用如下方法來取得壹個特定象素的顏色:

rgbCotor= GetPixel(hdc,x,y);

畫線函數主要有三種, LineTo、Polyline 和 Arc。還有五個設備上下文屬性會影響這些函數畫出的線的外觀:筆的當前位置(僅對LineTo有影響)、筆、背景方式(對非實心筆有影響)、背景顏色(對 OPAQUE背景方式)以及繪制方式。

在這些設備上下文的屬性中,筆的當前位置影響畫線的起點,筆影響線的粗細等形狀,背景方式影響非實心筆畫出的線的模板圖形,背景顏色影響線模板背景色,繪制方式影響實心線、虛線等線屬性。

以下是典型的畫線操作步驟:

MoveTo(hdc,xStart,yStart);

LineTo(hdc ,xEnd ,yEnd);

上面兩句畫出壹條從(xStart,yStart)到(xEnd,yEnd)的直線。

可以使用語句:

dwPoint = GetCurrentPosition (hdc);

獲得筆的當前位置。這裏,dwPoint返回值是壹個無符號長整數(或雙倍長字),其中低位字含有X坐標,高位字含有Y坐標。

可以使用MAKEPOINT函數將dwPoint轉換為POINT結構;

point = MAKEPOINT (dwPoint);

point的類型為POINT:

typedef struct togPOINT {kk1}

int x;

int y;

}POINT;

Polyline用於繪制折線,例:

Polyline(hdc,&pt,5)

將數組pt中的5個點之間用線段相連。

Arc用於畫橢圓的周邊:

Arc (hdc,xLeft,yTop,xRight,yBottom,xStart,yStart,XEnd,yEnd );

畫出的橢圓以左上角為(xLeft,yTop),右下角為(xRight,yBottom)的矩形為界,圓弧開始於橢圓和(xStart,yStart)與橢圓中心的連線的交點處,沿著橢圓周邊的過時針方向繪制,並終止於橢圓和(xEnd,yEnd)與橢圓中小的連線的交點處。

當調用LineTo、Polyline和Arc時,Windows使用當前在設備上下文中選擇的筆來畫線,筆決定了線的顏色、密度和型式,而線型可以是實線、點線或短劃(虛)線,缺省設備上下文中的筆叫做BLACK_PEN,不管映射方式如何選支筆以壹個象素的寬度畫黑色的實線, BLACK_PEN是Windows提供的三支“備用筆”之壹,其他兩支是WHITE_PEN和NULL_PEN,NULL_PEN是壹支什麽都不畫的空筆,當然用戶也可以自己建立定制的筆。

可以通過壹個句柄來引用所需的筆:

HPEN hPen;

hPen =GetStockObject(WHITE_PEN);

SelectObjeCt (hdc ,hPen) ;

SelectObject (hdc , hBrush ) ;

將邏輯刷送入設備上下文中。如果使用結束,可以用:

DeletObject (hBrush ) ;

刪除壹把已建立的刷子,如果在程序中需要獲取有關於刷子的信息,則可以調用:

3.像素格式結構

每個OpenGL顯示設備都支持壹種指定的像素格式。壹般用壹個名為PIXELFORMATDESCRIPTOR的結構來表示某個特殊的像素格式,這個結構包含26個屬性信息。Win32定義PIXELFORMATDESCRIPTOR如下所示:

typedef struct tagPIXELFORMATDESCRIPTOR

{ kk1}

// pfd

WORD nSize;

WORD nVersion;

DWORD dwFlags;

BYTE iPixelType;

BYTE cColorBits;

BYTE cRedBits;

BYTE cRedShift;

BYTE cGreenBits;

BYTE cGreenShift;

BYTE cBlueBits;

BYTE cBlueShift;

BYTE cAlphaBits;

BYTE cAlphaShift;

BYTE cAccumBits;

BYTE cAccumRedBits;

BYTE cAccumGreenBits;

BYTE cAccumBlueBits;

BYTE cAccumAlphaBits;

BYTE cDepthBits;

BYTE cStencilBits;

BYTE cAuxBuffers;

BYTE iLayerType;

BYTE bReserved;

DWORD dwLayerMask;

DWORD dwVisibleMask;

DWORD dwDamageMask;

} PIXELFORMATDESCRIPTOR;

4.初始化PIXELFORMATDESCRIPTOR結構

PIXELFORMATDESCRIPTOR中每個變量值的具體含義和設置可以參考有關資料,下面舉出壹個PIXELFORMATDESCRIPTOR初始化例子來簡要說明相關變量的意義。定義PIXELFORMATDESCRIPTOR結構的pfd如下:

PIXELFORMATDESCRIPTOR pfd = { kk1}

sizeof(PIXELFORMATDESCRIPTOR), . //size of this pfd 1

PFD_DRAW_TO_WINDOW| // support window

PFD_SUPPORT_OPENGL| // support OpenGL

PFD_DOUBLEBUFFER, // double buffered

PFD_TYPE_RGBA, // RGBA type

24, // 24-bit color depth

0,0,0,0,0,0, // color bits ignored

0, // no alpha buffer

0, // shift bit ignored

0, // no accumulation buff

0,0,0,0, // accum bits ignored

32, // 32-bit z-buffer

0, // no stencil buffer

0, // no auxiliary buffer

PFD_MAIN_PLANE, // main layer

0, // reserved

0,0,0 // layer masks ignored

};

在這個結構裏,前兩個變量的含義十分明顯。第三個變量dwFlags的值是

PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL ,

表明應用程序使用OpenGL函數來繪制窗口

第四個:

PFD_DOUBLEBUFFER,

表明當前采用RGBA顏色模式,第五個采用24位真彩色,既1.67千萬種顏色,如果是256色系統則自動實現顏色抖動;因為沒有使用alpha緩存和累計緩存,所以從變量cAlphaBits到cAccumAlphaBits都設置為0;深度緩存設置為32位,這個緩存能解決三維場景的消隱問題;變量cAuxBuffers設置為0,在Windows 95下不支持輔助緩存;Windows 95下針對OpenGL變量ilayerType只能設置為PFD_MAIN_PLANE,但在其它平臺也許支持PFD_MAIN_PLANE或PFD_MAIN_UNDERLAYPLANE;接下來bReserved變量只能設為0,而最後三個變量Windows 95都不支持,故全設置為0

  • 上一篇:我用frontpage編的網頁非常亂,請高手幫幫忙!好嗎!有懸賞喲!
  • 下一篇:海南省商業學校專業有哪些?專業介紹
  • copyright 2024編程學習大全網