Microsoft的針對與設備無關位圖(DIB位圖),在其WIN32 SDK的Multimedia中提供了一組繪制DIB位圖的高性能函數組──DrawDib函數組。DrawDib函數組是一組不依賴于圖形設備接口(GDI)函數,而直接操作顯存的函數組。它們支持8位、16位、24位和32位圖象深度的DIB。總的來說,DrawDib函數組類似于StretchDIBits函數,它們都提供了將圖象拉伸和抖動的功能,然而,DrawDib函數組還支持圖象的解壓、數據流以及更多的顯示適配器。在某些情況下,DrawDib函數組還具有更大的優越性。但是,在某些場合下,DrawDib函數組卻不能取代StretchDIBits函數。下面就DrawDib函數組和StretchDIBits函數使用的場合加以區別和說明:
顏色信息表格式。DrawDib函數組只支持顏色信息表格式為DIB_RGB_COLORS格式的圖象,如果要顯示以DIB_PAL_COLORS或DIB_PAL_INDICES格式的圖象,則必須用StretchDIBits函數。
光柵操作模式。DrawDib函數組只能使用SRCCOPY光柵操作模式,如果要求不僅僅使用SRCCOPY模式的話,只能用StretchDIBits函數。同樣地,如果要使用其他光柵操作,例如XOR,只能用StretchDIBits函數。
視頻及動畫回放的質量。DrawDib函數組支持數據流應用,諸如視頻片和動畫序列,它比StretchDIBits函數提供了更高的圖象質量以及對回放過程的改進。
顯示適配器。DrawDib函數組比StretchDIBits函數支持更多的顯示適配器。DrawDib函數組支持使用4位圖象深度提供16色調色板的VGA適配器,使用8位圖象深度提供256色調色板的SVGA適配器和使用16位、24位和32位圖象深度提供成千上萬種顏色的真彩色適配器。DrawDib函數組還使用了受限制的潛在能力提高了圖象在顯示適配器上的速度和質量。例如,當使用8位的顯示適配器時,DrawDib函數組有效地將真彩色圖象抖動為256色;同樣的,使用4位的顯示適配器時,它們也將8位深度的圖象抖動成4位。
圖象拉伸。正如StretchDIBits一樣,DrawDib函數組用源矩形和目的矩形來控制一個圖象顯示的部分??梢酝ㄟ^改變源矩形和目的矩形的位置和大小來裁剪一幅圖象不需要的部分和拉伸某部分。如果顯示驅動不支持圖象拉伸,那么DrawDib函數組提供了比StretchDIBits函數更有效的拉伸能力。
壓縮圖象。DrawDib函數組支持好幾種壓縮和解壓方法,其中包括游程編碼,JPEG,Cinepak,411YUV和Indeo™。
DrawDib的操作
通過使用DrawDibOpen函數初始化DrawDib函數組。DrawDibOpen負責裝載動態連接庫(DLL),申請內存資源,DrawDib設備環境(DC),并且維持初始化相關的設備環境計數。DrawDibOpen同時返回一個其它DrawDib函數所需要使用的新的DC句柄。
當使用完DrawDib DC后,可以用DrawDibClose函數釋放它。DrawDibClose同時減少存取DLL的應用的計數。在應用程序中,DrawDibClose函數應是最后的DrawDib操作。
可以創建任意多的DrawDib DC,也可以同時使用多個DrawDib DC來繪制幾幅位圖。在應用程序中可以創建多個不同性質的DrawDib DC,這樣就可以選擇最合適的DC設置。例如,在同一應用程序中,創建兩個不同的DrawDib DC,一個用來顯示圖象的正常分辨率,另一個用來顯示圖象的放大部分。
為了更有效地運行,DrawDib函數組需要知道顯示適配器及其驅動的信息。顯示配置信息是在第一次使用包含DrawDib函數組的DLL時,對顯示適配器通過了一系列的測試之后得到的。DrawDib函數組的所有應用都要用到這個配置信息??梢酝ㄟ^調用DrawDibProfileDisplay函數來強制重新進行這些測試。
通常,取得和保存顯示配置是一次性的事件。如果配置信息發現在這個系統中安裝了另一個顯示驅動時,DrawDib則重新進行測試。
圖象再現
創建了DrawDib DC后,就可以用DrawDibDraw函數將DIB繪至屏幕。當在8位深度的顯示適配器上顯示真彩色圖象時,DrawDib將自動地抖動圖象。
DrawDib也透明地支持視頻壓縮器。當顯示壓縮位圖時,可通過DrawDibGetBuffer函數得到包含了解壓圖象數據的緩沖區。如果位圖是未壓縮的,則DrawDibGetBuffer返回NULL。在應用程序中應自己區分位圖是否壓縮。
可用DrawDibUpdate宏來刷新一幅圖象的整體或一部分的顯示。
圖象序列
當DrawDibDraw函數同DrawDibBegin函數一起運用時,可以顯示相同尺寸和格式的位圖序列。DrawDib通過DrawDibBegin準備繪圖的DrawDib DC來提高DrawDibDraw的效率。如果,應用程序沒有調用DrawDibBegin,那么DrawDibDraw會在繪圖前隱含地執行DrawDibBegin。
DrawDibBegin給DrawDibDraw提供了DrawDib的DC,DC的句柄,BITMAPINFOHEADER結構的地址和源矩形及目的矩形的尺寸。當要顯示一個位圖序列時,DrawDibDraw要檢查序列中的每幅圖象的這些值。如果DrawDibDraw檢測到這些值有任何變化,它將隱含地再次調用DrawDibBegin來調整DrawDib DC的設置。
當調用完DrawDibBegin后,就可以指定一個或多個適當的標志來調用DrawDibDraw繪制圖象序列。只要DC句柄未改變,就可指定DDF_SAME_HDC標志;下列參數未改變,就可指定DDF_SAME_DRAW標志:BITMAPINFOHEADER結構的地址和源矩形及目的矩形的尺寸。
可以通過在DrawDibEnd后跟另一個DrawDibBegin調用來更新前一個DrawDibBegin設置的標志。DrawDibEnd清除了當前的DrawDib DC的標志和設置。后續的調用DrawDibBegin將重新初始化DrawDib DC,并重新設置適當的標志和設置。然而,只要至少改變了以下任一個當前的標志設置:BITMAPINFOHEADER結構的地址或是源矩形或目的矩形的尺寸,也可不使用DrawDibEnd而直接調用DrawDibBegin來更新一個DrawDib DC。
通過使用DrawDibStart和DrawDibStop函數,可以提高使用壓縮圖象的數據流操作(如回放一個視頻片)的DrawDibDraw的效率。DrawDibStart通過發送一個消息告訴視頻管理器(VCM)準備DrawDib DC來接受一個圖象流。當流結束時,DrawDibStop發送一個消息給VCM來指示它釋放申請的資源。
需要注意的是,在應用程序中必須確定源矩形和目的矩形的寬度和高度;然而卻并不需要確定這些矩形的起點。應用程序可以重新DrawDibDraw中的起點坐標來使用圖象的不同部分或更新顯示的不同部分。
DrawDib函數組需要響應兩條調色板消息:WM_QUERYNEWPALETTE和WM_PALETTECHANGED。如果應用程序未注意到調色板,就需要對這些消息都增加一個各自的消息處理。
通過使用DrawDibRealize函數可在當前DC中實現當前DrawDib的調色板。應當在響應WM_QUERYNEWPALETTE和WM_PALETTECHANGED消息時,或在用DrawDibDraw函數顯示一個圖象序列的準備過程中實現調色板。
可以用DrawDibSetPallette函數用另一個調色板的映射來繪一幅圖象。DrawDibSetPallette強迫DrawDib DC使用指定的調色板,而這會影響到圖象的質量。例如,一個注意調色板的應用程序,可能已經實現了一個調色板并需要阻止DrawDib實現它自己的調色板。應用程序可以通過DrawDibSetPalette來通知DrawDib調色板的使用。
通過使用DrawDibGetPallette函數可以獲得當前前景調色板的一個句柄。如果應用程序使用了當前前景調色板,它并沒有對調色板的完全使用權,另一個應用程序能夠使這個調色板句柄無效。當使用完畢后,應用程序不應該釋放調色板,那樣會使另一個應用程序不能使用調色板。
通過使用DrawDibChangPallete函數可以為它的調色板DrawDib來接收新的顏色值。在緊跟DrawDibChangPallete的后面的代碼里,可以為調色板顏色表指定新的值。當調用DrawDibChangPalette時,在DrawDib DC中未設置DDF_ANIMATE標志的話,可以通過使用DrawDibRealize來實現調色板和DrawDibDraw重繪圖象來實現調色板的改變。如果DDF_ANIMATE標志在DrawDib DC中設置了,就可以通過DrawDibDraw或DrawDibRealize來實現調色板和顯示著的位圖顏色的動畫。通過DrawDibEnd和DrawDibBegin可以DDF_ANIMATE標志。
如果釋放了被選入DC的DrawDib調色板,DC使用調色板時會報告一個GDI錯誤。相反,應該使用DrawDibSetPalette改變DrawDib DC來使用省缺調色板后另一調色板。
由于以下函數會釋放DrawDib調色板,所以,除非調色板不被DC選中不應使用:DrawDibEnd,DrawDibClose和DrawDibBegin。同樣的,當使用了相同的DrawDib DC,但指定了不同的繪制參數(lpbi,dxDst,dyDst,dxSrc或dySrc)或不同格式時,DrawDibDraw也會釋放調色板。
時間計算
作為調試應用程序的一部分,調用DrawDibTime函數可以得到一些關于完全重復特定次數DrawDib操作所需時間。DrawDibTime返回以下操作的時間:
繪制一幅位圖
解壓一幅位圖
抖動一幅位圖
拉伸一幅位圖
使用BitBlt函數變換一幅位圖
使用StrecthDIBits函數變換一幅位圖
得到返回值后,DrawDibTime重新設置每項操作的計數和值。
注意,DrawDibTime只在DrawDib函數的調試版中可用。
DrawDib的使用
增加調色板消息處理
下面的例子說明了WM_PALETTECHANGED和WM_QUERYNEWPALETTE消息的處理。這個例子用了DrawDibRealize函數來進行WM_QUERYNEWPALETTE消息的處理。
應用程序應通過使目標窗口無效來讓DrawDibDraw函數重繪圖象來響應WM_QUERYNEWPALETTE消息。應用DrawDibRealize函數實現調色板來響應WM_PALETTECHANGED消息。
/tcase WM_PALETTECHANGED:
/t/tif ((HWND) wParam == hwnd)
/t/t break;
/t case WM_QUERYNEWPALETTE:
/t hdc = GetDC(hwnd);
/t/tf = DrawDibRealize (hdd,hdc,FALSE) > 0;
/t ReleaseDC (hwnd,hdc);
/t if (f)
/t/tInvalidateRect ( hwnd,NULL,TRUE);
/t/tbreak;
顯示設備繪制
下面例子用DrawDibrealize函數在顯示一個位圖序列之前準備DrawDib DC.
/t hdc = GetDC(hwnd);
/t DrawDibBegin(hdd,hdc,dxDest,dyDest,lpbi,dxSrc,dySrc,NULL);
/t DrawDibRealize(hdd,hdc,fBackground);
/t DrawDibDraw(hdd,hdc,xDst,yDst,dxDst,dyDst,lpbi,lpBits,
/t/txSrc,ySrc,dxSrc,dySrc,DDF_SAME_DRAW|DDF_SAME_HDC);
/t DrawDibDraw(hdd,hdc,xDst,yDst,dxDst,dyDst,lpbi,lpBits,
/t/txSrc,ySrc,dxSrc,dySrc,DDF_SAME_DRAW|DDF_SAME_HDC);
/t DrawDibDraw(hdd,hdc,xDst,yDst,dxDst,dyDst,lpbi,lpBits,
/t/txSrc,ySrc,dxSrc,dySrc,DDF_SAME_DRAW|DDF_SAME_HDC);
/t ReleaseDC(hwnd,hdc);
調色板動畫
下面用了DrawDibRealize,DrawDibChangPalette和DrawDibDraw函數演示調色板動畫。
能夠用DrawDibBegin函數協同DrawDibChangepalette函數改變一幅位圖的顏色。首先,在調用DrawDibBegin時指定DDF_ANIMATE標志允許調色板改變;然后,用DrawDibChangePalette函數從調色板入口設置顏色表的值。
例如,如果lppe是一個包含新顏色的PALETTEENTRY隊列的地址,并且lpbi是在DrawDibBegin或DrawDibDraw中使用的LPBITMAPINFOHEADER結構,則后面的程序片段更新DIB的顏色表。
/t hdc = GetDC(hwnd);
/t DrawDibBegin(hdd,…,DDF_ANIMATE);
/t DrawDibRealize(hdd,hdc,fBackground);
/t DrawDibDraw(hdd,hdc,…,DDF_SAME_DRAW|DDF_SAME_HDC);
/t //改變顏色調用
/t DrawDibChangePalette(hdd,iStart,iLen,lppe);
/t ……
/t ReleaseDC(hwnd,hdc);
下面給出一個實例的關鍵片段加以說明:(在Visual C++ 4.2 下Windows95或Windows NT環境下通過。)
/tvoid CTestDrawDibView::OnDraw(CDC* pDC)
/t{
/t CTestDrawDibDoc* pDoc = GetDocument();//得到文檔指針
/t ASSERT_VALID(pDoc);
/t // TODO: add draw code for native data here
/t m_DibMem = pDoc->m_Buf;//得到DIB的內存
/t if (m_DibMem == NULL)
/t {
/t/t//AfxMessageBox("Error in m_DibMem");
/t/treturn;
/t }
/t UINT offset = pDoc->m_Off; //得到DIB數據的偏移
/t int xDst,yDst,dxDst,dyDst,xSrc,ySrc,dxSrc,dySrc;
/t LPBITMAPINFOHEADER lpbi;
/t LPVOID lpDibMem;
/t LPVOID lpbits=NULL;
/t // get the Windows width & height 得到窗口的寬高
/t RECT rect;
/t GetClientRect(&rect);
/t xDst = yDst = 0;
/t dxDst = rect.right - rect.left;
/t dyDst = rect.bottom - rect.top;
/t // Get Dib info得到DIB的信息
/t xSrc = ySrc =0;
/t lpDibMem = GlobalLock(m_DibMem);//鎖定內存得到指針
/t lpbi = (LPBITMAPINFOHEADER)lpDibMem;//得到DIB信息
/t dxSrc = lpbi->biWidth;
/t dySrc = lpbi->biHeight;
/t lpbits = (LPSTR)lpDibMem + offset - sizeof(BITMAPFILEHEADER);
/t // Draw Dib繪DIB
/t HDC hdc = NULL;
/t hdc = pDC->m_hDC;
/t /*
/t // Using SetDIBToDevice使用SetDIBToDevice函數為對照
/t int line = SetDIBitsToDevice(hdc,
/t/t xDst,
/t/t yDst,
/t/t dxSrc,
/t/t dySrc,
/t/t xSrc,
/t/t ySrc,
/t/t 0,
/t/t dySrc,
/t/t lpdib,//lpbits,
/t/t (LPBITMAPINFO)lpbi,
/t/t DIB_RGB_COLORS);
/t if(0 == line)
/t {
/t/tAfxMessageBox("Error in SetDIBsToDevice");
/t }
/t */
/t /*
/t // Using StretchDIBits使用StretchDIBits函數為對照
/t int line = StretchDIBits(hdc,
/t/t xDst,
/t yDst,
/t dxDst,
/t/t dyDst,
/t/t xSrc,
/t/t ySrc,
/t/t dxSrc,
/t/t dySrc,
/t/t lpbits,
/t/t (LPBITMAPINFO)lpbi,
/t/t DIB_RGB_COLORS,
/t/t SRCCOPY);
/t if(0 == line)
/t {
/t/tAfxMessageBox("Error in SetDIBsToDevice");
/t }
/t */
/t // Using DrawDib使用DrawDib
/t // Set Dawing flag設置繪制標志
/t UINT wFlags;
/t //標志意義參見前面的函數參考,以下兩個標志可繪出圖象,
/t //其余標志在這種情況下繪不出圖象。
/t wFlags = DDF_DONTDRAW;
/t //wFlags = DDF_NOTKEYFRAME;
/t HDRAWDIB hdd = DrawDibOpen();
/t if (hdd != NULL)
/t {
/t/tBOOL Suc = TRUE;
/t/t//具體參數請參見前面函數參考
/t/tSuc = DrawDibDraw(hdd,
/t/t/thdc,
/t/t/txDst,
/t/t/tyDst,
/t/t/tdxDst,
/t/t/tdyDst,
/t/t/tlpbi,
/t/t/tlpbits,
/t/t/txSrc,
/t/t/tySrc,
/t/t/tdxSrc,
/t/t/tdySrc,
/t/t/twFlags);
/t/tif(Suc == FALSE) AfxMessageBox("DrawDib Failed");
/t/t/* //時間測試
/t/tDRAWDIBTIME time;
/t/tDrawDibTime(hdd ,&time);
/t/tchar buf[256];
/t/tsprintf(buf,"Count %dDraw %dDecompress %d
/t/t Dither %dStretch %dBlt %d SetDIBits %d",
/t/t time.timeCount,time.timeDraw,
/t/t time.timeDecompress,time.timeDither,
/t/t time.timeStretch,time.timeBlt,
/t/t time.timeSetDIBits);
/t/tAfxMessageBox(buf);
/t/t*/
/t/tDrawDibClose(hdd);
/t}
/t else
/t/tAfxMessageBox("Error in DrawDibOpen");
/t GlobalUnlock(m_DibMem);//釋放DIB句柄
}
附:函數參考:
DrawDibBegin
這個DrawDib函數改變一個DrawDib DC的參數或初始化一個新的DrawDib DC.
BOOL DrawDibBegin(
HDRAWDIB hdd,
HDC hdc,
int dxDest,
int dyDest,
LPBITMAPINFOHEADER lpbi,
int dxSrc,
int dySrc,
UINT wFlags
);
參數
hdd DrawDib DC的句柄
hdc 繪圖DC的句柄。此參數為可選。
dxDst和dyDst 在MM_TEXT方式下目的矩形的寬度和高度。
lpbi 包含圖象格式的BITMAPINFOHEADER結構的地址。DIB顏色表緊跟圖象格式,并且biHeight成員必須為一正值。
dxSrc和dySrc 源矩形的寬度和高度(以象素為單位)。
wFlags 函數調用的可用標志。定義了以下的值:
DDF_ANIMATE 允許調色板動畫。如果這個值被設置,通過在LOGPALETTE結構中設置palPalEntry成員PC_RESERVED標志,則DrawDib保存了盡可能多的入口,調用drawDibChangePalette函數就可實現調色板動畫。如果應用程序用了DrawDibBegin函數協同DrawDibDraw函數,最好在DrawDibBegin中設置這個值而不在DrawDibDraw中。
DDF_BACKGROUNDPAL 實現作為背景的調色板,保留當前顯示所使用的調色板不變。(這個值與DDF_SAME_HDC互斥。)
DDF_BUFFER 使DrawDib使用屏幕緩沖,這樣DDF_UPDATE才可使用。這關閉了解壓和直接繪屏。如果DrawDib不能創建一個脫屏緩沖,就解壓或直接繪屏。
DDF_DONTDRAW 當前圖象未繪,但已解壓。DDF_UPDATE能夠以后被用來繪圖象。這個標志取代了DDF_PREROLL標志。
DDF_FULLSCREEN 不被支持。
DDF_HALFTONE 不管DIB的調色板如何而把DIB抖動成標準調色板。如果應用程序用DrawDibBegin協同DrawDibDraw,在DrawDibBegin中設置這個值而不在DrawDibDraw中。
DDF_JUSTDRAWIT 用GDI繪這圖象。禁止DrawDib函數解壓,拉伸或抖動圖象。這實際上剝奪了DrawDib區別于StrechDIBits函數的能力。
DDF_SAME_DRAW 讓DrawDibDraw使用當前的繪制參數。只有當從使用DrawDibDraw或DrawDibBegin起,lpbi、dxDext、dyDest、dxSrc和dySrc就未改變才用這個值。這個標志取代了DDF_SAME_DIB和DDF_SAME_SIZE標志。
DDF_SAME_HDC 使用當前DC句柄以及與當前句柄相關聯的調色板。
DDF_UPDATE 最后緩存的圖象需要繪制。如果用這個值繪制失敗,則緩沖的圖象不在有效,并且在顯示被更新前,需要指定一幅新的圖象。
返回值
成功返回TRUE,否則FALSE。
注 這個函數準備由lpbi指定要繪往DC的DIB。圖象已經拉伸成由dxDest和dyDest所指定的大小。如果dxDest和dyDest被設置成-1,DIB則被按原比例繪制。
可通過重新使用DrawDibBegin,指定新的標志和改變至少一個以下的設置:dxDest、dyDest、lpbi、dxSrc或dySrc來更新DrawDib DC的標志。
如果DrawDibBegin的參數未被改變,再次調用這個函數將不起作用。
DrawDibChangePalette
這個函數設置繪DIB所用的調色板。
BOOL DrawDibChangePalette(
HDRAWDIB hdd,
int iStart,
int iLen,
LPPALETTEENTRY lppe
);
參數:
hdd DrawDib DC的句柄。
iStart 調色板開始數。
iLen 調色板的數目。
lppe 調色板陣列的地址。
返回值
成功返回TRUE,否則FALSE。
注 只有當當前DrawDib調色板是調用DrawDibRealize函數實現時,這個函數改變物理調色板。
如果顏色表沒有改變,下次沒有指定DDF_SAME_DRAW的DrawDibDraw函數將隱含地調用DrawDibBegin函數。
DrawDibClose
這個函數關閉一個DrawDib DC并釋放DrawDib申請的資源。
BOOL DrawDibClose(
HDRAWDIB hdd
);
參數
hdd DrawDib DC的句柄。
返回值
成功返回TRUE,否則FALSE。
DrawDibDraw
這個函數將DIB繪至屏幕。
BOOL DrawDibDraw(
HDRAWDIB hdd,
HDC hdc,
int xDst,
int yDst,
int dxDst,
int dyDst,
LPBITMAPINFOHEADER lpbi,
LPVOID lpBits,
int xSrc,
int ySrc,
int dxSrc,
int dySrc,
UINT wFlags
);
參數
hdd DrawDib DC的句柄。
hdc DC的句柄。
xDst和yDst 在MM_TEXT坐標系,目標矩形左上角的x和y坐標。
dxDst和dyDst 在MM_TEXT坐標系下,目標矩形的寬度和高度。如果dxDst為-1,則使用位圖的寬度;如果dyDst為-1,則使用位圖的高度。
lpbi 包含圖象格式的BITMAPINFOHEADER結構的地址。DIB的顏色表緊跟著格式后,并且biHeight成員必須為正值;DrawDibDraw不能繪制倒置的DIB。
lpbits 包含位圖位的緩沖的地址。
xSrc和ySrc 以象素為單位,源矩形左上角的x和y坐標。坐標(0,0)是位圖的左上角。
dxSrc和dySrc 以象素為單位,源矩形的寬度和高度。
wFlags 可用的繪圖標志。如下值被定義:
DDF_BACKGROUNDPAL 實現作為背景的調色板,保留當前顯示所使用的調色板不變。這個值只有當DDF_SAME_HDC未被設置時才有效。
DDF_DONTDRAW 當前圖象已解壓但未繪。這個標志取代了DDF_PREROLL標志。
DDF_FULLSCREEN 不被支持。
DDF_HALFTONE 不管DIB的調色板如何而把DIB抖動成標準調色板。如果應用程序使用了DrawDibBegin,在DrawDibBegin中設置而不在DrawDibDraw中。
DDF_HURRYUP 數據并不需要被繪(它可以被繪)并且DDF_UPDATE不用理會這個信息。DrawDib只有當需要去構建另一幀時才檢查這個值;否則,這個值被忽略。
這個值通常用來同步視頻和音頻。當同步數據時,應用程序應當用這個值發送圖象以防止驅動器需要緩沖幀來解壓后續幀。
DDF_NOTKEYFRAME DIB數據不是關鍵幀。
DDF_SAME_HDC 使用當前DC句柄以及與當前句柄相關聯的調色板。
DDF_SAME_DRAW 讓DrawDibDraw使用當前的繪制參數。只有當從使用DrawDibDraw或DrawDibBegin起,lpbi、dxDext、dyDest、dxSrc和dySrc就未改變才用這個值。DrawDibDraw經常檢查這些參數,如果它們改變了,DrawDibBegin則準備繪圖的DrawDib DC。這個標志取代了DDF_SAME_DIB和DDF_SAME_SIZE標志。
DDF_UPDATE 最后緩存的圖象需要繪制。如果用這個值繪制失敗,則緩沖的圖象不在有效,并且在顯示被更新前,需要指定一幅新的圖象。
返回值
成功返回TRUE,否則FALSE。
注 DDF_DONTDRAW使DrawDibDraw解壓但不顯示一幅圖象。一個調用DrawDibDraw的序列是指定DDF_UPDATE來顯示圖象。
如果DrawDib DC沒有指定一個屏幕緩沖,指定DDF_DONTDRAW會造成這幀被立即繪到屏幕。序列調用DrawDibDraw指定DDF_UPDATE會失敗。
盡管DDF_UPDAT和DDF_DONTDRAW可以在不同時間設置,它們可以一起用來創建脫屏圖象。當脫屏圖象完成后,可以調用DrawDibDraw來顯示圖象。
DrawDibEnd
這個函數清除由DrawDibBegin或DrawDibDraw函數設置的標志和DrawDib DC的其它設置。
BOOL DrawDibEnd(
HDRAWDIB hdd
);
參數
hdd 要釋放的DrawDib DC的句柄。
返回值
成功返回TRUE,否則FALSE。
DrawDibGetBuffer
這個函數清除由DrawDib用來解壓的緩沖的地址。
LPVOID DrawDibGetBuffer(
HDRAWDIB hdd,
LPBITMAPINFOHEADER lpbi,
DWORD dwSize,
DWORD dwFlags
);
參數
hdd 要釋放的DrawDib DC的句柄。
lpbi BITMAPINFO結構的地址。這個結構由BITMAPINFOHEADER結構和位圖使用的256色調色板所定義的顏色表。
dwSize 通過lpbi的BITMAPINFO結構所指的字節大小。
dwFlags 保留,必須為0。
返回值
返回緩沖的地址或者如果沒有用到緩沖返回NULL。如果lpbi不為NULL,它填充了一個描繪緩沖的BITMAPINFO的結構。
DrawDibGetPalette
這個函數清除由DrawDib DC所使用的調色板。
HPALETTE DrawDibGetPalette(
HDRAWDIB hdd
);
參數
hdd 要釋放的DrawDib DC的句柄。
返回值
成功返回一個調色板句柄,否則返回NULL。
注 這個函數假設DrawDib DC包含了一個有效的調色板,隱含著這樣的一個條件:對這個函數的調用必須在DrawDibDraw或DrawDibBegin函數之后。
DrawDibOpen
這個函數打開DrawDib庫為使用和創建一個繪圖的DrawDib DC作準備。
HDRAWDIB DrawDibOpen(VOID);
參數
這個函數不需要參數。
返回值
成功返回一個DrawDib DC的句柄,否則為NULL。
注 當同時繪多個DIB時,為同時在屏的每個圖象創建一個DrawDib DC。
DrawDibProfileDisplay
這個函數決定了當用DrawDib函數時顯示系統的設置。
BOOL DrawDibProfileDisplay(
LPBITMAPINFOHEADER lpbi
);
參數
lpbi 包含位圖信息的BITMAPINFOHEADER結構??梢酝ㄟ^指定NULL來確認配置信息是當前的。如果配置信息不是當前的,DrawDib會重新運行配置測試來得到當前設置信息。如果把這個參數設為NULL來調用DrawDibProfileDisplay返回值是沒有意義的。
返回值
返回值指出了這個顯示系統的最快繪制和拉伸能力。如果位圖格式不被支持,這個值為0或一個或更多的下列值:
PD_CAN_DRAW_DIB DrawDib能用這種格式繪圖象。拉伸可能被支持或不被支持。
PD_CAN_STRETCHDIB DrawDib能用這種格式拉伸或繪制圖象。
PD_STRETCHDIB _1_1_OK StretchDIBits用這種格式繪未拉伸的圖象快于另一種方式。
PD_STRETCHDIB _1_2_OK StretchDIBits用這種格式繪以1:2拉伸的圖象快于另一種方式。
PD_STRETCHDIB _1_N_OK StretchDIBits用這種格式繪以1:N拉伸的圖象快于另一種方式。
DrawDibRealize
這個函數為用指定DC實現DrawDib DC 的調色板。
UINT DrawDibRealize (
HDRAWDIB hdd ,
HDC hdc ,
BOOL fBackground
) ;
參數
hdd DrawDib DC hdd DrawDib DC的句柄。
hdc 包含調色板的DC的句柄。
fBackground 背景調色板標志。如果此值非零,此調色板為背景調色板。如果此值為零并且DC與另一個窗口相連,當窗口擁有輸入焦點時邏輯調色板變為背景調色板。(當窗口風格是CS_OWNDC或當DC是用GetDC函數得到的時,一個DC就與一個窗口相連)。
返回值
返回在系統調色板中映射了不同值的邏輯調色板中的入口值。如果發生了錯誤或沒有要更新的顏色,返回0。
注意
用DrawDibDraw函數并指定DDF_BACKGROUNDPAL標志來選擇DrawDib DC的調色板作背景調色板。
DrawDibSetPalette
這個函數設置繪DIB所用的調色板。
BOOL DrawDibSetPalette(
HDRAWDIB hdd ,
HPALETTE hpal
) ;
參數
hdd DrawDib DC的句柄。
hpal 調色板的句柄。指定NULL則使用缺省調色板。
返回值
成功返回TRUE,否則返回FALSE。
DrawDibStart
DrawDibStart函數為流回放準備 DrawDib DC。
BOOL DrawDibStart(
HDRAWDIB hdd ,
LONG rate
);
參數
hdd DrawDib DC的句柄。
rate 回放率 每幀以毫秒計。
返回值
成功返回TRUE,否則返回FALSE。
DrawDibStop
這個函數釋放用于流回放的DrawDib DC所占用的資源。
BOOL DrawDibStop(
HDRAWDIB hdd
);
參數
hdd DrawDib DC的句柄。
返回值
成功返回TRUE,否則返回FALSE。
DrawDibTime
這個函數得到關于繪制操作的時間和調試操作的時間信息。
BOOL DrawDibTime(
HDRAWDIB hdd,
LPDRAWDIBTIME lpddtime
) ;
參數
hdd DrawDib DC的句柄。
lpddtime DrawDibTime的結構地址。
返回值
成功返回TRUE,否則返回FALSE。
注意
這個函數只存在于W32軟件開發庫的調試版本。