原文:Direct2D 第4篇 渐变画刷

#include <windows.h>
#include <d2d1.h>
#include <d2d1helper.h>
#include <dwrite.h>
#pragma comment(lib, "dwrite.lib")
#pragma comment(lib, "d2d1.lib") 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; bool AppInit()
{
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 Block", 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::YellowGreen);
gradient_stops[0].position = 0.0f;
gradient_stops[1].color = D2D1::ColorF(D2D1::ColorF::ForestGreen);
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); 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_ELLIPSE ellipse;
ellipse.point = D2D1::Point2F(size.width/2.0, size.height/2.0);
ellipse.radiusX = 280;
ellipse.radiusY = 100;
g_render_target->FillEllipse(&ellipse, g_radial_gradient_brush);
//g_render_target->FillEllipse(&ellipse, g_linear_gradient_brush); // Draw Text
const wchar_t * text = L"Direct2D Gradient Brush";
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_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;
}

最新文章

  1. 说说设计模式~桥梁模式(Bridge)
  2. ajax XML
  3. 修改Tomcat服务器的端口号
  4. Jsp页显示时间标签JSTL标签 &lt;fmt:formatDate/&gt; 实例大全
  5. 临时笔记:flume+ CDH 的 twitter实例
  6. log4net学习目录
  7. codeforece Round#311 BCDE
  8. table边框1px
  9. Ext JS 6学习文档–第1章–ExtJS入门指南
  10. C#编写代码:求三个数中的最大数
  11. ThreadPool.QueueUserWorkItem引发的血案,线程池异步非正确姿势导致程序闪退的问题
  12. VS项目发布到本地IIS
  13. AE 模板 素材 视频 科技 公安
  14. c++基本函数
  15. day 74 vue 2 axios数据请求 以及组件的学习
  16. 2019年北航OO第2单元(电梯模拟)总结
  17. Pandas DataFrame 函数应用和映射
  18. 自己搭建CDN服务器静态内容加速-LuManager CDN使用教程
  19. 不要怂,就是GAN (生成式对抗网络) (三):判别器和生成器 TensorFlow Model
  20. Ubuntu的常识使用了解3

热门文章

  1. php 7.2下mcrypt扩展支持附带的问题
  2. ValueError: Variable conv1/weights already exists.
  3. pptp,l2tp获取登录用户信息用pppd参数即可
  4. Windows API 第三篇
  5. [转]TabControl Style in WPF
  6. [转]浅谈C#中常见的委托
  7. Inoic 滚动条问题
  8. 左神算法书籍《程序员代码面试指南》——1_08构造数组的MaxTree
  9. IO流19(完) --- RandomAccessFile实现数据的插入 --- 技术搬运工(尚硅谷)
  10. Ajax和json一道基本的练习题