1

以前にやったことが嫌いで、何かが足りないような気がして、それが何なのかわかりません。そこで、C++WinAPIでウィンドウの背景画像を設定しようとしています。

My Resources.rc

#include "Resources.h"

BACKGROUND BITMAP "background.bmp"

My Resources.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メッセージは、最初に1回呼び出されます。BgImgに何か問題があるように記入しますが、何がわかりません。いくつかの助けが必要です!ありがとう!

4

3 に答える 3

1

クラスを登録する前に、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);
}

次のようになります。 ここに画像の説明を入力してください

ビットマップの深さは重要ではありません。ただし、実装のスタイルを見てください。

ここに画像の説明を入力してください

于 2012-06-27T11:55:28.790 に答える
1

私はこのコードを使用し、それは私にとってはうまくいきます。私もコードブロック4.7を使用しています。

case WM_PAINT:
{
    PAINTSTRUCT     ps;
    HDC             hdc;
    BITMAP          bitmap;
    HDC             hdcMem;
    HGDIOBJ         oldBitmap;
    hBitmap01 = (HBITMAP)LoadImage(NULL, "c:\\energy.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);


    hdc = BeginPaint(wnd01, &ps);

    hdcMem = CreateCompatibleDC(hdc);
    oldBitmap = SelectObject(hdcMem, hBitmap01);

    GetObject(hBitmap01, sizeof(bitmap), &bitmap);
    BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);

    SelectObject(hdcMem, oldBitmap);
    DeleteDC(hdcMem);

    EndPaint(wnd01, &ps);
    }
于 2015-08-17T22:59:18.590 に答える
1

同様の症状であると私が考えるものに20時間取り組んだ後、私は解決策を見つけました。

私の問題はbitmapロードされていませんでした。ファイルが本当にbitmap正しく、コードが正しいことを確認しました。修正して再コンパイルしましたCode::Blocksが、ロードされませんでした(return = 0)。2つのフォルダBINOBJと2つのファイルxxx.dependとを削除してみてくださいxxx.layout。次に、再コンパイルして実行します。

于 2019-12-16T11:40:11.170 に答える