【问题标题】:C++ Win32 Background ImageC++ Win32 背景图片
【发布时间】:2024-01-22 11:43:02
【问题描述】:

我看过一些背景绘图教程,但我仍然无法绘制我的背景;它总是白色的。我的资源已经在项目中。我尝试了其他几种方法,改用paint,但它仍然无法绘制背景图像。

#include <windows.h>
#include <commctrl.h>
#include "resource.h"
HINSTANCE hInst;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
HWND hProgress, hWndBottom;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    hInst = hInstance;
    MSG msg          = {0};
    WNDCLASS wc      = {0}; 
    wc.lpfnWndProc   = WndProc;
    wc.hInstance     = hInstance;
    wc.hbrBackground = CreatePatternBrush( LoadBitmap( hInstance, MAKEINTRESOURCE(IDB_BG) ));//(HBRUSH)(COLOR_BACKGROUND);
    wc.lpszClassName = "Test";
    if( !RegisterClass(&wc) )
        return 1;
    if( !CreateWindow(wc.lpszClassName,
               "Tests",
               WS_POPUPWINDOW|WS_VISIBLE, //WS_OVERLAPPEDWINDOW|WS_VISIBLE
               1,1,200,250,0,0,hInstance,NULL))
        return 2;
    while( GetMessage( &msg, NULL, 0, 0 ) > 0 )
        DispatchMessage( &msg );
    return 0;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    //Make TopMost
    ::SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
    INITCOMMONCONTROLSEX InitCtrlEx;
    InitCtrlEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
    InitCtrlEx.dwICC  = ICC_PROGRESS_CLASS;

    SendMessage(hProgress, PBM_SETRANGE, 0, MAKELPARAM(0, 100)); 
    switch(message)
    {
    case WM_CREATE:
        {
             hProgress = CreateWindowEx(0, PROGRESS_CLASS, NULL,
                   WS_CHILD | WS_VISIBLE | PBS_SMOOTH,
                   10, 190, 170, 10,
                   hWnd, NULL, hInst, NULL);
        }
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}  

【问题讨论】:

  • 我无法重现该问题。检查CreatePatternBrushLoadBitmap的返回值。

标签: c++ winapi window draw


【解决方案1】:

如果要为背景绘制位图,只需将背景画笔设置为位图的句柄即可。

相反,您将背景画笔设置为 NULL,并处理 WM_ERASEBKGND 消息。您通过绘制位图来响应它(例如,使用BitBltStretchBlt),然后返回TRUE(或任何其他非零值)以告诉DefWindowProc 背景已被擦除,所以它不应该尝试删除它。

请注意,如果您在 MDI 程序中执行此操作,则需要在 MDI 客户端窗口中执行此操作。使用 MDI,您有一个父窗口、一个客户端窗口和一些 MDI 子窗口。看起来主窗口的背景实际上被 MDI 客户端窗口占据了,所以这就是您需要在背景中绘制的位置。

【讨论】:

  • 不行,CreatePatternedBrush可以这样用