MIniGui 記憶體DC繪圖

來源:互聯網
上載者:User

記憶體 DC 和 BitBlt
    新的 GDI 函數增強了記憶體 DC 操作函數。GDI 函數在建立記憶體 DC 時,將調用 GAL 的相應介面。如前所述,GAL 將盡量把記憶體 DC 建立在顯示卡的顯示記憶體當中。這樣,可以充分利用顯示卡的硬體加速功能,實現顯示記憶體中兩個不同地區之間位塊的快速移動、複製等等,包括透明處理和 Alpha 混和。應用程式可以建立一個具有逐點 Alpha 特性的記憶體 DC(每個點具有不同的 Alpha 值),也可以通過 SetMemDCAlpha 設定記憶體 DC 所有象素的 Alpha 值(或者稱為"Alpha 通道"),然後利用 BitBlt 和 StretchBlt 函數實現 DC 之間的位塊傳送。應用程式還可以通過 SetMemDCColorKey 函數設定源 DC 的透明色,從而在進行 BitBlt 時跳過這些透明色。 

有關記憶體 DC 的 GDI 函數有(include/gdi.h): 

#define MEMDC_FLAG_NONE         0x00000000          /* None. */
#define MEMDC_FLAG_SWSURFACE    0x00000000          /* DC is in system memory */
#define MEMDC_FLAG_HWSURFACE    0x00000001          /* DC is in video memory */
#define MEMDC_FLAG_SRCCOLORKEY  0x00001000          /* Blit uses a source color key */
#define MEMDC_FLAG_SRCALPHA     0x00010000          /* Blit uses source alpha blending */
#define MEMDC_FLAG_RLEACCEL     0x00004000          /* Surface is RLE encoded */ 

HDC GUIAPI CreateCompatibleDC (HDC hdc);
HDC GUIAPI CreateMemDC (int width, int height, int depth, DWORD flags,
                Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask);
BOOL GUIAPI ConvertMemDC (HDC mem_dc, HDC ref_dc, DWORD flags);
BOOL GUIAPI SetMemDCAlpha (HDC mem_dc, DWORD flags, Uint8 alpha);
BOOL GUIAPI SetMemDCColorKey (HDC mem_dc, DWORD flags, Uint32 color_key);
void GUIAPI DeleteMemDC (HDC mem_dc); 

    CreateCompatibleDC 函數建立一個和給定 DC 相容的記憶體 DC。相容的含義是指,新建立的記憶體 DC 的象素格式、寬度和高度與給定 DC 是相同的。利用這種方式建立的記憶體 DC 可以快速 Blit 到與之相容的 DC 上。 

    這裡需要對象素格式做進一步解釋。象素格式包含了色彩深度(即每象素點的二進位位元)、調色盤或者象素點中 RGBA(紅、綠、藍、Alpha)四個分量的組成方式。其中的 Alpha 分量,可以理解為一個象素點的透明度,0 表示完全透明,255 表示完全不透明。在 MiniGUI 中,如果色彩深度低於 8,則 GAL 會預設建立一個調色盤,並且可以調用 SetPalette 函數修改調色盤。如果色彩深度高於 8,則通過四個變數分別指定象素點中 RGBA 分量所佔的位。如果是建立相容 DC,則相容記憶體 DC 和給定 DC 具有一樣的色彩深度,同時具有一樣的調色盤或者一樣的 RGBA 分量組成方式。 

    如果調用 CreateMemDC 函數,則可以指定建立記憶體 DC 的高度、寬度、色彩深度,以及必要的 RGBA 組成方式。在 MiniGUI 中,是通過各自在象素點中所佔用的位元遮罩來表示 RGBA 四個分量的組成方式的。比如,如果要建立一個包含逐點 Alpha 資訊的16 位記憶體 DC,則可以用每分量四個二進位位的方式分配 16 位的象素值,這樣,RGBA 四個分量的掩碼分別為:0x0000F000, 0x00000F00, 0x000000F0, 0x0000000F。 

    ConvertMemDC 函數用來將一個任意的記憶體 DC 對象,根據給定的參考 DC 的象素格式進行轉換,使得結果 DC 具有和參考 DC 一樣的象素格式。這樣,轉換後的 DC 就能夠快速 Blit 到與之相容的 DC 上。 

    SetMemDCAlpha 函數用來設定或者取消整個記憶體 DC 對象的 Alpha 通道值。我們還可以通過 MEMDC_FLAG_RLEACCEL 標誌指定記憶體 DC 採用或者取消 RLE 編碼方式。Alpha 通道值將作用在 DC 的所有象素點上。 

    SetMemDCColorKey 函數用來設定或者取消整個記憶體 DC 對象的 ColorKey,即透明象素值。我們還可以通過 MEMDC_FLAG_RLEACCEL 標誌指定記憶體 DC 採用或者取消 RLE 編碼方式。 

    記憶體 DC 和其他 DC 一樣,也可以調用 GDI 的繪圖函數向記憶體 DC 中進行任意的繪圖輸出,然後再 BitBlt 到其他 DC 中。下面的程式段示範了如何使用記憶體 DC 向視窗 DC 進行透明和 Alpha 混和的 Blitting 操作: 

  /* 逐點 Alpha 操作 */
    mem_dc = CreateMemDC (400, 100, 16, MEMDC_FLAG_HWSURFACE | MEMDC_FLAG_SRCALPHA,
                    0x0000F000, 0x00000F00, 0x000000F0, 0x0000000F); 

    /* 設定一個不透明的刷子並填充矩形 */
    SetBrushColor (mem_dc, RGBA2Pixel (mem_dc, 0xFF, 0xFF, 0x00, 0xFF));
    FillBox (mem_dc, 0, 0, 200, 50); 

    /* 設定一個 25%  透明的刷子並填充矩形 */
    SetBrushColor (mem_dc, RGBA2Pixel (mem_dc, 0xFF, 0xFF, 0x00, 0x40));
    FillBox (mem_dc, 200, 0, 200, 50); 

    /* 設定一個半透明的刷子並填充矩形 */
    SetBrushColor (mem_dc, RGBA2Pixel (mem_dc, 0xFF, 0xFF, 0x00, 0x80));
    FillBox (mem_dc, 0, 50, 200, 50); 

    /* 設定一個 75% 透明的刷子並填充矩形 */
    SetBrushColor (mem_dc, RGBA2Pixel (mem_dc, 0xFF, 0xFF, 0x00, 0xC0));
    FillBox (mem_dc, 200, 50, 200, 50);
    SetBkMode (mem_dc, BM_TRANSPARENT); 

    /* 以半透明的象素點輸出文字 */
    SetTextColor (mem_dc, RGBA2Pixel (mem_dc, 0x00, 0x00, 0x00, 0x80));
    TabbedTextOut (mem_dc, 0, 0, "Memory DC with alpha.\n"
                                 "The source DC have alpha per-pixel."); 

    /* Blit 到視窗 DC 上 */
    start_tick = GetTickCount ();
    count = 100;
    while (count--) {
        BitBlt (mem_dc, 0, 0, 400, 100, hdc, rand () % 800, rand () % 800);
    }
    end_tick = GetTickCount ();
    TellSpeed (hwnd, start_tick, end_tick, "Alpha Blit", 100); 

    /* 刪除記憶體 DC */
    DeleteMemDC (mem_dc); 

    /* 具有 Alpha 通道 的記憶體 DC:32 位,RGB 各占 8 位,無 Alpha 分量 */
    mem_dc = CreateMemDC (400, 100, 32, MEMDC_FLAG_HWSURFACE | MEMDC_FLAG_SRCALPHA | MEMDC_FLAG_SRCCOLORKEY,
                    0x00FF0000, 0x0000FF00, 0x000000FF, 0x00000000); 

    /* 輸出填充矩形和文本到記憶體 DC 上 */
    SetBrushColor (mem_dc, RGB2Pixel (mem_dc, 0xFF, 0xFF, 0x00));
    FillBox (mem_dc, 0, 0, 400, 100);
    SetBkMode (mem_dc, BM_TRANSPARENT);
    SetTextColor (mem_dc, RGB2Pixel (mem_dc, 0x00, 0x00, 0xFF));
    TabbedTextOut (mem_dc, 0, 0, "Memory DC with alpha.\n"
                                 "The source DC have alpha per-surface."); 

    /* Blit 到視窗 DC 上 */
    start_tick = GetTickCount ();
    count = 100;
    while (count--) {
        /* 設定記憶體 DC 的 Alpha 通道 */
        SetMemDCAlpha (mem_dc, MEMDC_FLAG_SRCALPHA | MEMDC_FLAG_RLEACCEL, rand () % 256);
        BitBlt (mem_dc, 0, 0, 400, 100, hdc, rand () % 800, rand () % 800);
    }
    end_tick = GetTickCount ();
    TellSpeed (hwnd, start_tick, end_tick, "Alpha Blit", 100); 

    /* 填充矩形地區, 並輸出文字 */
    FillBox (mem_dc, 0, 0, 400, 100);
    SetBrushColor (mem_dc, RGB2Pixel (mem_dc, 0xFF, 0x00, 0xFF));
    TabbedTextOut (mem_dc, 0, 0, "Memory DC with alpha and colorkey.\n"
                                 "The source DC have alpha per-surface.\n"
                                 "And the source DC have a colorkey, \n"
                                 "and RLE accelerated."); 

    /* 設定記憶體 DC 的透明象素值 */
    SetMemDCColorKey (mem_dc, MEMDC_FLAG_SRCCOLORKEY | MEMDC_FLAG_RLEACCEL,
                    RGB2Pixel (mem_dc, 0xFF, 0xFF, 0x00));
    /* Blit 到視窗 DC 上 */
    start_tick = GetTickCount ();
    count = 100;
    while (count--) {
        BitBlt (mem_dc, 0, 0, 400, 100, hdc, rand () % 800, rand () % 800);
        CHECK_MSG;
    }
    end_tick = GetTickCount ();
    TellSpeed (hwnd, start_tick, end_tick, "Alpha and colorkey Blit", 100); 

    /* 刪除記憶體 DC 對象 */
    DeleteMemDC (mem_dc); 

聯繫我們

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