DrawDib函數組的使用

來源:互聯網
上載者:User

  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訊息。

  case WM_PALETTECHANGED:
         if ((HWND) wParam == hwnd)
            break;
       case WM_QUERYNEWPALETTE:
        hdc = GetDC(hwnd);
         f = DrawDibRealize (hdd,hdc,FALSE) > 0;
        ReleaseDC (hwnd,hdc);
        if (f)
         InvalidateRect ( hwnd,NULL,TRUE);
         break;

  顯示裝置繪製

  下面例子用DrawDibrealize函數在顯示一個位元影像序列之前準備DrawDib DC.

  hdc = GetDC(hwnd);
       DrawDibBegin(hdd,hdc,dxDest,dyDest,lpbi,dxSrc,dySrc,NULL);
       DrawDibRealize(hdd,hdc,fBackground);
       DrawDibDraw(hdd,hdc,xDst,yDst,dxDst,dyDst,lpbi,lpBits,
         xSrc,ySrc,dxSrc,dySrc,DDF_SAME_DRAW|DDF_SAME_HDC);
       DrawDibDraw(hdd,hdc,xDst,yDst,dxDst,dyDst,lpbi,lpBits,
         xSrc,ySrc,dxSrc,dySrc,DDF_SAME_DRAW|DDF_SAME_HDC);
       DrawDibDraw(hdd,hdc,xDst,yDst,dxDst,dyDst,lpbi,lpBits,
         xSrc,ySrc,dxSrc,dySrc,DDF_SAME_DRAW|DDF_SAME_HDC);
       ReleaseDC(hwnd,hdc);

 調色盤動畫

  下面用了DrawDibRealize,DrawDibChangPalette和DrawDibDraw函數示範調色盤動畫。

  能夠用DrawDibBegin函數協同DrawDibChangepalette函數改變一幅位元影像的顏色。首先,在調用DrawDibBegin時指定DDF_ANIMATE標誌允許調色盤改變;然後,用DrawDibChangePalette函數從調色盤入口設定顏色表的值。

  例如,如果lppe是一個包含新顏色的PALETTEENTRY隊列的地址,並且lpbi是在DrawDibBegin或DrawDibDraw中使用的LPBITMAPINFOHEADER結構,則後面的程式片段更新DIB的顏色表。

   hdc = GetDC(hwnd);
       DrawDibBegin(hdd,…,DDF_ANIMATE);
        DrawDibRealize(hdd,hdc,fBackground);
       DrawDibDraw(hdd,hdc,…,DDF_SAME_DRAW|DDF_SAME_HDC);
       //改變顏色調用
       DrawDibChangePalette(hdd,iStart,iLen,lppe);
       ……
       ReleaseDC(hwnd,hdc);

  下面給出一個執行個體的關鍵片段加以說明:(在Visual C++ 4.2 下Windows95或Windows NT環境下通過。)

  void CTestDrawDibView::OnDraw(CDC* pDC)
     {
       CTestDrawDibDoc* pDoc = GetDocument();//得到文檔指標
       ASSERT_VALID(pDoc);
       // TODO: add draw code for native data here
       m_DibMem = pDoc->m_Buf;//得到DIB的記憶體
       if (m_DibMem == NULL)
       {
         //AfxMessageBox("Error in m_DibMem");
         return;
       }
       UINT offset = pDoc->m_Off; //得到DIB資料的位移
       int xDst,yDst,dxDst,dyDst,xSrc,ySrc,dxSrc,dySrc;
       LPBITMAPINFOHEADER lpbi;
       LPVOID lpDibMem;
       LPVOID lpbits=NULL;
       // get the Windows width & height 得到視窗的寬高
       RECT rect;
       GetClientRect(&rect);
       xDst = yDst = 0;
       dxDst = rect.right - rect.left;
       dyDst = rect.bottom - rect.top;
       // Get Dib info得到DIB的資訊
       xSrc = ySrc =0;
       lpDibMem = GlobalLock(m_DibMem);//鎖定記憶體得到指標
       lpbi = (LPBITMAPINFOHEADER)lpDibMem;//得到DIB資訊
       dxSrc = lpbi->biWidth;
       dySrc = lpbi->biHeight;
       lpbits = (LPSTR)lpDibMem + offset - sizeof(BITMAPFILEHEADER);
       // Draw Dib繪DIB
       HDC hdc = NULL;
       hdc = pDC->m_hDC;
       /*
       // Using SetDIBToDevice使用SetDIBToDevice函數為對照
       int line = SetDIBitsToDevice(hdc,
           xDst,
           yDst,
           dxSrc,
           dySrc,
           xSrc,
           ySrc,
           0,
           dySrc,
           lpdib,//lpbits,
           (LPBITMAPINFO)lpbi,
           DIB_RGB_COLORS);
       if(0 == line)
      {
         AfxMessageBox("Error in SetDIBsToDevice");
       }
       */
       /*
       // Using StretchDIBits使用StretchDIBits函數為對照
       int line = StretchDIBits(hdc,
           xDst,
         yDst,
         dxDst,
           dyDst,
           xSrc,
           ySrc,
           dxSrc,
           dySrc,
           lpbits,
           (LPBITMAPINFO)lpbi,
           DIB_RGB_COLORS,
           SRCCOPY);
       if(0 == line)
       {
         AfxMessageBox("Error in SetDIBsToDevice");
       }
       */
       // Using DrawDib使用DrawDib
       // Set Dawing flag設定繪製標誌
       UINT wFlags;
       //標誌意義參見前面的函數參考,以下兩個標誌可繪出圖象,
       //其餘標誌在這種情況下繪不出圖象。
       wFlags = DDF_DONTDRAW;
       //wFlags = DDF_NOTKEYFRAME;
       HDRAWDIB hdd = DrawDibOpen();
       if (hdd != NULL)
       {
         BOOL Suc = TRUE;
         //具體參數請參見前面函數參考
         Suc = DrawDibDraw(hdd,
             hdc,
             xDst,
             yDst,
             dxDst,
             dyDst,
             lpbi,
             lpbits,
             xSrc,
             ySrc,
             dxSrc,
             dySrc,
             wFlags);
         if(Suc == FALSE) AfxMessageBox("DrawDib Failed");
         /* //時間測試
         DRAWDIBTIME time;
         DrawDibTime(hdd ,&time);
         char buf[256];
         sprintf(buf,"Count %d/nDraw %d/nDecompress %d/n
           Dither %d/nStretch %d/nBlt %d/n SetDIBits %d/n",
           time.timeCount,time.timeDraw,
           time.timeDecompress,time.timeDither,
           time.timeStretch,time.timeBlt,
           time.timeSetDIBits);
         AfxMessageBox(buf);
         */
         DrawDibClose(hdd);
     }
       else
         AfxMessageBox("Error in DrawDibOpen");
       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軟體開發庫的調試版本。

 

http://tech.ddvip.com/2006-03/1143673920878_10.html

聯繫我們

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