簡體   English   中英

GDI GradientFill在屏幕外位圖上不起作用

[英]GDI GradientFill not working on offscreen bitmap

我正在嘗試使用GDI GradientFill函數在屏幕外的位圖上繪制,然后將其BitBlt繪制到屏幕上。

但是我總是得到一個黑色的位圖...如果我將GradientFill直接填充到屏幕上,它將起作用。

下面是一個示例應用程序,了解我的意思。

#pragma comment(lib, "msimg32.lib")
#include <windows.h>

const CHAR c_szWndClass[] = "GradientTestWnd";
const CHAR c_szWndTitle[] = "GradientTest";
const int c_nWndWidth = 1024;
const int c_nWndHeight = 768;

int WINAPI WinMain(      
                   HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow
                   )
{
    WNDCLASSEX wcx;
    ZeroMemory(&wcx, sizeof(wcx));
    wcx.cbSize = sizeof(wcx);
    wcx.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    wcx.lpfnWndProc = DefWindowProc;
    wcx.hInstance = hInstance;
    wcx.lpszClassName = c_szWndClass;

    RegisterClassEx(&wcx);

    HWND hwndMain = CreateWindowEx(
        0,
        c_szWndClass,
        c_szWndTitle,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        c_nWndWidth,
        c_nWndHeight,
        NULL,
        NULL,
        hInstance,
        NULL);

    ShowWindow(hwndMain, SW_SHOW);

    HDC hdc;
    hdc = GetDC(hwndMain);

    HDC hdcOffscreen = CreateCompatibleDC(hdc);
    HBITMAP bitmap = CreateCompatibleBitmap(hdcOffscreen, c_nWndWidth, c_nWndHeight);
    HBITMAP old_bitmap = (HBITMAP) SelectObject(hdcOffscreen, bitmap);

    TRIVERTEX vertices[2];
    ZeroMemory(&vertices, sizeof(vertices));
    vertices[0].Red = 0xFF00;
    vertices[0].Green = 0x0000;
    vertices[0].Blue = 0x0000;
    vertices[0].x = 0;
    vertices[0].y = 0;

    vertices[1].Red = 0x0000;
    vertices[1].Green = 0x0000;
    vertices[1].Blue = 0xFF00;
    vertices[1].x = c_nWndWidth;
    vertices[1].y = c_nWndHeight;

    GRADIENT_RECT rects[1];
    ZeroMemory(&rects, sizeof(rects));
    rects[0].UpperLeft = 0;
    rects[0].LowerRight = 1;

    // This works
    //GradientFill(hdc, vertices, 2, rects, 1, GRADIENT_FILL_RECT_V);

    // This doesn't
    GradientFill(hdcOffscreen, vertices, 2, rects, 1, GRADIENT_FILL_RECT_V);
    BitBlt(hdc, 0, 0, c_nWndWidth, c_nWndHeight, hdcOffscreen, 0, 0, SRCCOPY);

    Sleep(5000);

    SelectObject(hdcOffscreen, old_bitmap);
    DeleteObject(bitmap);
    DeleteDC(hdcOffscreen);

    return 0;
}

這里的問題實際上是由於要從中創建兼容位圖的設備上下文的初始狀態引起的,在此行中:

HBITMAP bitmap = CreateCompatibleBitmap(hdcOffscreen, c_nWndWidth, c_nWndHeight);

hdcOffscreen應該改為hdc-這是因為在此處創建的設備上下文:

HDC hdcOffscreen = CreateCompatibleDC(hdc);

默認情況下,其中已選擇1x1單色位圖-當您嘗試從中創建兼容的位圖時,也會獲得單色位圖。 因此,如果您改為這樣做:

HBITMAP bitmap = CreateCompatibleBitmap(hdc, c_nWndWidth, c_nWndHeight);

應該看到您的漸變:)似乎可以回答的老問題,但我認為id可以幫助您弄清其為何不起作用!

詳細信息/鏈接:

http://msdn.microsoft.com/zh-CN/library/dd183489%28VS.85%29.aspx

創建內存DC時,其顯示表面正好是一個單色像素寬和一個單色像素高

http://msdn.microsoft.com/zh-cn/library/dd183488%28v=VS.85%29.aspx

由CreateCompatibleBitmap函數創建的位圖的顏色格式與hdc參數標識的設備的顏色格式匹配

hth :)

創建一個DIB而不是兼容的位圖。

更換

HBITMAP bitmap = CreateCompatibleBitmap(hdcOffscreen, c_nWndWidth, c_nWndHeight);

BITMAPINFO BitmapInfo;
memset(&BitmapInfo, 0, sizeof(BITMAPINFOHEADER));
BitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
BitmapInfo.bmiHeader.biWidth = c_nWndWidth;
BitmapInfo.bmiHeader.biHeight = c_nWndHeight;
BitmapInfo.bmiHeader.biPlanes = 1;
BitmapInfo.bmiHeader.biBitCount = 32;
BitmapInfo.bmiHeader.biCompression = BI_RGB;
HBITMAP bitmap = CreateDIBSection(hdcOffscreen, &BitmapInfo, DIB_RGB_COLORS, NULL, NULL, 0);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM