【问题标题】:winapi c - any simple method for adding an image?winapi c - 添加图像的任何简单方法?
【发布时间】:2014-01-13 21:25:24
【问题描述】:

我是普通 winapi c 的新手,想知道是否有任何简单的方法可以将图像添加到我的 GUI,如果可能的话,我希望这个图像基本上是代码的一部分,这样我只需要发送单个可执行文件向其他人发送 GUI 时的文件。

编辑:

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HBITMAP g_hbmBall = NULL;
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    PWSTR pCmdLine, int nCmdShow)
{
  MSG  msg;    
  HWND hwnd;
  WNDCLASSW wc;

  wc.style         = CS_HREDRAW | CS_VREDRAW;
  wc.cbClsExtra    = 0;
  wc.cbWndExtra    = 0;
  wc.lpszClassName = L"Window";
  wc.hInstance     = hInstance;
  wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
  wc.lpszMenuName  = NULL;
  wc.lpfnWndProc   = WndProc;
  wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
  wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);

  RegisterClassW(&wc);
  hwnd = CreateWindowW( wc.lpszClassName, L"Window",
                WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                100, 100, 350, 250, NULL, NULL, hInstance, NULL);  

  ShowWindow(hwnd, nCmdShow);
  UpdateWindow(hwnd);

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

  return (int) msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, 
    WPARAM wParam, LPARAM lParam)
{
  switch(msg)  
  {
    case WM_CREATE:
            g_hbmBall = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BALL));
            if(g_hbmBall == NULL)
                MessageBox(hwnd, "Could not load IDB_BALL!", "Error", MB_OK | MB_ICONEXCLAMATION);
        break;

case WM_PAINT:
        {
            BITMAP bm;
            PAINTSTRUCT ps;

            HDC hdc = BeginPaint(hwnd, &ps);

            HDC hdcMem = CreateCompatibleDC(hdc);
            HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, g_hbmBall);

            GetObject(g_hbmBall, sizeof(bm), &bm);

            BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);

            SelectObject(hdcMem, hbmOld);
            DeleteDC(hdcMem);

            EndPaint(hwnd, &ps);
        }
        break;

    case WM_DESTROY:

      PostQuitMessage(0);
      DeleteObject(g_hbmBall);
      return 0;      
  }

  return DefWindowProcW(hwnd, msg, wParam, lParam);
}

【问题讨论】:

    标签: c winapi window


    【解决方案1】:

    您可以在编译时通过.rc 文件将图像数据添加到可执行文件的资源中,然后在运行时通过LoadImage() 加载图像。如果您在 UI 上放置了STATIC 控件,则可以向其发送STM_SETIMAGE 消息以显示图像。

    【讨论】:

      【解决方案2】:

      图像应该是bitmap,您应该使用resource editor 将其作为资源并使用LoadBitmapLoadImage 将其加载到您的exe 中。使用 BitBltStretchBltTransparentBlt 来绘制它(如果你想缩小/放大它以适应你的窗口,请使用最后两个 -TransparentBlt 也使你的图像的一部分透明 - 请参阅文档)。完成后不要忘记删除资源 - 通常在 WM_CLOSE 处理程序中使用 DeleteObject API。

      编辑:


      正如 Remy Lebeau 所说,您可以通过在窗口上放置一个静态控件并将其设置为显示图像来使用解决方法。我不知道什么更适合你,因为你的帖子信息匮乏。我仍然建议使用GDI 来绘制图片,因为您可以尝试使用各种拉伸模式来提高图像质量。


      This 教程有一些示例,总体上适合学习Win32 API

      祝你好运。

      最好的问候。

      【讨论】:

      • 我已将图像作为资源添加到我的 IDE (test1.rc),但在理解如何将其添加到我的代码中时遇到问题,请您以简单的窗口代码为例附在上面?我非常感谢帮助。谢谢。
      • @RahulKhosla:只需阅读我的答案中提供的教程-here 是示例的链接。它显示了如何加载资源以及如何显示它。 从教程链接下载源代码和 PDF。源代码将向您展示如何准确地做您需要的事情。如果您需要进一步的帮助,请留下另一条评论,我会提供帮助。最好的问候。
      • 谢谢,我没有意识到有这么多有用的示例是免费的!我试图修改我的代码,请参阅上面的编辑,我一直收到一条错误消息,提示错误 #2048: Undeclared identifier 'IDB_BALL',据我了解,这应该是我导入并调用的 rc 的名称,但我不断收到此错误,请您帮我解决这个问题。
      • @RahulKhosla:g_hbmBall = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BALL));->更改为 g_hbmBall = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_YOURIMAGE));。您只需要在您的资源文件中传递您的图像查找 ID,它是如何存储的。在Visual Studio 打开.rc 文件并查看图片的ID,它应该类似于IDB_SOMETHING。不如按照我向您展示的方式将其作为最后一个参数传递。
      猜你喜欢
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多