Windows 未显示gdi plus图像
我希望OnPaint函数中的graphics.DrawImage(image,0,0)在使用下面的程序时显示从文件读取的图像。而是为应用程序获取一个白色画布。 我做错了什么 我正在windows 10上使用visual studio 2017社区。 谢谢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注释
/*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