如何在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);
}
效果是这样的(忽略我用的不好看的图片):
后期编辑:
我意识到错误不是我的代码,而是图像本身。不要使用在线工具将 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);
}
效果是这样的(忽略我用的不好看的图片):