【问题标题】:Display BMP using CreateWindow使用 CreateWindow 显示 BMP
【发布时间】:2011-02-26 11:50:47
【问题描述】:

我想在屏幕顶部显示一个徽标。徽标是一个 bmp 文件。我制作了一个示例程序来展示完整工作代码中发生的情况:

#include <windows.h>
#include <commctrl.h>
#include <tchar.h>
#include "resource.h"

LRESULT CALLBACK WindowProcedure(HWND, UINT, WPARAM, LPARAM);

char szClassName[] = "BmpTestApp";

int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
{
    HWND hwnd;
    MSG messages;
    WNDCLASSEX wincl;

    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof(WNDCLASSEX);

    wincl.hIcon = NULL;
    wincl.hIconSm = NULL;
    wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;

    wincl.hbrBackground = (HBRUSH)COLOR_WINDOW;

    if(!RegisterClassEx(&wincl))
        return 0;

    DEVMODE display;
    EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &display);

    hwnd = CreateWindowEx(WS_OVERLAPPED, szClassName, "Bitmap Display Test", WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, HWND_DESKTOP, NULL, hThisInstance, NULL);
    ShowWindow(hwnd, nCmdShow);

    while(GetMessage(&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }

    return messages.wParam;
}

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        HWND logo;
        case WM_CREATE:
            RECT hwndRect;
            GetWindowRect(hwnd, &hwndRect);
            int winWidth;
            int winHeight;
            winWidth = hwndRect.right - hwndRect.left;
            winHeight = hwndRect.bottom - hwndRect.top;

            HBITMAP logoImage;
            logoImage = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_LOGO), IMAGE_BITMAP, winWidth - 180, winHeight - 530, LR_DEFAULTCOLOR);
            logo = CreateWindow(WC_STATIC, NULL, SS_BITMAP | SS_CENTER | WS_CHILD | WS_VISIBLE, 0, 0, winWidth - 180, winHeight - 530, hwnd, NULL, NULL, NULL);
            SendMessage(logo, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)logoImage);
            break;

        case WM_DESTROY:
            PostQuitMessage(0);
            break;

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

    return 0;
}


// resource.rc
IDB_LOGO BITMAP "Logo.bmp"

// resource.h
#define IDB_LOGO 300

当我运行我的程序时,只有一个图像大小的框,但里面没有图像。 Logo.bmp 肯定在我的 resource.rc 文件和所有其他项目文件所在的文件夹中。为什么不显示?谢谢。

【问题讨论】:

  • -1 代码(我正在写这个)不是真正的代码。

标签: c++ winapi bitmap


【解决方案1】:

你没有为你不处理的消息调用 DefWindowProc。

【讨论】:

  • 我发布的代码只是显示徽标的代码的一部分。我在default: 打电话给 DefWindowProc。
  • 你能给我们看一个完整的程序吗?还提供有关它如何失败和错误代码的详细信息。
  • 我现在刚刚将它编辑到我的问题中。没有错误代码,只是不显示图像。
  • 你怎么知道有错误?你不检查返回码?
【解决方案2】:

删除 SS_CENTER 样式标志,它与 SS_BITMAP 冲突。

【讨论】:

  • 同样的结果,不过还是谢谢,这可能是后来的问题。
  • SS_CENTER | SS_BITMAP == 0x0001 | 0x000e == 0x000f。这是 SS_ENHMETAFILE。这是完全错误的。也许还有其他问题,你不检查任何错误,所以一切皆有可能。还是谢谢。
猜你喜欢
  • 2020-08-25
  • 2015-01-13
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-23
相关资源
最近更新 更多