Given only HBITMAP, how to draw to it?

I am absolutely new to this, but I managed to miss up to 93% of where I want to be. Need help for the last 7%.

I manually created a bitmap like this:

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;

and elsewhere WM_PAINT processes the drawing in this way

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);
}

Given the global variable g_ImageBitmapPixels, other parts of the program can modify and process individual pixels in a bitmap, and when this happens, I use

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

to refresh only that part of the screen. It works great. Hooray for me.

To understand, my question is: if a function has ONLY HBITMAP (g_hImageBitmap) ... is there a way to call Windows library functions to draw lines, text, circles, filled circles on HBITMAP? Like these features

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

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

besides using the device context, do they just take HBITMAP?

(g_ImageBitmapPixels), , , . , , , , , Microsoft . , , .

.

+4

All Articles