簡體   English   中英

如何將BMP圖像設置為Windows API ZF6F87C9FDCF8B3C3F07F93F1EE8中的window的背景?

[英]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.

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