[英]How to set a BMP image as the background of a window in Windows API C++?
后期編輯:
我意識到出了問題的不是我的代碼,而是圖像本身。 不要使用在線工具從 jpg 轉換為 bmp,因為它們不提供可用的圖像。 我所做的是在 Paint 中打開 jpg,然后將其保存為 24 位 Bitmap(唯一保留我原始顏色的)。
原帖:
我正在嘗試制作一個漂亮的 window 作為游戲的一部分,但我不了解 WIN 32 中的很多東西。
我想創建一個 window 也將有一些按鈕,我還想將其背景設置為 a.bmp 圖像,而不是純色。 如何將圖像設置為背景(在 C++ 中)?
我正在談論的圖像保存為“bg1.bmp”,在我的項目的第一個文件夾(連同源代碼和.cbp 文件)和.exe 所在的bin/Debug/ 文件夾中。 我試圖設置其背景的 window 具有句柄 hwnd。
我在定義 window class 時嘗試定義背景,但這對 window 沒有任何改變:
wincl.hbrBackground=CreatePatternBrush((HBITMAP) LoadImage(0,_T("bg1.bmp"),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE));
並且還有另一個相同大小的 static window 與主 window 重疊,這給了我一個黑色 Z05B8C7425702FBF24DE4C1A 而不是白色
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圖像成功測試了背景和static window圖像。
我認為問題在於您的圖像格式,如果您只是將其他圖像的后綴更改為.bmp,那么您的 LoadImage 將失敗但GetLasterror
將返回 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);
}
它的工作原理是這樣的(忽略我使用的不漂亮的圖片):
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.