如何在Windows API C++中将BMP图像设置为window的背景?

How to set a BMP image as the background of a window in Windows API C++?

后期编辑:

我意识到错误不是我的代码,而是图像本身。不要使用在线工具将 jpg 转换为 bmp,因为它们不提供可用的图像。我所做的是在 Paint 中打开 jpg,然后将其另存为 24 位位图(唯一保留原始颜色的位图)。

原版POST:

我正在尝试制作一个漂亮的家window作为游戏的一部分,但我对 WIN 32 中的很多东西都不了解。

我想创建一个 window,它也有一些按钮,我还想将其背景设置为 .bmp 图像,而不是纯色。如何将图像设置为背景(在 C++ 中)?

我说的图像保存为“bg1.bmp”,在我项目的第一个文件夹(连同源代码和 .cbp 文件)和 bin/Debug / 文件夹,.exe 所在的位置。我试图设置其背景的 window 具有句柄 hwnd.

我在定义windowclass时尝试定义背景,但这对window没有任何改变:

wincl.hbrBackground=CreatePatternBrush((HBITMAP) LoadImage(0,_T("bg1.bmp"),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE));

并且还有另一个相同大小的静态 window 与主 window 重叠,这让我得到了黑色 window 而不是白色。

    background=CreateWindow("STATIC","background",SS_BITMAP|WS_CHILD | WS_VISIBLE,0,0,300,300,hwnd,NULL,NULL,NULL);
    HBITMAP hBmp = (HBITMAP)LoadImage(NULL, "seamless_background1.bmp", IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    SendMessage(background, STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBmp);

但是这个给了我一个黑色window。

你能告诉我代码有什么问题吗?另外,有没有更简洁的方法来做到这一点?

我使用相同的代码创建了最简单的 Windows 桌面应用程序。

并且我使用自己的bmp图片成功测试了背景和静态window图片。

我认为问题出在你的图像格式上,如果你只是将其他图像的后缀更改为.bmp,那么你的LoadImage将失败但GetLasterror将return 0.

我建议您尝试使用其他格式正确的 bmp 图片进行测试,这样您才能得到正确的结果。

这是我的样本:

#include <Windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[] = TEXT("test windows");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = CreatePatternBrush((HBITMAP)LoadImage(NULL, L"D:\VS_test_projects\win_api\bitmap.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE));;
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;
    if (!RegisterClass(&wndclass))
    {
        MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
    }

    hwnd = CreateWindow(szAppName,
        TEXT(""test windows""),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL);
    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);
    HWND background = CreateWindow(L"STATIC", L"background", SS_BITMAP | WS_CHILD | WS_VISIBLE, 0, 0, 300, 300, hwnd, NULL, NULL, NULL);
    HBITMAP hBmp = (HBITMAP)LoadImage(NULL, L"test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    int e = GetLastError();
    SendMessage(background, STM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBmp);
    while (GetMessageW(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessageW(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;
    switch (message)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

效果是这样的(忽略我用的不好看的图片):