【问题标题】:How to set image to the button using Win32APi c++?如何使用 Win32APi c++ 将图像设置为按钮?
【发布时间】:2016-03-01 14:04:34
【问题描述】:

我需要为按钮设置图像。主要思想是使图像可点击,当点击它时会发生一些事件。

case WM_CREATE:
        HANDLE hBmp = (HBITMAP)LoadImage(GetModuleHandle(NULL), 
                                        MAKEINTRESOURCE(IDB_BITMAP1), 
                                        IMAGE_BITMAP, 
                                        NULL, 
                                        NULL,
                                        LR_DEFAULTCOLOR);
        HWND hButton = CreateWindow(L"button", L"Label",
            BS_BITMAP | WS_VISIBLE |WS_CHILD,
            10, 10,
            1366, 699,
            hWnd, (HMENU)MAP_BUTTON1,
            hInst, NULL);

        SendMessage(
            (HWND)hWnd,
            (UINT)BM_SETIMAGE,
            (WPARAM)IMAGE_BITMAP,
            (LPARAM)hBmp);
        break;

执行此操作后,我有类似 this 之类的东西

【问题讨论】:

  • 请阅读How do I ask a good question? 你需要解释你期望什么,你有什么。 “Something starnge” 不是有用的错误描述。你绝对需要检查错误。上面的 2 个 API 调用可能会失败,但您的代码不会对此进行检查。
  • @IInspectable 查看我附上的图片。在那里你可以看到一个大按钮的边框,但上面没有图像。我无法附上图片本身,因为我的声望不到 10。
  • 请不要以使已发布答案无效的方式编辑问题。

标签: c++ image winapi button


【解决方案1】:

我看到以下问题:

  • 您不进行任何错误检查。也许LoadImage 失败了。也许CreateWindow 失败了。
  • hBmp 的类型错误。应该是HBITMAP
  • 发送BM_SETIMAGE 时,您传递的是按钮父级的句柄,而不是按钮的句柄。

【讨论】:

  • 你能教怎么做吗?我在这里是因为我学习,但是当现在有人告诉我如何解决问题时,我感到非常难过。我添加了if (!CreateWindow(L"button", L"Label", BS_BITMAP | WS_VISIBLE | WS_CHILD, 10, 10, 1366, 699, hWnd, (HMENU)MAP_BUTTON1, hInst, NULL)) { MessageBox(hWnd, L"CreateWindow failed", L"Error", MB_OKCANCEL); return NULL; }LoadImage 功能,但仍然没有任何反应。以及如何将BM_SETIMAGE 直接发送到按钮?
  • 我建议您解决所有三个问题。似乎很清楚该按钮已创建,因此对 CreateWindow 进行错误检查的建议是更一般的建议。 LoadImage 是否成功?为什么将BM_SETIMAGE 发送到错误的窗口?请仔细阅读所有三个要点。
  • 对不起,我理解不正确。发送BM_SETIMAGE 的正确窗口是什么?如何检查LoadImage是否成功?
  • @DavidArutiunian:您将按钮消息发送到您在上面一行创建的按钮控件 (hButton)。 SO不是教学和学习的地方。如果您想学习,请阅读Learn to Program for Windows in C++ 的系列教程。
  • @DavidArutiunian:在这种情况下,请考虑阅读Teach Yourself Programming in Ten Years。简而言之:在不知道自己在做什么的情况下,您将无法编写应用程序。为什么你签了一个零技能的 Win32 应用程序合同,这超出了我的理解,而且非常不专业。无论如何,这个答案用非常简单的术语解决了您遇到的问题。如果你遇到这个问题,你还不如放弃。
【解决方案2】:

不要覆盖@David Heffernan 的答案,这里有一个提示;

另外,按钮不需要提示,只需将其设置为 NULL;

【讨论】:

  • 我解决了这个问题。我将此代码表单 WM_CREATE 移动到 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
猜你喜欢
  • 2011-02-15
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 2012-04-06
相关资源
最近更新 更多