Direct2D 第5篇 绘制图像
我加载的图像是一张透明底PNG图像,背景使用渐变的绿色画刷
#include <windows.h>
#include <d2d1.h>
#include <d2d1helper.h>
#include <dwrite.h>
#pragma comment(lib, "dwrite.lib")
#pragma comment(lib, "d2d1.lib")
#include <wincodec.h>
HINSTANCE g_hinst;
HWND g_hwnd;
ID2D1Factory * g_factory;
ID2D1HwndRenderTarget * g_render_target;
ID2D1SolidColorBrush  * g_brush;
IDWriteFactory * g_write_factory;
IDWriteTextFormat * g_text_format;
ID2D1GradientStopCollection * g_gradient_stop_collection;
ID2D1LinearGradientBrush  * g_linear_gradient_brush;
ID2D1RadialGradientBrush * g_radial_gradient_brush;
IWICImagingFactory * g_image_factory = NULL;
ID2D1Bitmap * g_bitmap = NULL;
bool AppInit()
{
	CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
	D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &g_factory);
	RECT rc;
	GetClientRect(g_hwnd, &rc);
	g_factory->CreateHwndRenderTarget(
		D2D1::RenderTargetProperties(),
		D2D1::HwndRenderTargetProperties(g_hwnd, D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top)	),
		&g_render_target);
	g_render_target->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::WhiteSmoke), &g_brush);
	// Init Font
	DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED,__uuidof(g_write_factory),reinterpret_cast<IUnknown **>(&g_write_factory));
	g_write_factory->CreateTextFormat(L"Arial", NULL, DWRITE_FONT_WEIGHT_NORMAL,
		DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, 40, L"",&g_text_format);
	// Create Gradient Stops
	D2D1_GRADIENT_STOP gradient_stops[3];
	gradient_stops[0].color = D2D1::ColorF(D2D1::ColorF::LightGreen);
	gradient_stops[0].position = 0.0f;
	gradient_stops[1].color = D2D1::ColorF(D2D1::ColorF::DarkGreen);
	gradient_stops[1].position = 0.5f;
	gradient_stops[2].color = D2D1::ColorF(D2D1::ColorF::Green);
	gradient_stops[2].position = 1.0f;
	// Create Interface
	g_render_target->CreateGradientStopCollection(gradient_stops, 3, &g_gradient_stop_collection);
	// Create Linear Gradient Brush
	g_render_target->CreateLinearGradientBrush(
	D2D1::LinearGradientBrushProperties(D2D1::Point2F(0,0), D2D1::Point2F(600,600)),
		g_gradient_stop_collection, &g_linear_gradient_brush);
	g_render_target->CreateRadialGradientBrush(
		D2D1::RadialGradientBrushProperties(D2D1::Point2F(500,500),D2D1::Point2F(),1000.0f,1000.0f),
		g_gradient_stop_collection,&g_radial_gradient_brush);
	// Initialize Image Factory
	CoCreateInstance(CLSID_WICImagingFactory,NULL,CLSCTX_INPROC_SERVER,__uuidof(g_image_factory),(LPVOID*)&g_image_factory);
	IWICBitmapDecoder *bitmapdecoder = NULL;
	g_image_factory->CreateDecoderFromFilename(L"x.png",NULL,GENERIC_READ,WICDecodeMetadataCacheOnDemand,&bitmapdecoder);//
	IWICBitmapFrameDecode  *pframe = NULL;
	bitmapdecoder->GetFrame(0,&pframe);
	IWICFormatConverter * fmtcovter = NULL;
	g_image_factory->CreateFormatConverter(&fmtcovter);
	fmtcovter->Initialize(pframe,GUID_WICPixelFormat32bppPBGRA,WICBitmapDitherTypeNone,NULL,0.0f,WICBitmapPaletteTypeCustom);
	g_render_target->CreateBitmapFromWicBitmap(fmtcovter, NULL, &g_bitmap);
	fmtcovter->Release();
	pframe->Release();
	bitmapdecoder->Release();
	return true;
}
void OnSize(LPARAM lparam)
{
	if(g_render_target)
		g_render_target->Resize(D2D1::SizeU(LOWORD(lparam),HIWORD(lparam)));
}
void OnPaint()
{
	if(!g_render_target)
		return;
	g_render_target->BeginDraw();
	// Clear Background
	g_render_target->Clear(D2D1::ColorF(0.63, 0.84, 0.00)); 
	// Draw Ellipse
    D2D1_SIZE_F size = g_render_target->GetSize();
	D2D1_RECT_F r = {0, 0, size.width, size.height};
	g_render_target->FillRectangle(&r, g_linear_gradient_brush);
	//g_render_target->FillRectangle(&ellipse, g_linear_gradient_brush); 
	// Draw Image
	D2D1_RECT_F imgr = {0, 0, size.width, size.height};
	g_render_target->DrawBitmap(g_bitmap, imgr);
	// Draw Text
	//const wchar_t * text = L"Direct2D Draw Image";
	//g_render_target->DrawText(text, wcslen(text),
	//	g_text_format,
	//	D2D1::RectF(100, 190, size.width, size.height),
	//	g_brush);
	g_render_target->EndDraw();
}
void OnDestroy()
{
	g_bitmap->Release();
	g_image_factory->Release();
	g_linear_gradient_brush->Release();
	g_radial_gradient_brush->Release();
	g_gradient_stop_collection->Release();
	g_text_format->Release();
	g_write_factory->Release();
	g_brush->Release();
	g_render_target->Release();
	g_factory->Release();
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
	switch(msg)
	{
	case WM_PAINT:
		OnPaint();
		break;
	case WM_SIZE:
		OnSize(lparam);
		break;
	case WM_DESTROY:
		OnDestroy();
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hwnd, msg, wparam, lparam);
	}
	return 0;
}
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	WNDCLASSEX wc;
	MSG msg;  
	memset(&wc,0,sizeof(wc));
	wc.cbSize = sizeof(WNDCLASSEX);
	wc.lpfnWndProc = WndProc;
	wc.hInstance = hinst;
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.lpszClassName = "WindowClass";
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); 
	if(!RegisterClassEx(&wc))
	{
		MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}
	g_hinst = hinst;
	g_hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Direct2D Demo",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		640,
		480,
		NULL, NULL, hinst, NULL);
	if(g_hwnd == NULL)
	{
		MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}
	if(!AppInit())
	{
		MessageBox(NULL, "Application Initialisation Failed !","Error",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}
	while(GetMessage(&msg, NULL, 0, 0) > 0)
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}Direct2D 第5篇 绘制图像的更多相关文章
- Direct2D  第6篇 绘制多种风格的线条
		原文:Direct2D 第6篇 绘制多种风格的线条 上图是使用Direct2D绘制的线条,Direct2D在效率上比GDI/GDI+要快几倍,GDI/GDI+绘图是出了名的"慢", ... 
- Direct2D 第3篇 绘制文字
		原文:Direct2D 第3篇 绘制文字 #include <windows.h> #include <d2d1.h> #include <d2d1helper.h> ... 
- Direct2D 第2篇 绘制椭圆
		原文:Direct2D 第2篇 绘制椭圆 #include <windows.h> #include <d2d1.h> #include <d2d1helper.h> ... 
- 在web中绘制图像 -- canvas篇
		汗,不小心点击发布了.其实正在编辑中...... HTML Canvas是现代浏览器中非常棒的绘图技术,Canvas可以绘制图形,操作图片,制作游戏,创建动画等:Canvas是很容易使用的,下面我们来 ... 
- Linear regression with one variable算法实例讲解(绘制图像,cost_Function ,Gradient Desent, 拟合曲线, 轮廓图绘制)_矩阵操作
		%测试数据 'ex1data1.txt', 第一列为 population of City in 10,000s, 第二列为 Profit in $10,000s 1 6.1101,17.592 5. ... 
- Javascript高级编程学习笔记(90)—— Canvas(7) 绘制图像
		绘制图像 2D绘图上下文内置了对图像的支持 如果希望将一幅图绘制到画布上,可以使用 drawImage() 的方法 该方法有三种不同的参数数组合以对应不同的应用场景 将<img>绘制到画布 ... 
- iOS:quartz2D绘图(处理图像,绘制图像并添加水印)
		绘制图像既可以重写drawRect:方法并在该方法中绘制,也可以不用重写该方法,它有封装好的函数获取自己的图像绘制上下文,即UIGraphicsBeginImageContext(CGSize siz ... 
- canvas 绘制图像
		结果: 代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="U ... 
- python包matplotlib绘制图像
		使用matplotlib绘制图像 import matplotlib.pyplot as plt from matplotlib.pyplot import MultipleLocator impor ... 
随机推荐
- Linux常见问题解答--如何修复“tar:Exiting with failure status due to previous errors”
			问题: 当我用tar命令来创建一个压缩文件时,总在执行过程中失败,并且抛出一个错误说明"tar:由于前一个错误导致失败退出"("Exiting with failure ... 
- CAS(客户端)程序获取安全证书
			以下是获取安全证书的一种方法,通过以下程序获取安全证书: import java.io.BufferedReader; import java.io.File; import java.io.File ... 
- STL与泛型编程-练习2-GeekBand
			练习题目: struct Programmer{ Programmer(const int id, const std::wstring name): Id(id), Name(name){ } vo ... 
- python3.6.4安装错误0x80072efd
			是因为翻不了墙,请求URL错误,所以报错那么去掉Download debug sysbom选项 
- 比特承诺 Bit Commitment
			Introduction-A story Alice:股票经纪人 Bob:股民 Alice:你的钱交给我,我替你买股票,我专业,挣钱多! Bob:怎么证明? Alice:我们上月买进的1 ... 
- 模板:exlucas
			求$C_n^m mod p$,其中p不是质数且不保证p能分解为几个不同质数的乘积(也就是不能用crt合并) #include<iostream> #include<cstdio> ... 
- python 连接mssql数据库
			1.目标数据sql2008 R2 ComPrject=>TestModel 2.安装python 连接mssql 模块 运行 pip install pymssql-2.2.0.dev0-cp3 ... 
- 洛谷P3749 [六省联考2017]寿司餐厅
			传送门 题解 这几道都是上周llj讲的题,题解也写得十分好了,所以直接贴了几个链接和代码. //Achen #include<algorithm> #include<iostream ... 
- 大牛就别进来了.npm --save-dev --save 的区别
			--save-dev 是你开发时候依赖的东西,--save 是你发布之后还依赖的东西. 比如,你写 ES6 代码,如果你想编译成 ES5 发布那么 babel 就是devDependencies.如果 ... 
- redhat linux卸载自带的Java1.4.2安装JDK6
			一.卸载jdk1.4 由于Redhat Enterprise Linux 5.6 中自带安装了jdk1.4.2的,所以在安装jdk1.6前我把jdk1.4.2的卸了,步骤如下: 1.打开终端输入 yu ... 
