原文:Direct2D 第4篇 渐变画刷

  1. #include <windows.h>
  2. #include <d2d1.h>
  3. #include <d2d1helper.h>
  4. #include <dwrite.h>
  5. #pragma comment(lib, "dwrite.lib")
  6. #pragma comment(lib, "d2d1.lib")
  7. HINSTANCE g_hinst;
  8. HWND g_hwnd;
  9. ID2D1Factory * g_factory;
  10. ID2D1HwndRenderTarget * g_render_target;
  11. ID2D1SolidColorBrush * g_brush;
  12. IDWriteFactory * g_write_factory;
  13. IDWriteTextFormat * g_text_format;
  14. ID2D1GradientStopCollection * g_gradient_stop_collection;
  15. ID2D1LinearGradientBrush * g_linear_gradient_brush;
  16. ID2D1RadialGradientBrush * g_radial_gradient_brush;
  17. bool AppInit()
  18. {
  19. D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &g_factory);
  20. RECT rc;
  21. GetClientRect(g_hwnd, &rc);
  22. g_factory->CreateHwndRenderTarget(
  23. D2D1::RenderTargetProperties(),
  24. D2D1::HwndRenderTargetProperties(g_hwnd, D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top) ),
  25. &g_render_target);
  26. g_render_target->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::WhiteSmoke), &g_brush);
  27. // Init Font
  28. DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED,__uuidof(g_write_factory),reinterpret_cast<IUnknown **>(&g_write_factory));
  29. g_write_factory->CreateTextFormat(L"Arial Block", NULL, DWRITE_FONT_WEIGHT_NORMAL,
  30. DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, 40, L"",&g_text_format);
  31. // Create Gradient Stops
  32. D2D1_GRADIENT_STOP gradient_stops[3];
  33. gradient_stops[0].color = D2D1::ColorF(D2D1::ColorF::YellowGreen);
  34. gradient_stops[0].position = 0.0f;
  35. gradient_stops[1].color = D2D1::ColorF(D2D1::ColorF::ForestGreen);
  36. gradient_stops[1].position = 0.5f;
  37. gradient_stops[2].color = D2D1::ColorF(D2D1::ColorF::Green);
  38. gradient_stops[2].position = 1.0f;
  39. // Create Interface
  40. g_render_target->CreateGradientStopCollection(gradient_stops, 3, &g_gradient_stop_collection);
  41. // Create Linear Gradient Brush
  42. g_render_target->CreateLinearGradientBrush(
  43. D2D1::LinearGradientBrushProperties(D2D1::Point2F(0,0), D2D1::Point2F(600,600)),
  44. g_gradient_stop_collection, &g_linear_gradient_brush);
  45. g_render_target->CreateRadialGradientBrush(
  46. D2D1::RadialGradientBrushProperties(D2D1::Point2F(500,500),D2D1::Point2F(),1000.0f,1000.0f),
  47. g_gradient_stop_collection,&g_radial_gradient_brush);
  48. return true;
  49. }
  50. void OnSize(LPARAM lparam)
  51. {
  52. if(g_render_target)
  53. g_render_target->Resize(D2D1::SizeU(LOWORD(lparam),HIWORD(lparam)));
  54. }
  55. void OnPaint()
  56. {
  57. if(!g_render_target)
  58. return;
  59. g_render_target->BeginDraw();
  60. // Clear Background
  61. g_render_target->Clear(D2D1::ColorF(0.63, 0.84, 0.00));
  62. // Draw Ellipse
  63. D2D1_SIZE_F size = g_render_target->GetSize();
  64. D2D1_ELLIPSE ellipse;
  65. ellipse.point = D2D1::Point2F(size.width/2.0, size.height/2.0);
  66. ellipse.radiusX = 280;
  67. ellipse.radiusY = 100;
  68. g_render_target->FillEllipse(&ellipse, g_radial_gradient_brush);
  69. //g_render_target->FillEllipse(&ellipse, g_linear_gradient_brush);
  70. // Draw Text
  71. const wchar_t * text = L"Direct2D Gradient Brush";
  72. g_render_target->DrawText(text, wcslen(text),
  73. g_text_format,
  74. D2D1::RectF(100, 190, size.width, size.height),
  75. g_brush);
  76. g_render_target->EndDraw();
  77. }
  78. void OnDestroy()
  79. {
  80. g_linear_gradient_brush->Release();
  81. g_radial_gradient_brush->Release();
  82. g_gradient_stop_collection->Release();
  83. g_text_format->Release();
  84. g_write_factory->Release();
  85. g_brush->Release();
  86. g_render_target->Release();
  87. g_factory->Release();
  88. }
  89. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
  90. {
  91. switch(msg)
  92. {
  93. case WM_PAINT:
  94. OnPaint();
  95. break;
  96. case WM_SIZE:
  97. OnSize(lparam);
  98. break;
  99. case WM_DESTROY:
  100. OnDestroy();
  101. PostQuitMessage(0);
  102. break;
  103. default:
  104. return DefWindowProc(hwnd, msg, wparam, lparam);
  105. }
  106. return 0;
  107. }
  108. int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
  109. {
  110. WNDCLASSEX wc;
  111. MSG msg;
  112. memset(&wc,0,sizeof(wc));
  113. wc.cbSize = sizeof(WNDCLASSEX);
  114. wc.lpfnWndProc = WndProc;
  115. wc.hInstance = hinst;
  116. wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  117. wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  118. wc.lpszClassName = "WindowClass";
  119. wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  120. wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
  121. if(!RegisterClassEx(&wc))
  122. {
  123. MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
  124. return 0;
  125. }
  126. g_hinst = hinst;
  127. g_hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Direct2D Demo",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
  128. CW_USEDEFAULT,
  129. CW_USEDEFAULT,
  130. 640,
  131. 480,
  132. NULL, NULL, hinst, NULL);
  133. if(g_hwnd == NULL)
  134. {
  135. MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
  136. return 0;
  137. }
  138. if(!AppInit())
  139. {
  140. MessageBox(NULL, "Application Initialisation Failed !","Error",MB_ICONEXCLAMATION|MB_OK);
  141. return 0;
  142. }
  143. while(GetMessage(&msg, NULL, 0, 0) > 0)
  144. {
  145. TranslateMessage(&msg);
  146. DispatchMessage(&msg);
  147. }
  148. return msg.wParam;
  149. }

Direct2D 第4篇 渐变画刷的更多相关文章

  1. WPF中线性渐变画刷的一个小窍门

    最近被项目里面控件的设计搞的死去活来的,大部分的设计都会需要使用进度条的功能,因为UI形状的变态,使用ProgressBar不能满足需求,没办法就自己想办法实现进度显示.折腾的多了发现一个很不错的方法 ...

  2. WPF线性渐变画刷应用之——炫彩线条

    效果图: Xaml代码: <Rectangle Width="800" Height="10"> <Rectangle.Fill> &l ...

  3. (C#)WPF:LinearGradientBrush 线性渐变画刷和RadialGradientBrush 圆形渐变画刷

    <Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/200 ...

  4. 简述WPF中的画刷(Brush)

    原文:简述WPF中的画刷(Brush) -------------------------------------------------------------------------------- ...

  5. WPF样式之画刷结合样式

    第一种画刷,渐变画刷GradientBrush (拿线性渐变画刷LinearGradientBrush(其实它涵盖在GradientBrush画刷内.现在拿他来说事.),还有一个圆心渐变画刷Radia ...

  6. C#GDI+基础(三)画刷详解

    SolidBrush:一般的画刷,通常只用一种颜色去填充GDI+图形 创建一般画刷: SolidBrush sbBrush1 = new SolidBrush(Color.Green); HatchB ...

  7. 《WPF程序设计指南》读书笔记——第2章 基本画刷

    1.Color结构 using System; using System.Windows; using System.Windows.Input; using System.Windows.Media ...

  8. Windows Phone开发(31):画刷

    原文:Windows Phone开发(31):画刷 画刷是啥玩意儿?哈,其实画刷是用来涂鸦,真的,没骗你,至于你信不信,反正我信了. 本文通过价绍几个典型的画刷,使你明白画刷就是用来涂鸦的. 一.纯色 ...

  9. Sliverlight之 画刷

    1,5种画刷 (见Project15) (1)TextBlock控件中的Forground和BackGround属性是一个什么对象?它在前台的完整的写法是什么?(实际是.net做了一个转换,可以直接写 ...

随机推荐

  1. 给java mongodb 官方driver 增加bean 操作

      mongodb官方的java driver不支持直接插入java bean,只能使用DbObject的Key,Value形式进行insert,update,(c# mongodb官方driver类 ...

  2. 【机器学习】机器学习入门02 - 数据拆分与测试&算法评价与调整

    0. 前情回顾 上一周的文章中,我们通过kNN算法了解了机器学习的一些基本概念.我们自己实现了简单的kNN算法,体会了其过程.这一周,让我们继续机器学习的探索. 1. 数据集的拆分 上次的kNN算法介 ...

  3. Js中获取时间 new date()的用法

    Js中获取时间 new date()的用法 获取时间: var myDate = new Date();//获取系统当前时间 myDate.getYear(); //获取当前年份(2位) myDate ...

  4. Foundation框架系列-NSString

    NSString OC字符串与C语言字符串转换 NSString *str = @"Hello world ! !"; // OC字符串 --> C语言字符串 char *c ...

  5. PHP--时间搜索插件封装

    /** * 时间搜索插件封装 * anthor qinpeizhou * @param $timeset 时间格式 * @param $time sql语句中所需要搜索的time字段名称 * @par ...

  6. win 7下安装mysql zip格式

    mysql 下载地址:https://dev.mysql.com/downloads/mysql/5.5.html#downloads 下载的mysql格式为zip: 下载完成放在除C盘以外的盘. 一 ...

  7. ajax发送验证码

    $.ajax({     url:url,     type:"POST",     data:data,     dataType:"JSON",     s ...

  8. PHP declare 之 strict_types=1

    PHP中申明 declare(strict_types=1)的作用:  strict_types=1 及开启严格模式.默认是弱类型校验.具体严格模式和普通模式的区别见下面代码. code1: < ...

  9. MySQL时间格式转换

    1.时间转换成特定字符串 例:select DATE_FORMAT(now(),'%Y-%m-%d %H:%i::%s'); --> '2019-10-16 10:59::18' 2.一种字符串 ...

  10. Hadoop 集群的建立与安装