Win32 GUI c++ .bmp 图像未显示

Posted

技术标签:

【中文标题】Win32 GUI c++ .bmp 图像未显示【英文标题】:Win 32 GUI c++ .bmp The image is not showing 【发布时间】:2018-01-06 16:03:21 【问题描述】:

我实际上是在学习一个教程。我真的很想得到答案,因为我需要将图标添加到下一行的窗口中。第一步是让图像显示在窗口中。

抱歉,由于某种原因,我添加的更新之前没有通过。我的解决方案面向 Unicode。

更正后的更新文件如下:

#include <windows.h>
#include <commctrl.h>

using namespace std;

LPCWSTR szClassName = L"myWindowClass";

HWND hLogo;
HBITMAP hLogoImage;

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

void loadPictures();
void parentControls(HWND);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int icmdshow)


    HWND hWnd;

    WNDCLASSW wc =  0 ;

    wc.style = 0;
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szClassName;
    wc.lpfnWndProc = WndProc;
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.hInstance = hInstance;
    wc.hIcon = LoadIconW(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursorW(NULL, IDC_ARROW);
    wc.cbWndExtra = 0;
    wc.cbClsExtra = 0;


    if (!RegisterClassW(&wc))
    
        const wchar_t Error01[] = L"Register Issue To Check On : ";   /// Notice this 
        const wchar_t Error01_Caption[] = L"Error 01";

        MessageBoxW(NULL, Error01, Error01_Caption, MB_OK | MB_ICONERROR);

        return 0;
    

    LPCWSTR parentWinTitle = L"My Window";

    hWnd = CreateWindowW(szClassName, parentWinTitle, WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 250, 200, NULL, NULL, NULL, NULL);

    if (hWnd == NULL)
    

        const wchar_t Error02[] = L"Window Creation Issue To Check On : ";
        const wchar_t Error02_Caption[] = L"Window Creation Issue To Check On : ";
        MessageBoxW(NULL, Error02, Error02_Caption, MB_OK | MB_ICONERROR);

    
    ShowWindow(hWnd, icmdshow);
    UpdateWindow(hWnd);


    MSG msg =  0 ;

    while (GetMessageW(&msg, NULL, 0, 0))
    

        TranslateMessage(&msg);
        DispatchMessageW(&msg);

    

    return 0;


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)


    switch (message)
    
    case WM_CREATE:
        loadPictures();    /// Must be called first, Calling the Images function in Create
        parentControls(hWnd);
        break;      
/*  case WM_COMMAND:
        switch (wParam)
        

        
        break;
*/
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProcW(hWnd, message, wParam, lParam);
    
    return 0;



void parentControls(HWND hWnd)

    hLogo = CreateWindowW(WC_STATICW, NULL, WS_VISIBLE | WS_CHILD | SS_BITMAP, 70, 25, 100, 100, hWnd, NULL, NULL, NULL);
    SendMessageW(hLogo, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hLogoImage);


void loadPictures()
   /// bmp image save in file with main.cpp
    LPCWSTR myBmp = L"bitmap1.bmp";
    hLogoImage = (HBITMAP)LoadImageW(NULL, myBmp, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

【问题讨论】:

您没有检查返回值是否有错误,而且您似乎没有进行任何调试。为什么不呢? 你指的是我的寄存器的if语句吗? if(!RegisterClassW(&wc)) const char Error01[] = "注册要检查的问题:"; const char Error01_Caption[] = "错误 01"; MessageBoxEx(0, Error01, Error01_Caption, MB_OK | MB_ICONERROR, 0);返回-1; /// 这行不正确???我确实尝试过调试,但没有在窗口中使用 bmp 的经验,我迷路了。任何方向都有用... parentControls(hWnd);处下断点 添加了断点。在构建日志中显示“跳过链接阶段(构建目标没有要链接的目标文件)”。 我重新审视了调试,现在必须谦虚地承认我对此有错误的看法。我很高兴现在如此重视它。我什至让 Visual Studio C++ 工作得比冻结时更好。 【参考方案1】:
case WM_COMMAND:
    switch(wp)
    
    
break;
parentControls(hWnd); <--- never gets here
loadPictures();    /// Calling the Images function in Create
break;

parentControlsloadPictures 在此 switch 语句中永远不会到达。

应该先调用loadPictures

把这两行去掉,放到WM_CREATE中如下:

case WM_CREATE:
    loadPictures();    /// Calling the Images function in Create
    parentControls(hWnd);
    break;

【讨论】:

谢谢,我要强调的是,您在 WM_CREATE 中添加函数的顺序会有所不同。我有 ParentControls(hWnd);首先列出,下面是 loadPictures()。什么时候应该反过来。但是位图的颜色是关闭的。如果我可以问的话,有什么想法吗? 显示图片的样子。您可能必须以 24 位格式保存图像。我还建议使用 Visual Studio,它具有更好的调试器以及其他玩具。 Visual Studio 技巧是一个很好的技巧。我一直在试验它。代码块是我正在使用的,当你进行调试时它似乎没有做任何事情。我不得不承认,我没有尝试。我会使用代码来清除错误。我下载了2017社区版。使用它进行调试的区别马上就很明显了。很好看。 其实bmp是正确的。即Results when program ran 花了一点时间弄清楚如何在 cmets 中添加图片。顺便说一句:非常感谢您的帮助。总是很乐意提供帮助。 mae45【参考方案2】:

有人告诉我答案应该在这里而不是在上面更新。如果我在这里添加它,我相信我会意识到这是错误的。我认为这就是为什么我之前在上面的原始帖子中尝试过更新时没有进行更新的原因。无论哪种方式,更新/答案都在下面。

#include <windows.h>
#include <commctrl.h>

using namespace std;

LPCWSTR szClassName = L"myWindowClass";

HWND hLogo;
HBITMAP hLogoImage;

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

void loadPictures();
void parentControls(HWND);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int icmdshow)


    HWND hWnd;

    WNDCLASSW wc =  0 ;

    wc.style = 0;
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szClassName;
    wc.lpfnWndProc = WndProc;
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wc.hInstance = hInstance;
    wc.hIcon = LoadIconW(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursorW(NULL, IDC_ARROW);
    wc.cbWndExtra = 0;
    wc.cbClsExtra = 0;


    if (!RegisterClassW(&wc))
    
        const wchar_t Error01[] = L"Register Issue To Check On : ";   /// Notice this 
        const wchar_t Error01_Caption[] = L"Error 01";

        MessageBoxW(NULL, Error01, Error01_Caption, MB_OK | MB_ICONERROR);

        return 0;
    

    LPCWSTR parentWinTitle = L"My Window";

    hWnd = CreateWindowW(szClassName, parentWinTitle, WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 250, 200, NULL, NULL, NULL, NULL);

    if (hWnd == NULL)
    

        const wchar_t Error02[] = L"Window Creation Issue To Check On : ";
        const wchar_t Error02_Caption[] = L"Window Creation Issue To Check On : ";
        MessageBoxW(0, Error02, Error02_Caption, MB_OK | MB_ICONERROR);

    
    ShowWindow(hWnd, icmdshow);
    UpdateWindow(hWnd);


    MSG msg =  0 ;

    while (GetMessageW(&msg, NULL, 0, 0))
    

        TranslateMessage(&msg);
        DispatchMessageW(&msg);

    

    return 0;


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)


    switch (message)
    
    case WM_CREATE:
        loadPictures();    /// Must be called first, Calling the Images function in Create
        parentControls(hWnd);
        break;      
/*  case WM_COMMAND:
        switch (wParam)
        

        
        break;
*/
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProcW(hWnd, message, wParam, lParam);
    
    return 0;



void parentControls(HWND hWnd)

    hLogo = CreateWindowW(WC_STATICW, NULL, WS_VISIBLE | WS_CHILD | SS_BITMAP, 70, 25, 100, 100, hWnd, NULL, NULL, NULL);
    SendMessageW(hLogo, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hLogoImage);


void loadPictures()
   /// bmp image save in file with main.cpp
    LPCWSTR myBmp = L"bitmap1.bmp";
    hLogoImage = (HBITMAP)LoadImageW(NULL, myBmp, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

【讨论】:

以上是关于Win32 GUI c++ .bmp 图像未显示的主要内容,如果未能解决你的问题,请参考以下文章

调整大小的 opencv 图像在 QWidget C++ 上未正确显示

尝试在 python 中加载 bmp 图像时,数组列的顺序未对齐

无法加载 .bmp 文件 win32 [重复]

C++ Win32 GUI switch 语句错误

使用内联 ASM c++ 显示 640x480 BMP 图像

将 GLubyte* 转换为 GLuint* 用于 alpha 纹理 Opengl 3.0 / c++ / Win32