鉴于HBITMAP,如何绘制它?

时间:2015-07-14 00:50:34

标签: c++ c windows bitmap gdi

我是一个绝对的初学者,但是我已经设法犯错了93%的我想成为的地方。需要最后7%的帮助。

我手动创建了一个这样的位图:

BITMAPINFO bmpInfo = { 0 };
BITMAPINFOHEADER bmpInfoHeader = { 0 };
BITMAP ImageBitmap;
void *bits;

bmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfoHeader.biBitCount = 32;
bmpInfoHeader.biClrImportant = 0;
bmpInfoHeader.biClrUsed = 0;
bmpInfoHeader.biCompression = BI_RGB;
bmpInfoHeader.biHeight = -IMAGE_DISPLAY_HEIGHT;
bmpInfoHeader.biWidth = IMAGE_DISPLAY_WIDTH;
bmpInfoHeader.biPlanes = 1;
bmpInfoHeader.biSizeImage = IMAGE_DISPLAY_WIDTH * IMAGE_DISPLAY_HEIGHT * 4;

ZeroMemory(&bmpInfo, sizeof(bmpInfo));
bmpInfo.bmiHeader = bmpInfoHeader;
bmpInfo.bmiColors->rgbBlue = 0;
bmpInfo.bmiColors->rgbGreen = 0;
bmpInfo.bmiColors->rgbRed = 0;
bmpInfo.bmiColors->rgbReserved = 0;

g_hImageBitmap = CreateDIBSection(hDC, &bmpInfo, DIB_RGB_COLORS, &bits, NULL, 0);
GetObject(g_hImageBitmap, sizeof(BITMAP), &ImageBitmap);

for (i = 0; i < IMAGE_DISPLAY_WIDTH; i++) {
    for (j = 0; j < IMAGE_DISPLAY_HEIGHT; j++) {
        ((unsigned char *)bits)[j*IMAGE_DISPLAY_WIDTH * 4 + i * 4] = 255;         // Blue
        ((unsigned char *)bits)[j*IMAGE_DISPLAY_WIDTH * 4 + i * 4 + 1] = 255;     // Green
        ((unsigned char *)bits)[j*IMAGE_DISPLAY_WIDTH * 4 + i * 4 + 2] = 255;     // Red
        ((unsigned char *)bits)[j*IMAGE_DISPLAY_WIDTH * 4 + i * 4 + 3] = 0;
    }
}

g_ImageBitmapPixels = bits;

和其他地方WM_PAINT像这样处理这个

hdc = BeginPaint(hwnd, &ps);

if (g_hImageBitmap != NULL) {
    GetObject(g_hImageBitmap, sizeof(BITMAP), &bm);
    hOldBitmap = (HBITMAP)SelectObject(hMemoryDC, g_hImageBitmap);
    BitBlt(hdc, UPPER_LEFT_IMAGE_X, UPPER_LEFT_IMAGE_Y,
        bm.bmWidth, bm.bmHeight, hMemoryDC, 0, 0, SRCCOPY);
    SelectObject(hMemoryDC, hOldBitmap);
}

给定全局变量g_ImageBitmapPixels程序的其他部分可以更改和操作位图中的单个像素,当发生这种情况时,我使用

InvalidateRect(hwnd, &RECT_ImageUpdate_Window, TRUE);
UpdateWindow(hwnd);

只更新屏幕的那一小部分。效果很好。万岁,对我来说。

为了达到目的,我的问题是,如果一个函数只有HBITMAP(g_hImageBitmap)...有没有办法调用Windows库函数来绘制线条,文本,圆圈,实心圆圈到HBITMAP ?像这些功能一样

MoveToEx(hDC, x1, y1, NULL);
LineTo(hDC, x2, y2 );

HBRUSH hRedBrush = CreateSolidBrush(RGB(255, 0, 0));
FillRect(hDC, &somerectangle, hRedBrush);

除了不需要设备上下文外,他们只需要HBITMAP吗?

我有一个指向实际像素的指针(g_ImageBitmapPixels),所以我可以只写我自己的线条图,圆形图,矩形填充函数。事实上我已经这样做了,但是如果不使用微软这么好的功能似乎是一种耻辱。另外,我不够聪明,不能制作自己的文字绘图功能。

感谢您的帮助。

0 个答案:

没有答案