Windows 未显示gdi plus图像

Windows 未显示gdi plus图像,windows,visual-c++,gdi+,Windows,Visual C++,Gdi+,我希望OnPaint函数中的graphics.DrawImage(image,0,0)在使用下面的程序时显示从文件读取的图像。而是为应用程序获取一个白色画布。 我做错了什么 我正在windows 10上使用visual studio 2017社区。 谢谢 /*https://msdn.microsoft.com/en-us/library/vs/alm/ms533895(v=vs.85).aspx*/ #定义UNICODE #包括 #包括 #包括 使用名称空间Gdiplus; #pragma注释

我希望OnPaint函数中的graphics.DrawImage(image,0,0)在使用下面的程序时显示从文件读取的图像。而是为应用程序获取一个白色画布。 我做错了什么

我正在windows 10上使用visual studio 2017社区。 谢谢

/*https://msdn.microsoft.com/en-us/library/vs/alm/ms533895(v=vs.85).aspx*/
#定义UNICODE
#包括
#包括
#包括
使用名称空间Gdiplus;
#pragma注释(lib,“Gdiplus.lib”)
#pragma注释(lib,“User32.lib”)
#pragma注释(lib,“Gdi32.lib”)
VOID OnPaint(HDC HDC,图像*图像)
{
图形(hdc);
graphics.DrawImage(图像,0,0);
}
LRESULT回调WndProc(HWND、UINT、WPARAM、LPARAM);
INT WINAPI WinMain(HINSTANCE HINSTANCE、HINSTANCE、PSTR、INT iCmdShow)
{
HWND-HWND;
味精;
WNDCLASS WNDCLASS;
GdiplusStartupInput GdiplusStartupInput;
ULONG_PTR gdiplusToken;
//初始化GDI+。
GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL);
wndClass.style=CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc=WndProc;
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hInstance=hInstance;
wndClass.hIcon=LoadIcon(空,IDI_应用程序);
wndClass.hCursor=LoadCursor(空,IDC_箭头);
wndClass.hbrBackground=(HBRUSH)GetStockObject(白色画笔);
wndClass.lpszMenuName=NULL;
wndClass.lpszClassName=文本(“GettingStarted”);
注册表类(&wndClass);
hWnd=CreateWindow(
TEXT(“GettingStarted”),//窗口类名称
文本(“入门”),//窗口标题
WS\u重叠窗口,//窗口样式
CW_USEDEFAULT,//初始x位置
CW\U USEFAULT,//初始y位置
CW\u usefault,//初始x大小
CW\u usefault,//初始y大小
NULL,//父窗口句柄
NULL,//窗口菜单句柄
hInstance,//程序实例句柄
NULL);//创建参数
显示窗口(hWnd、iCmdShow);
更新窗口(hWnd);
while(GetMessage(&msg,NULL,0,0))
{
翻译信息(&msg);
发送消息(&msg);
}
GdiplusShutdown(gdiplusToken);
返回msg.wParam;
}//温曼
LRESULT回调WndProc(HWND HWND,UINT消息,
WPARAM WPARAM,LPARAM LPARAM)
{
HDC-HDC;
PAINTSTRUCT-ps;
Image*Image=NULL;
开关(信息)
{
案例WM_创建:
//创造形象
MessageBox(NULL,L“small.png”,L“File Path”,MB_OK);
图像=新图像(L“small.png”);
如果(图像)
返回0;
其他的
返回-1;
案例WM_油漆:
hdc=开始喷漆(hWnd和ps);
OnPaint(hdc、图像);
端漆(hWnd和ps);
返回0;
案例WM_销毁:
PostQuitMessage(0);
返回0;
违约:
返回DefWindowProc(hWnd、message、wParam、lParam);
}
}//WndProc

该错误是由Hans Passant指出的-WndProc中的
image
参数被重置为NULL且
图形。DrawImage(image,0,0)
没有显示任何内容。

当您收到WM_PAINT消息时,
image
变量将再次为NULL。使用调试器很容易看到。您可以将其声明为
static
,作为一种变通方法。谢谢Hans。我将“图像”设置为静态,图像按预期显示!
/* https://msdn.microsoft.com/en-us/library/vs/alm/ms533895(v=vs.85).aspx */

#define UNICODE
#include <windows.h>
#include <objidl.h>
#include <gdiplus.h>
using namespace Gdiplus;
#pragma comment (lib,"Gdiplus.Lib")
#pragma comment (lib,"User32.Lib")
#pragma comment (lib,"Gdi32.Lib")

VOID OnPaint(HDC hdc, Image * image)
{
   Graphics graphics(hdc);
   graphics.DrawImage(image,0,0);
}

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

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow)
{
   HWND                hWnd;
   MSG                 msg;
   WNDCLASS            wndClass;
   GdiplusStartupInput gdiplusStartupInput;
   ULONG_PTR           gdiplusToken;

   // Initialize GDI+.
   GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

   wndClass.style          = CS_HREDRAW | CS_VREDRAW;
   wndClass.lpfnWndProc    = WndProc;
   wndClass.cbClsExtra     = 0;
   wndClass.cbWndExtra     = 0;
   wndClass.hInstance      = hInstance;
   wndClass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
   wndClass.hCursor        = LoadCursor(NULL, IDC_ARROW);
   wndClass.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
   wndClass.lpszMenuName   = NULL;
   wndClass.lpszClassName  = TEXT("GettingStarted");

   RegisterClass(&wndClass);

   hWnd = CreateWindow(
      TEXT("GettingStarted"),   // window class name
      TEXT("Getting Started"),  // window caption
      WS_OVERLAPPEDWINDOW,      // window style
      CW_USEDEFAULT,            // initial x position
      CW_USEDEFAULT,            // initial y position
      CW_USEDEFAULT,            // initial x size
      CW_USEDEFAULT,            // initial y size
      NULL,                     // parent window handle
      NULL,                     // window menu handle
      hInstance,                // program instance handle
      NULL);                    // creation parameters

   ShowWindow(hWnd, iCmdShow);
   UpdateWindow(hWnd);

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

   GdiplusShutdown(gdiplusToken);
   return msg.wParam;
}  // WinMain

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, 
   WPARAM wParam, LPARAM lParam)
{
   HDC          hdc;   
   PAINTSTRUCT  ps;
   Image *image = NULL;
   switch(message)
   {
   case WM_CREATE:
       //create image
     MessageBox(NULL, L"small.png", L"File Path", MB_OK);
       image = new Image(L"small.png");
       if (image)
       return 0;
       else
       return -1;
   case WM_PAINT:
      hdc = BeginPaint(hWnd, &ps);
      OnPaint(hdc,image);
      EndPaint(hWnd, &ps);
      return 0;
   case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
   default:
      return DefWindowProc(hWnd, message, wParam, lParam);
   }
} // WndProc