C++ WINAPI 设置窗口背景图像不起作用

标签 c++ winapi background window

我讨厌我以前做过,我觉得我错过了什么,我不知道它是什么。因此,我尝试在 C++ WinAPI 中设置窗口的背景图像。

我的资源.rc

#include "Resources.h"

BACKGROUND BITMAP "background.bmp"

我的资源.h

#define BACKGROUND 200

我的 main.cpp

....
WNDCLASSEX wcls;
wcls.cbSize         = sizeof(WNDCLASSEX);
wcls.style          = CS_PARENTDC|CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
wcls.lpfnWndProc    = WndProc;
wcls.cbClsExtra     = 0;
wcls.cbWndExtra     = 0;
wcls.hInstance      = hInstance;
wcls.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(HICON));
wcls.hCursor        = LoadCursor(NULL, IDC_ARROW);
wcls.hbrBackground  = HBRUSH(COLOR_WINDOW + 1);
wcls.lpszClassName  = L"WndClass";
wcls.hIconSm        = LoadIcon(hInstance, MAKEINTRESOURCE(HICON));

HWND Window = CreateWindowEx (
                             WS_EX_LAYERED|WS_EX_TOOLWINDOW,
                             wcls.lpszClassName,
                             L"Window Title",
                             WS_VISIBLE|WS_POPUP|WS_CLIPCHILDREN,
                             CW_USEDEFAULT,
                             CW_USEDEFAULT,
                             384,
                             128,
                             NULL,
                             NULL,
                             hInstance,
                             NULL
                             );

if (!Window ) return 0;

SetLayeredWindowAttributes(
                           Window,
                           RGB(35, 35, 35),
                           85,
                           LWA_ALPHA|LWA_COLORKEY
                           );

SetWindowPos(
             Window,
             HWND_TOPMOST,
             0,
             0,
             0,
             0,
             SWP_NOMOVE|SWP_NOREDRAW|SWP_NOSIZE
             );

ShowWindow(Window, SW_SHOWNORMAL);
UpdateWindow(Window);


LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM Wpar, LPARAM Lpar) {
HBITMAP Background = NULL;
BITMAP BgImg;
HDC DeviceContext, BgContext;
PAINTSTRUCT PaintStruct;

switch (Msg) {
    case WM_PAINT:  
         ContextLansator = BeginPaint(hWnd, &PaintStruct);
         Fundal = LoadBitmap(hInstance, MAKEINTRESOURCE(BACKGROUND)); 
         FundalLansator = CreateCompatibleDC(DeviceContext);
         SelectObject(DeviceContext, Background);
         GetObject(Background, sizeof(BgImg), &BgImg);
         BitBlt(DeviceContext, 0, 0, 384, 128, BgContext, 0, 0, SRCAND);
         DeleteObject(Background);
         DeleteDC(BgContext);
         EndPaint(hWnd, &PaintStruct);
    break;
.....

我正在使用 Code::Blocks。资源嵌入正确,窗口启动但只有白色背景,图像未绘制。 WM_PAINT 消息在开始时被调用一次。我觉得 BgImg 有问题,但我不知道是什么。需要一些帮助!谢谢!

最佳答案

在注册类之前创建一个PatternBrush并将其设置为背景。例如:

ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINAPIBACKGROUND));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = CreatePatternBrush(LoadBitmap( hInstance, MAKEINTRESOURCE( IDB_BITMAP1 ) ) );
    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_WINAPIBACKGROUND);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassEx(&wcex);
}

看起来像这样: enter image description here

位图深度应该无关紧要。但是请查看您的实现中的样式。

enter image description here

关于C++ WINAPI 设置窗口背景图像不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11225311/

相关文章:

c++ - 字符串流提取不起作用

android - 后台 Android 应用程序可以截取当前 Activity 屏幕的屏幕截图吗?

qt - 如何在无边框窗口中保持阴影

c++ - 如何在 OpenGL 或 Win32 中获取显卡型号名称?

html - 使用 div 上的固定背景图像修复滚动性能

ios - NSOperationQueue 和后台支持

c++ - 将 C/C++ 代码作为 MEX 文件调用与纯 C/C++

c++ - 如何为 CLion 中的每个配置定义预处理器定义?

c++ - 指针新手

c++ - 如何从 AM_MEDIA_TYPE 中获取 MEDIASUBTYPE 的名称,c++