彩绘图像始终为黑色

时间:2015-06-04 15:37:21

标签: c++ winapi memory gdi

我尝试在弹出窗口中绘制图像。我从流中获取位图信息。那部分应该没问题,因为如果我创建一个文件并保存位图,它看起来很好。

字节数组存储如下:

static BYTE*                            _bitampContent;

以下是我创建窗口的方法:

static WCHAR name[] = L"Bitmap Display";

    HINSTANCE _instance = ::GetModuleHandle(NULL);
    HWND hWnd;
    MSG msg;
    WNDCLASS wndClass;
    wndClass.style = 0;
    wndClass.lpfnWndProc = class::_WindowProc;
    wndClass.cbClsExtra = 0;
    wndClass.cbWndExtra = 0;
    wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndClass.hInstance = _instance;
    wndClass.lpszMenuName = NULL;
    wndClass.lpszClassName = name;

    if (RegisterClass(&wndClass) == 0)
    {
        MessageBox(0, L"The Window is not registered", L"Message", MB_OK);
        return 0;
    }
    RECT rc;
    GetWindowRect(hwndOwner, &rc);
    int xPos = (GetSystemMetrics(SM_CXSCREEN) - rc.right) / 2;
    int yPos = (GetSystemMetrics(SM_CYSCREEN) - rc.bottom) / 2;
    hWnd = CreateWindowEx(WS_EX_TOPMOST, name, name, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 200, 200, NULL, NULL, _instance, NULL);

    if (hWnd == 0)
    {
        MessageBox(0, L"hWnd = 0", L"Message", MB_OK);
        return 0;
    }

    ShowWindow(hWnd, SW_SHOWNORMAL);
    UpdateWindow(hWnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    msg.wParam;

WndProc函数中绘制位图。

LRESULT CALLBACK class::_WindowProc(HWND hWnd, UINT uMsgId, WPARAM wParam, LPARAM lParam)
{
    HBITMAP hbitmap;
    BITMAP bitmap;
    HDC hdc, hmemdc;

switch (uMsgId)
{
case WM_PAINT:

    BITMAPINFOHEADER bmpInfoHeader;
    bmpInfoHeader = { 0 };
    bmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmpInfoHeader.biBitCount = 24;
    bmpInfoHeader.biClrImportant = 0;
    bmpInfoHeader.biClrUsed = 0;
    bmpInfoHeader.biCompression = BI_RGB;
    bmpInfoHeader.biHeight = 200;
    bmpInfoHeader.biWidth = 200;
    bmpInfoHeader.biPlanes = 1;
    unsigned long pixel_data_size;
    pixel_data_size = 200 * ((200 * (24 / 8)));
    bmpInfoHeader.biSizeImage = pixel_data_size;

    BITMAPINFO dbmi;
    ZeroMemory(&dbmi, sizeof(dbmi));
    dbmi.bmiHeader = bmpInfoHeader;
    dbmi.bmiColors->rgbBlue = 0;
    dbmi.bmiColors->rgbGreen = 0;
    dbmi.bmiColors->rgbRed = 0;
    dbmi.bmiColors->rgbReserved = 0;
    void* bits;
    bits = NULL;

    hbitmap = CreateDIBSection(NULL, &dbmi, DIB_RGB_COLORS, &bits, NULL, 0);
    if (hbitmap == NULL) {
        MessageBox(NULL, L"Bitmap not loaded", L"Error", MB_OK);
        return 0;
    }
    GdiFlush();
    // copy pixels into DIB.
    memcpy(bits, _bitampContent, sizeof(_bitampContent));

    GetObject(hbitmap, sizeof(BITMAP), &bitmap);
    PAINTSTRUCT paintStruct;
    hdc = BeginPaint(hWnd, &paintStruct);
    hmemdc = CreateCompatibleDC(hdc);
    SelectObject(hmemdc, hbitmap);
    BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hmemdc, 0, 0, SRCCOPY);

    DeleteObject(hbitmap);
    EndPaint(hWnd, &paintStruct);
    return 0;

现在我的问题是,绘制的图像总是黑色的。我认为这种行为与DC有关,但我不确切知道是什么。

我需要改变什么?

0 个答案:

没有答案