国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

在CB中進行DirectX編程(1)

2019-11-17 05:28:51
字體:
來源:轉載
供稿:網友

  C++ Builder是一個可視化的C++編程環境,它為編程人員提供了一種方便高效、簡便的C++語言開發工具,因此已為廣大C++程序員所青睞,DirectX開發工具包是微軟公司提供的一套Windows9X下開發高性能圖形、聲音、輸入輸出和網絡游戲的接口,其高效的直接硬件訪問、程序與硬件設備之間的相對獨立等特性,幾乎使得DirectX成為唯一可以在Windows操作系統下開發游戲程序的基本工具軟件。
雖然C++ Builder中直接包含了一套DirectX3的開發包,也提供了一些例程,但是這些例程沒有系統化的說明,同時也不適合DirectX5以上的程序開發。另一方面,幾乎所有關于DirectX開發的書籍和文獻均使用Visual C++語言描述,所以作者將自己在C++ Builder中的一些開發經驗介紹給讀者。

本文適合具備C++ Builder面向對象編程經驗的讀者,實例開發環境為中文Windows98、C++ Builder4、DirectX6或以上的開發工具包。

一.DirectX簡介

1_1.DirectX的特性

1_2.DirectX是一種Windows環境下標準的高性能游戲、多媒體開發工具包,使用DirectX開發的程序能夠與操作系統默契地配合成為“真正”的桌面應用程序;可以利用硬件廠商提供的驅動程序接口,充分最佳的設備性能;通過直接底層硬件操作,實現最快速、短延時、設備無關的底層接口。

1_3.DirectX采用了組件對象模型(COM)標準,因此對于不同對象的版本可以有不同的接口,這使得用DirectX開發的程序在未來將得到完全兼容和支持的保證。

1_4.DirectX的結構

DirectX需要以設備無關的方法提供設備相關的性能,所以DirectX的結構是由兩個驅動程序構成:硬件抽象層(HAL)和硬件模擬層(HEL),當Direct對象創建時,會同時建立一張“兼容表”,其中記錄了當前硬件系統支持的功能,當DirectX需要實現某個功能時就查詢該表,得到硬件對功能的支持信息,假如功能能夠得到硬件支持,則向HAL發出求,以得到硬件的支持,否則向HEL發出請求,以模擬方式實現功能。

1_5.DirectX的主要組成

 

(1)DirectDraw:直接訪問圖形硬件,治理用于顯示的內存(顯示內存和系統內存),提供高速圖形和頁面切換動畫;

(2)Direct3D:提供3D硬件接口;

(3)DirectInput:主要支持輸入服務,同時支持輸出設備;

(4)DirectSound:提供3D聲音效果,治理聲卡內存;

(5)DirectPlay:提供網絡多人游戲的通訊、組織功能;

(6)DirectSetup:自動安裝DirectX驅動程序。

本文將按照DirectX的上述組成,分別以實例介紹其在C++ Builder中的實現方法。

 

 

二.DirectDraw程序設計

 

2.1 DirectDraw實現的基礎—顯示方式的設置

設計圖形程序首先碰到的問題是將屏幕設置成一種合適的圖形顯示方式,然后把圖形繪畫到屏幕頁面上。假如您在DOS下開發圖形應用程序,這將是很簡單的事,只要調用DOS的中斷服務程序即可實現,但是使用用DirectDraw就比較復雜。由于DirectDraw的設計目標是提供設備無關的編程接口和高效、多功能的硬件訪問支持,所以DirectDraw需要考慮更多的問題。

DirectDraw在Windows環境下支持兩種圖形方式:全屏幕獨占方式和窗口方式。這里我先以全屏幕獨占方式,介紹DirectDraw設置屏幕顯示方式步驟,函數具體使用格式和編程方法將在2.2中介紹:

2.1.1 選擇硬件設備

計算機系統不一定只有一個DirectDraw硬件抽象設備,例如,一臺計算機可能有兩臺或更多的顯示器,那么DirectDraw對象與哪個HAL對應呢?我們可以使用DirectDrawEnumerate函數來枚舉系統所有已安裝的設備,以供選擇,并返回設備的唯一標識GUID。DirectDraw默認主顯示設備的GUID為NULL;

2.1.2 創建DirectDraw對象

由于DirectX是使用面向對象的程序設計技術,因此,使用DirectDraw編程就首先要創建DirectDraw對象。使用DirectDrawCreate函數及將第一步獲得的設備GUID作為參數可以創建基于所選設備的DirectDraw對象;


2.1.3 獲取DirectDraw更高版本的COM接口

假如您不打算使用DirectX5以上版本提供的功能則可以跳過本步驟,否則必須使用新創建DirectDraw對象的QueryIntrface方法來獲得IDirectDraw2或更高的COM接口。在2.2例中將介紹如何獲得DirectX5以上版本提供的IDirectDraw2接口;

2.1.4 設置協作級別

協作方式可以控制程序與系統其他應用程序之間的交互關系,典型的例子是:設置為全屏獨占方式還是窗口普通方式。設置協作級別可以用DirectDraw對象的SetCoOperativeLevel方法;

2.1.5 枚舉設備支持的各種顯示方式,選擇并設置合適的顯示分辯率、色彩深度和刷新頻率等。

使用DirectDraw的EnumDisplayModes方法可以枚舉設備支持的所有圖形方式供用戶選擇,在某些已確定圖形顯示方式的應用程序中可以通過此枚舉功能來檢查系統設備是否支持指定的圖形顯示方式。

使用DirectDraw的SetDisplayMode方法可以設置所需要的圖形顯示方式。

 

2.2 用DirectDraw設置屏幕圖形顯示方式的實例

現在我們開始編寫第一個示例程序“設置全屏幕獨占圖形顯示方式的程序”dx1,首先我們將在這里討論C++ Builder中進行DirectX編程的有關問題,然后再具體介紹實現程序每一步驟的相關技術。

2.2.1 dx1程序運行過程介紹

dx1是根據DirectDraw設置屏幕圖形方式的過程設計的,運行界面如圖2.1所示。在窗口右邊有六個功能按鈕,它們按照屏幕圖形顯示方式設置實現的步驟自上而下排列,程序開始運行時,除第一個按鈕“顯示設備的枚舉”是可用的,其它按鈕均不可用。由于用戶必需按照固定的步驟操作,所以,當一個按鈕任務完成后,dx1程序會將下一步任務的


圖2.1 dx1 屏幕顯示方式設置程序運行界面

按鈕設為可用。

按下“顯示設備枚舉”按鈕后,窗口左上方“運行狀態”對應的文本框中將顯示任務完成情況,若成功則顯示“Enumerate devices OK!”,否則顯示“Enumerate devices failed!” ,同時在狀態組中的設備枚舉下拉框中可以看到枚舉的設備(一般系統只有一個”主顯示設備—Display);確定設備枚舉選擇為“主顯示設備”后,可以進行“創建DirectDraw對象”、“獲得COM的IDIRECT2接口”、“設置協作級別”,每個步驟的運行狀態都會顯示在“運行狀態”右邊的文本框中;在執行了“DDraw2顯示模式的枚舉”后,狀態組下方“顯示模式DDraw2”下拉框中將列出所有顯示設備支持的顯示方式,選擇需要的圖形顯示方式,再按“設置DDraw2”的顯示方式,屏幕就會馬上切換為指定的顯示方式。

2.2.2 dx1編程實現

啟動C++ Builder后在窗口Form1中設計如圖2.1的操作界面,各對象相關屬性設置如表2.1:

控件對象類型  控件對象名稱   相關屬性      屬性值
TForm         Form1          Caption       DirectX 練習程序1
TLabel        Label1         Caption       運行狀態:
TLabel        Label2         Caption       設備的枚舉
Tlabel        Label3         Caption       顯示模式DDraw2
TEdit         Edit1          Text          (空)
                             ReadOnly      true
TGroupBox     GroupBox1      Caption       狀態

TCombBox      ComboBox1      Text          (空)
TCombBox      ComboBox2      Text          (空)
TGroupBox     GroupBox2      Caption       協作級別
TCheckBox     CheckBox1      Caption       DDSCL_ALLOWMODEX
TCheckBox    &

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 桓仁| 沂源县| 施秉县| 宜良县| 万载县| 鄂伦春自治旗| 屏东市| 黑水县| 济宁市| 菏泽市| 五华县| 共和县| 工布江达县| 宁远县| 永修县| 信丰县| 新郑市| 大安市| 宁武县| 永年县| 邵东县| 玛纳斯县| 丹凤县| 夹江县| 舟山市| 临汾市| 桂东县| 丽江市| 河北省| 运城市| 龙泉市| 岳西县| 广汉市| 岳池县| 昭觉县| 湛江市| 泽普县| 岑巩县| 嘉义县| 大洼县| 台安县|