记录我的Windows编程(三)GDI+贴张图片

上次我用GDI成功贴图,但是比较可惜的是只能用Bitblt贴bmp图像,这种bmp的图像有很多缺点,比如比较大,不能透明等等。

现在我们可以用GDI+来解决这个问题,比起BMP图像,我更喜欢png这种格式的图像,这种压缩的图像内存小,无损压缩,而且有透明度。

想使用GDI+,就要先引入GDI+。

以下是GDI+绘图的核心内容:

#-----------------------------------------------核心内容---------------------------------------------#
#include //引入gdi+头文件
#pragma comment(lib, "Gdiplus.lib")//导入GDI+的库 
using namespace Gdiplus;//名字空间
ULONG_PTR gdiplusToken; 
GdiplusStartupInput gdiplusStartupInput;  //定两个变量
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);//开始使用GDI+
Graphics mygraphics(GetDC(hWnd));//获取设备
mygraphics.DrawImage(&myImage,100,100);//调用drawimage绘图
GdiplusShutdown(gdiplusToken); //结束使用GDI+
#-----------------------------------------------核心内容-----------------------------------------------#
然后在我们上次得到的代码中添加这些内容,就会变成下面这样:


#include 
#include 
#include 
#include 
#include //引入gdi+头文件

#pragma comment(lib, "Gdiplus.lib")//导入GDI+的库 
using namespace std;
using namespace Gdiplus;
ULONG_PTR gdiplusToken;  
GdiplusStartupInput gdiplusStartupInput;  


//1.设计一个窗口类
//2.注册窗口类
//3.创建窗口
//4.显示及更新窗口
//5.消息循环
//6.窗口函数

static TCHAR szWindowClass[] = _T("win32app");
static TCHAR szTitle[] = _T("测试程序");
HINSTANCE hInst;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

//设计一个窗口类
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);
	wcex.style          = CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc    = WndProc;
	wcex.cbClsExtra     = 0;
	wcex.cbWndExtra     = 0;
	wcex.hInstance      = hInstance;
	wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
	wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName   = NULL;
	wcex.lpszClassName  = szWindowClass;
	wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));


	hInst=hInstance;//hinstance赋值全局变量
	

//注册窗口类
	if (!RegisterClassEx(&wcex))
	{
		MessageBox(NULL,_T("Call to RegisterClassEx failed!"),_T("Win32 Guided Tour"),NULL);
		return 1;
	}

//创建窗口
	HWND hWnd = CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,1024, 768,NULL,NULL,hInstance,NULL);

//显示及更新窗口
	ShowWindow(hWnd,nCmdShow);
	UpdateWindow(hWnd);

//消息循环
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return (int) msg.wParam;

	

}

//消息处理函数

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);//开始使用GDI+

	Graphics mygraphics(GetDC(hWnd));//获取设备
	PAINTSTRUCT ps;
	HDC hdc;
	
	switch (message)
	{
		case WM_PAINT:
		{
			hdc = BeginPaint(hWnd, &ps); //开始使用GDI
	
			Image myImage(L"images\\1_01.png");//读取位置
			mygraphics.DrawImage(&myImage1,100,100);

			EndPaint(hWnd, &ps);//结束使用GDI
			return 0;
		}
		case WM_DESTROY:
		{	
			PostQuitMessage(0);
			break;
		}
		default:
		{
			return DefWindowProc(hWnd, message, wParam, lParam);
			break;
		}
	}

	GdiplusShutdown(gdiplusToken); //结束使用GDI+
	return 0;
}

把1_01.png放在image文件夹下面,可以自己创建一个,在你的程序集中创建,这样可以使用相对路径,你的程序包可以移动到其他位置也能显示图片了。

调试运行:

记录我的Windows编程(三)GDI+贴张图片_第1张图片

好了,是不是比GDI更省事呢,不过要注意的就是这里image使用的路径必须要用w_char的形式,不要用char数组,所以前面要加上L“”,这种东西如果明白不了,要多看看字符集的内容然后就能随心所欲的转换了。



你可能感兴趣的:(windows编程实例)