winapi c - 添加图像的任何简单方法?

时间:2014-01-13 21:25:25

标签: c winapi window

我是普通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);
}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

编辑:


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


This教程有一些例子,对于学习Win32 API一般都很好。

祝你好运。

最好的问候。