設置 | 登錄 | 註冊

作者共發了5篇帖子。

【程序】創建應用程式可寫入,HDC可選入的DIB位圖——CreateDIBSection

1樓 巨大八爪鱼 2016-6-24 17:24
#include <stdio.h>
#include <Windows.h>

int main(void)
{
    BITMAPINFOHEADER infoheader;
    HBITMAP hbmp;
    HDC hdc, hdcMem;
    PBYTE pBits; // 用於接收系統為位圖分配的內存地址

    hdc = GetDC(NULL);
    hdcMem = CreateCompatibleDC(hdc);

    ZeroMemory(&infoheader, sizeof(infoheader));
    infoheader.biSize = sizeof(infoheader);
    infoheader.biBitCount = 24;
    infoheader.biPlanes = 1;
    infoheader.biWidth = 100;
    infoheader.biHeight = 50;

    hbmp = CreateDIBSection(hdc, (BITMAPINFO *)&infoheader, DIB_RGB_COLORS, (LPVOID *)&pBits, NULL, (DWORD)NULL);
    SelectObject(hdcMem, hbmp); // 可將創建的位圖選入內存DC

    memset(pBits, 0xee, 300);
    memset(pBits + 300, 0x99, 300);

    SelectObject(hdcMem, GetStockObject(WHITE_BRUSH));
    Rectangle(hdcMem, 10, 10, 40, 20);

    BitBlt(hdc, 10, 10, infoheader.biWidth, infoheader.biHeight, hdcMem, 0, 0, SRCCOPY);

    ReleaseDC(NULL, hdc);
    DeleteDC(hdcMem);
    DeleteObject(hbmp);
    return 0;
}
2樓 巨大八爪鱼 2016-6-24 17:26
將該位圖選入DC後進行的繪圖操作都會自動反映到pBits指向的內存區域內。
也就是說GDI會自動進行DDB <-> DIB轉換,使用起來非常方便。
3樓 巨大八爪鱼 2016-6-24 17:27
CreateDIBSection的最後兩個參數與文件映射有關,可以把對位圖做出的改動實時寫入磁碟文件。
4樓 巨大八爪鱼 2016-6-24 17:30
如果沒有這個函數,我們就得先根據DIB位圖數據用CreateDIBitmap函數創建DDB(DIB->DDB),然後才能拿給HDC進行繪圖。最後繪圖完了還想直接操作位圖數據,又得用GetDIBits函數進行DDB->DIB的轉換,重新得到DIB位圖數據,顯然這是非常麻煩的。
5樓 巨大八爪鱼 2016-6-24 17:32

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。