windows圖形編程基礎

來源:互聯網
上載者:User
2010-08-30 17:13
   圖形裝置介面(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定義了八種映射方式。可以調用函數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) ;
  調用GetStockObject獲得一支備用筆(WHITE_PEN)的控制代碼,調用SelectObject
  
  使這支筆成為裝置上下文中當前選擇的用CreatePen或CreatePenIndirect函數建立一支“邏輯筆”,這邏輯筆只是一支筆的描述。
  hPen = CreatePen (nPenStyle ,nWidth ,rgbColor );
  其中nPenStyle參數確定筆是繪製實線還是由點或短劃組成的線。該參數可取下列標識符之一: PS_SOLID、PS_DASH、Ps_DOT、PS_DASHDOT、 PS_DASHDOT DOT。nWidth表示筆寬(採用邏輯單位),rgbColor表示筆的顏色,如果函數執行成功,則傳回值標識一支邏輯筆,否則傳回值為NULL。
  
  另外還有一種方法來建立邏輯筆:
  typedef struct tagLOGPEN { kk1}
  POINT lopnWidth;
  COLORREF lopnColor;
  }LOGPEN;
  以上是Windows. h中對LOGPEN結構的定義。lopnStyle規定筆的型式,lopnWidth規定筆的寬度,lopnColor規定筆的顏色。然後將logpen定義為LOGPEN類型:
  LOGPEN logpen;
  再使用
  hPen = CreatePenlndirect (&logpen);
  就可以建立自訂的筆了。
  因為用以上兩種方式建立的筆不是裝置上下文有關的,所以可以同時建立多支筆,
  
  並用多支筆畫圖。
  hpenl =CreatePen(PS_SOLID,1,0L);
  hpen2=CreatePen(PS_SOLID,3,RGB(255,0,255)),
  selectObject (hdc ,hpenl )
  //LineTo調用
  SelectObject (hdc , hpen2 )
  //Polyline調用
  DeleteObject(hpenl);
  DeleteObject(hpen2);
  在點線筆和短劃筆的空隙間的著色取決於裝置上下文中定義的背景方式和背景顏色這兩種屬性。預設的背景方式是 OPAQUE ,即用背景顏色來填充空隙,缺
  
  省的背景顏色是白色。可用:
  SetBkColor (hdc,rgbColor );
  來改變填充空隙的背景顏色。可用:
  SetBkMode(hdc,mode);
  來改變背景方式,這裡的mode可為OPAQUE或TRANSPARENT。
  在裝置上下文中可設定口種新的繪製方式。nDrawMode參數定義繪製方式。可用下列函數獲得當前繪製方式:
  nDrowMode = GetRop2 (hdc);
  使用這種繪製方式實際上是在筆的象素和目標顯示表面的象素之間執行一種逐位布爾運算。
  下面列出了Windows的六個函數,用於繪製帶有邊框的填充地區:
  
  Rectangle, 帶有方形角的矩形
  Ellipse, 橢圓
  RoundRect, 帶有圓形角的矩形
  Chord, 在橢圓周邊上的弧,其斷 . 點用一條弦相串連
  Pie, 在橢圓周邊上的餅形楔
  Polygon, 多邊形
  PolyPolygon, 多個多邊形
  圖形要用裝置上下文中選擇的當前刷子進行填充, 例:
  HBRUSH hBrush;
  hBrush=GetStockObject(GRAY_BRUSH)
  SelectObject (hdc,hBrush)
  對於矩形填充對象,使用:
  Rectangle(hdc,xLeft,yTop,xRight,yBottom);
  
  點(xLeft,yTop)是矩形的左上方,而(xRight,yBottom)是右下角(這兩點均以邏輯座標給出)。同時還要考慮這兩點座標的合理性,例如,在MM_TEXT映射方式下,xRight必須大於xLeft,yBottom必須大於yTop。
  對於橢圓填充對象,使用:
  Ellipse(hdc,xLeft,yTop,xRight,yBottom);
  畫圓角矩形的填充對象,使用:
  RoundRect (hdc,xLeft,yTop,xRight,yBottom,xCornerEllipse,yCornerEllipse);
  rgbColor為指定刷子的前景顏色,即陰影線的顏色。
  
  ③第三種方法:
  hBrush = CreatePatternBrush ( hBitmap ) ;
  本函數建立一把具有由hBitmap參數指定圖案的邏輯刷子,該刷子以後可被任何支援光柵操作的裝置所選用。hBitmap標識位元影像,該位元影像可用函數CreateBitmap、CreateBitmapIndirect、LoadBitmap或CreateCompatibleBitmap建立。用於填充圖案的位元影像的最小尺寸為8×8。
  ④第四種方法:
  hBrush = CreateBrushIndirect ( &logbrush )
  變數logbrush為一個LOGBRUSH(“邏輯刷”)類型的結構。建立了邏輯刷子之後,
  
  可以使用:
  SelectObject (hdc , hBrush ) ;
  將邏輯刷送入裝置上下文中。如果使用結束,可以用:
  DeletObject (hBrush ) ;
  刪除一把已建立的刷子,如果在程式中需要擷取有關於刷子的資訊,則可以調用:
  GetObject (hBrush , sizeof (LOGBRUSH ) , (LPSTR ) & (logBrush ) ) ;
  其中logbrush為一個LOGBRUSH類型的結構。
  前面提到使用位元影像作為邏輯刷子的圖案,這樣就需要一個位元影像的控制代碼。位元影像必須至少是8象素高和8象素寬,如果位元影像太大,Windows就取位元影像的左上部分作為刷子。擷取位元影像控制代碼也有四種方法。
  ①擷取位元影像控制代碼的第一種方法是:
  首先用Windows提供的SDKPAINT產生一個位元影像檔案(副檔名為.BMP),並把文
  件名包括在資源檔(.rc檔案)中的一個BITMAP語句中,如:
  lpszBitmap BITMAP " BitmOPName.Bmp"
  (假設SDKPAINT中產生的位元影像名為BitmapName.Bmp),然後將位元影像裝入:
  hBitmap = LoadBitmap (hInstance , lpszBitmap ) ;
  這裡hBitmap即為位元影像控制代碼。
  ②第二種擷取位元影像控制代碼的方法是:
  hBitmap= createBitmop(nWidth,nHeight ,nPlanes ,nBitsPixel,lpBits);
  
  本函數可產生一個具有指定的寬度、高度和位元影像案(bit pattern)並與裝置有關的記憶體位元影像。其中的參數nWidth指定位元影像的寬度(以象素為單位),nHeight指定位元影像的高度(也以象素為單位),nPlanes指定位元影像中的彩色位平面的個數,每個彩色位平面有nWidthXnHeight XnBitsPixel位。
  nBitsPixel指定每個顯示象素的顏色位元。lpBits指向一個含有初始位元影像位值的短整型數組,它的值與BITMAP結構中的bmBits值相類似,有關BITMAP結構的內容已在前面的章節中提到。
  
  ③第三種擷取位元影像控制代碼的方法:
  hBitmap= CreateCompatibleBitmap (hdc,nWidth,nHeight);
  本函數產生一個與由hdc參數指定的裝置相相容的位元影像,此位元影像具有與其他裝置相同數值的彩色位平面或相同的每象素位元的格式。它的彩色資訊同樣由hdc指定的裝置所確定。hdc標識裝置上下文,nWidth和nHeight分別指定位元影像的寬和高(以位元表示)。
  ④第四種擷取位元影像控制代碼的方法:
  hBitmop = CreateBitmapIndirect (&bitmap):
  本函數產生一個具有由lpBitmap參數所指定的資料結構給出的寬度、高度和位元影像圖案的位元影像。這裡的bitmap的結構為BITMAP類型。
  當擁有一個位元影像控制代碼之後,還可以調用:
  GetObject(hBitmap,sizeof(BITMAP),(LPSTR)&bitmap);
  來獲得有關位元影像的資訊,這裡返回的bitmap為一個BITMAP類型的結構。
  還可以調用:
  GetBitmapBits (hBitmap,dwCount,lpBits);
  將位元影像hBitmap的dwCount個位元組複製到地址為lpBits的數組中。同樣還可以使用SetBitmopBits (hBitmap,dwCount,lpBits);將 lpBits 標識的彩色位值放置到 hBitmap 標識的位元影像中去。
  
  當Windows用刷子填充一個地區時,它在水平和垂直兩個方向上重複地使用8×8位元影像,刷子的外觀可能會有細微的變化,這取決於Windows如何將位元影像的左上方與顯示表面對齊,裝置上下文中將這種對齊的屬性稱為“刷子原點”。大多數情況下,繪圖時不必如此精細地調整刷子原點;但在某種情況下,為了產生某種特定的視覺效果,需要這麼做。可以通過下面步驟來達到這個效果:
  ①對刷子調用UnrealizeObject(但不能對備用刷子調用UnrealizeObject);
  UnrealizeObject(hObject );
  
  此函數表示GDI在下次給定的刷子被選中時,使它的原點複位。
  ②用SetBrushOrg設定刷子原點:
  BrushOrg=SetBrushOrg(hDc,x ,y);。
  此函數用於設定當前選人給定的裝置上下文中的刷子的原點。其中,hDc標識裝置上下文,x規定新原點的x 座標(採用裝置座標),該值範圍必須在0~7之間,y規定新原點的y座標(採用裝置座標),該值範圍必須在0~7之間,該函數返回一個雙字,先前的x座標放在低位字,先前的y座標放在高位字。
  除了畫點、畫線、地區填充這些繪圖函數之外,Windows還包括幾個附加的繪
  
  圖函數,用以處理RECT(矩形)結構和“地區”,地區是螢幕的一個由矩形、其他多邊形和橢圓組合而成的部分。
  FillRect(hdc ,&rect,hBrush);
  此函數是用選定的刷子填充給定的矩形,FillRect函數填充整個矩形,還包括左邊線和頂邊線,但不包括右邊線和底邊線。hdc標識裝置上下文,rect為RECT資料結構類型,此資料結構存放要填充的矩形的邏輯座標。hBrush用來標識填充此矩形的刷子。
  FrameRect (hdc ,&rect);
  本函數在 lpRect 參數指定的矩形周圍畫出一個邊框,FrameRect 函數採用給定的刷子繪製邊框,邊框的高和寬總是用邏輯單位表示。hdc標識視窗的裝置上下文, rect 標明左上方和右下角的邏輯座標,hBrush標識畫矩形邊框用的刷子。InvertRect (hdc,&rect);
  該函數反視頻顯示給定矩形的內容。
  前面提到的rect可用以下語句取得:
  SetRect(&rect,xLeft,yTop,xRight,yBottom);
  地區用以描述顯示器上的一個由矩形、其他多邊形和橢圓組合而成的部分、可以用地區進行繪製或裁剪。
  可用:
  hRgn=CreateRgn(xLeft,yTop,xRight,yBottom);
  
  或
  hRgn = CreateRectRgnIndirect (&rect );
  來建立矩形地區,也可以用:
  hRgn= CreatEllipseRgn (xLeft,yTop,xRight,yBOttom);
  或:
  hRgn =CreateEllipseRgnIndirect (&rect);
  來建立橢圓形地區;還可以用:
  hRgn=CreatePolygonRgn (Upoint,nCount,nPolyFillMode);
  來建立多邊形地區,用:
  hRgn=CreateRoundRectRgn(xl,yl,x2,y2,x3,y3);
  來建立一個帶有圓角的矩形地區,(xl,y1)表示地區左上方,(x2,y2)表示地區右下角,x3和y3分別用於指定產生圓角的橢圓的寬度和高度。
  各個特定地區的控制代碼產生之後,還可以使用:
  nRgnType= CombineRgn (hDestRgn,hSrcRgnl,hSrcRgn2,nCombine);
  通過組合兩個已存在地區而產生一個新的地區。組合地區的方法由nCombine參數加以說明:
  這裡的hSrcRgnl和hSrcRgn2標識兩個已存在的地區,hDestRgn標識將被新地區替換的作為目標的已存在地區。
  一個地區用完後,可用DeleteObject(hRgn)刪除它。
  FloodFiLL (hdc,xStart,yStart,rgbColor);
  
  本函數用當前刷子填充顯示表面的一個地區,該地區假定由rgbColor多數指定的顏色邊界確定,FloodFill函數由xStart,yStart參數指定的,點開始向各個方向進行填充,直到顏色邊界為止。
  ExtFLoodFill(hdc,xStart,yStart,rgbColor,wFill );
  此函數用當前刷子填充顯示表面上的某一地區,若wFill被設定成FLOODFILLBORDER,
  此地區將完全用rgbColor設定的顏色作為邊界,ExtFloodFill從(xStart,yStart點開始向各個方向填充,直到該顏色邊界為止。若wFill被設定成FLOODFILLSURFACE,
  
  則ExtFLOODFILL函數從(xStart,yStart)點開始,向各個方向對所有包含由rgbColor參數設定的顏色的相鄰地區進行填充。
  DrowIcon(hdc,xStort,yStart,hIcon) ;
  本函數在指定裝置上畫一個表徵圖。(xStart,yStart)為表徵圖的左上方,hIcon標識要畫的表徵圖,它與hBitmap一樣,可以由SDKPAINT畫出,在. rc檔案中定義,用LoadIcon獲得。
  ScrollWindow (hwnd,xScroll,yScroll,&rectScroll,&rectClip) ;
  本函數通過移動一個視窗使用者地區的內容來滾動該視窗,沿X軸移動xScroll個單位,
  
  沿Y軸移動yScroll個單位,rectScroll表示使用者地區要滾動的那一部分內容,
  rectClip表示要滾動的裁剪矩形。
  ScrollDC(hdc,dx,dy,lprcScroll,lprcClip, hrgnUpdate,lprcUpdate);
  此函數水平地和垂直地滾動由位構成的矩形。lprcScroll指向要滾動的矩形,dx表示水平滾動單位,dy表示垂直滾動單位,lprcClip指向裁剪矩形,hrgnUpdate返復原動過程沒有覆蓋的地區,lprcUpdate返回需要重畫的最大矩形地區。
  OpenGL是近幾年發展起來的一個效能卓越的三維圖形標準,它是在SGI等多家 世界聞名的電腦公司的倡導下,以SGI的GL三維圖形庫為基礎制定的一個通用共用的開放式三維圖形標準。目前,包括Microsoft、SGI、IBM、DEC、SUN、HP等大公司都採用了OpenGL做為三維圖形標準,許多軟體廠商也紛紛以OpenGL 為基礎開發出自己的產品,其中比較著名的產品包括動畫製作軟體Soft Image 和3D Studio MAX、模擬軟體Open Inventor、VR軟體World Tool Kit、CAM軟體ProEngineer、GIS軟ARC/INFO等等。值得一提的是,隨著Microsoft公司在Windows NT和最新的Windows 95中提供了OpenGL標準及OpenGL三維圖形加速卡(如北京黎明電子技術公司的AGC-3D系列三維圖形加速卡)的推出,OpenGL將在微機中有廣泛地應用,同時也為廣大使用者提供了在微機上使用以前只能在高效能圖形工作站上啟動並執行各種軟體的機會。
  OpenGL實際上是一個開放的三維圖形軟體包,它獨立於視窗系統和作業系統,以它為基礎開發的應用程式可以十分方便地在各種平台間移植;OpenGL可以與Visual C++緊密介面,便於實現機械手的有關計算和圖形演算法,可保證演算法的正確性和可靠性。
  OpenGL使用簡便,效率高。它具有七大功能:
  
  1) 建模 OpenGL圖形庫除了提供基本的點、線、多邊形的繪製函數外,還提供了複雜的三維物體(球、錐、多面體、茶壺等)以及複雜曲線和曲面 (如Bezier、Nurbs等曲線或曲面)繪製函數。
  2) 變換 OpenGL圖形庫的變換包括基本變換和投影變換。基本變換有平移、旋轉、變比鏡像四種變換,投影變換有平行投影(又稱正射投影)和透視投影兩種變換。其變換方法與機器人運動學中的座標變換方法完全一致,有利於減少演算法的已耗用時間,提高三維圖形的顯示速度。
  3) 顏色模式設定 OpenGL顏色模式有兩種,即RGBA模式和色彩索引(Color Index)。
  4) 光照和材質設定OpenGL光有輻射光(Emitted Light)、環境光線(Ambient Light)、漫反射光(Diffuse Light)和鏡面光(Specular Light)。材質是用光反射率來表示。情境(Scene)中物體最終反映到人眼的顏色是光的紅綠藍分量與材質紅綠藍分量的反射率相乘後形成的顏色。
  5) 紋理映射(Texture Mapping) 利用OpenGL紋理映射功能可以十分逼真地表達物體表面細節。
  6) 位元影像顯示和圖象增強 圖象功能除了基本的拷貝和像素讀寫外,還提供融合(Blending)、反走樣(Antialiasing)和霧(fog)的特殊圖象效果處理。以上這三條可使被模擬物更具真實感,增強圖形顯示的效果。
  7) 雙緩衝(Double Buffering)動畫 雙緩衝即前台緩衝和後台緩衝,簡而言之,後台緩衝計算情境、產生畫面,前台緩衝顯示後台緩衝已畫好的畫面。此外,利用OpenGL還能實現深度暗示(Depth Cue)、移動模糊(Motion Blur)等特殊效果。從而實現了消隱演算法。OpenGL圖形庫一共有100多個函數。其中核心函數有115個,它們是最基本的函數,
  
  其首碼是gl,OpenGL實用庫(OpenGL utility library , GLU)的函數功能更高一些,如繪製複雜的曲線曲面、進階座標變換、多邊形分割等,共有43個,首碼為glu;OpenGL輔助庫(OpenGL auxiliary library ,GLAUX)的函數是一些特殊的函數,包括簡單的視窗管理、輸入事件處理、某些複雜三維物體繪製等函數,共有31個,首碼為aux。
  此外,還有六個WGL函數非常重要,專門用於OpenGL和Windows 95視窗系統的聯結,其首碼為wgl,主要用於建立和選擇圖形操作描述表(rendering contexts)以及在視窗內任一位置顯示字元位元影像。這些功能是Windows 95 對OpenGL的唯一補充。另外,還有五個Win32函數用來處理像素格式(pixel formats)和雙緩衝。由於它們是對Win32系統的擴充,因此不能應用在其它OpenGL平台上。
  OpenGL for Windows 95的設計與OpenGL for UNIX的程式設計有一點小區別,關鍵就在於如何將OpenGL與不同的作業系統下的視窗系統聯絡起來。如果調用OpenGL輔助庫視窗管理函數,則不用考慮這些問題。下面簡要介紹在Windows 95下 OpenGL 的程式設計關鍵。
  
  1.圖形操作描述
  在Windows 95下視窗程序必須首先處理裝置描述表(Device Contexts ,DC),DC包括許多如何在視窗上顯示圖形的資訊,既指定畫筆和刷子的顏色,設定繪圖模式、調色盤、映射模式以及其它圖形屬性。同樣,OpenGL for Windows 95的程式也必須使用DC,這與其它Windows 95程式類似。但是,OpenGL forWindows 95必須處理特殊的DC圖形操作描述表,這是DC中專為OpenGL使用的一種。一個OpenGL應用圖形操作描述表內有OpenGL與Windows 95視窗系統相關的各種資訊。一個OpenGL應用首先必須建立一個圖形操作描述表,然後再啟動它,最後在所定義的視窗內按常規方式調用OpenGL函數繪製圖形。一個圖形操作描述表不同於其它DC,它們調用每個GDI函數都需要一個控制代碼,而圖形操作描述表方式下只需一個控制代碼就可以任意調用OpenGL函數。也就是說,只要當前啟用了某個圖形操作描述表,那麼在未刪除圖形操作描述表之前可以調用任何OpenGL函數,進行各種操作。
  2.像素格式
  在建立一個圖形動作表之前,首先必須設定像素格式。像素格式含有裝置繪圖介面的屬性,這些屬性包括繪圖介面是用RGBA模式還是顏色表模式,像素緩衝是用單緩衝還是雙緩衝,以及顏色位元、深度緩衝和模板緩衝所用的位元,還有其它一些屬性資訊。
  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函數來繪製窗

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.