设置 | 登录 | 注册

作者共发了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许可协议进行许可。