{"id":260815,"date":"2015-07-06T21:08:02","date_gmt":"2015-07-06T17:08:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=260815"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=260815","title":{"rendered":"\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 DirectX \u0432 \u043e\u043a\u043d\u0435 WPF"},"content":{"rendered":"<p>             <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/86f\/58a\/abb\/86f58aabb4f94427b56e496eb38c3b57.png\"\/>  <\/p>\n<h3>\u0412\u0441\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c, \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438! \u041d\u0435 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u0432\u0441\u0442\u0430\u043b\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043f\u043e\u0434 Windows, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u0435 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0434\u0432\u0443\u0445\u043c\u0435\u0440\u043d\u0443\u044e, \u0442\u0430\u043a \u0438 \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u0443\u044e \u0433\u0440\u0430\u0444\u0438\u043a\u0443. \u0417\u0430\u0434\u0430\u0447\u0430 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u0440\u044f\u0434\u0443 \u0441 \u043e\u043a\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u043f\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0437\u0434\u0443\u043c\u0438\u0439 \u0431\u044b\u043b\u0438 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u044b \u0434\u0432\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430: Qt \u0438 WPF. \u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f Qt \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0445\u0432\u0430\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0445\u043e\u0440\u043e\u0448\u0438\u043c API \u0438 \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 OpenGL. \u041e\u0434\u043d\u0430\u043a\u043e \u043e\u043d\u0430 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0438 \u0440\u044f\u0434\u043e\u043c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u043b\u043e\u0436\u043d\u043e \u043c\u0438\u0440\u0438\u0442\u044c\u0441\u044f. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Qt Widgets \u0432\u044b\u0439\u0434\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043e\u0440\u043e\u0433\u0438\u043c \u0432 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0438, \u0430 \u0432 Qt Quick \u0442\u044f\u0436\u0435\u043b\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a\u0443. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0432 OpenGL \u043d\u0435\u0442 \u0440\u0430\u0437\u0432\u0438\u0442\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u043b\u044f \u0434\u0432\u0443\u0445\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0441\u044f \u043d\u0430 WPF. \u0417\u0434\u0435\u0441\u044c \u043c\u0435\u043d\u044f \u0432\u0441\u0451 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b\u043e: \u043c\u043e\u0449\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f GUI, \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f C# \u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u0442\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Direct3D \u0438 Direct2D \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u2014 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0430 C++, \u0432 \u043e\u043a\u043d\u0435 WPF. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u0418\u0442\u0430\u043a, \u0432\u043e\u0442 \u043f\u043b\u0430\u043d \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430:<\/p>\n<ol>\n<li>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043d\u0430 C#<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c DirectX \u043d\u0430 C++<\/li>\n<li>\u0412\u044b\u0432\u043e\u0434 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043e\u043a\u043d\u0435 WPF<\/li>\n<\/ol>\n<p>  \u041d\u0435 \u0431\u0443\u0434\u0435\u043c \u0442\u0435\u0440\u044f\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0440\u0430\u0431\u043e\u0442\u0435.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h3>1. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043d\u0430 C#<\/h3>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f WPF \u0432 Visual Studio. \u0417\u0430\u0442\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 C#. \u041f\u0443\u0441\u0442\u044c \u0435\u0433\u043e \u0438\u043c\u044f \u0431\u0443\u0434\u0435\u0442 <u>NativeWindow<\/u>. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d \u043a\u043e\u0434 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">NativeWindow.cs<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>using System; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Interop;  namespace app {     public class NativeWindow : HwndHost     {         public new IntPtr Handle { get; private set; }         Procedure procedure;         const int WM_PAINT = 0x000F;         const int WM_SIZE = 0x0005;          [StructLayout(LayoutKind.Sequential)]         struct WindowClass         {             public uint Style;             public IntPtr Callback;             public int ClassExtra;             public int WindowExtra;             public IntPtr Instance;             public IntPtr Icon;             public IntPtr Cursor;             public IntPtr Background;             [MarshalAs(UnmanagedType.LPWStr)]             public string Menu;             [MarshalAs(UnmanagedType.LPWStr)]             public string Class;         }          [StructLayout(LayoutKind.Sequential)]         struct Rect         {             public int Left;             public int Top;             public int Right;             public int Bottom;         }          [StructLayout(LayoutKind.Sequential)]         struct Paint         {             public IntPtr Context;             public bool Erase;             public Rect Area;             public bool Restore;             public bool Update;             [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]             public byte[] Reserved;         }          delegate IntPtr Procedure             (IntPtr handle,             uint message,             IntPtr wparam,             IntPtr lparam);          [DllImport(&quot;user32.dll&quot;)]         static extern IntPtr CreateWindowEx             (uint extended,             [MarshalAs(UnmanagedType.LPWStr)]              string name,             [MarshalAs(UnmanagedType.LPWStr)]             string caption,             uint style,             int x,             int y,             int width,             int height,             IntPtr parent,             IntPtr menu,             IntPtr instance,             IntPtr param);          [DllImport(&quot;user32.dll&quot;)]         static extern IntPtr LoadCursor             (IntPtr instance,             int name);          [DllImport(&quot;user32.dll&quot;)]         static extern IntPtr DefWindowProc             (IntPtr handle,             uint message,             IntPtr wparam,             IntPtr lparam);          [DllImport(&quot;user32.dll&quot;)]         static extern ushort RegisterClass             ([In]              ref WindowClass register);          [DllImport(&quot;user32.dll&quot;)]         static extern bool DestroyWindow             (IntPtr handle);          [DllImport(&quot;user32.dll&quot;)]         static extern IntPtr BeginPaint             (IntPtr handle,             out Paint paint);          [DllImport(&quot;user32.dll&quot;)]         static extern bool EndPaint             (IntPtr handle,             [In] ref Paint paint);          protected override HandleRef BuildWindowCore(HandleRef parent)         {             var callback = Marshal.GetFunctionPointerForDelegate(procedure = WndProc);             var width = Convert.ToInt32(ActualWidth);             var height = Convert.ToInt32(ActualHeight);             var cursor = LoadCursor(IntPtr.Zero, 32512);             var menu = string.Empty;             var background = new IntPtr(1);             var zero = IntPtr.Zero;             var caption = string.Empty;             var style = 3u;             var extra = 0;             var extended = 0u;             var window = 0x50000000u;             var point = 0;             var name = &quot;Win32&quot;;              var wnd = new WindowClass             {                 Style = style,                 Callback = callback,                 ClassExtra = extra,                 WindowExtra = extra,                 Instance = zero,                 Icon = zero,                 Cursor = cursor,                 Background = background,                 Menu = menu,                 Class = name             };              RegisterClass(ref wnd);             Handle = CreateWindowEx(extended, name, caption,                 window, point, point, width, height,                 parent.Handle, zero, zero, zero);              return new HandleRef(this, Handle);         }          protected override void DestroyWindowCore(HandleRef handle)         {             DestroyWindow(handle.Handle);         }          protected override IntPtr WndProc(IntPtr handle, int message, IntPtr wparam, IntPtr lparam, ref bool handled)         {             try             {                 if (message == WM_PAINT)                 {                     Paint paint;                     BeginPaint(handle, out paint);                     EndPaint(handle, ref paint);                     handled = true;                 }                  if (message == WM_SIZE)                 {                     handled = true;                 }             }             catch (Exception e)             {                 MessageBox.Show(e.Message);             }              return base.WndProc(handle, message, wparam, lparam, ref handled);         }          static IntPtr WndProc(IntPtr handle, uint message, IntPtr wparam, IntPtr lparam)         {             return DefWindowProc(handle, message, wparam, lparam);         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e: \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u043e\u043a\u043e\u043d\u043d\u043e\u043c\u0443 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0443, \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <i>WndProc<\/i> \u0438\u0437 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <u>HwndHost<\/u>. \u041c\u0435\u0442\u043e\u0434 <i>BuildWindowCore<\/i> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430. \u041e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043e\u043a\u043d\u0430, \u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u043a\u043d\u0430 \u0438 \u0435\u0433\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043b\u0438\u0448\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 .NET \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c WinAPI \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 <b>Platform Invocation Services (PInvoke)<\/b>, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 Common Language Infrastructure (CLI). \u0421\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 PInvoke \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u0437 \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043a\u043d\u0438\u0433 \u043f\u043e .NET Framework, \u0437\u0434\u0435\u0441\u044c \u0436\u0435 \u044f \u0445\u043e\u0447\u0443 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0430\u0448\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u0430\u0439\u0442 <a href=\"http:\/\/www.pinvoke.net\/\">PInvoke.net<\/a>, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u041e\u0431\u044b\u0447\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432. \u0421\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u2014 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u043e\u043a\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u0438 \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 WinAPI. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430 \u0432 \u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440\u0435 WPF \u0431\u044b\u043b\u0430 \u0443\u0434\u043e\u0431\u043d\u043e\u0439, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043e\u043a\u043d\u0430 \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0444\u043e\u0440\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0430 XAML \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">MainWindow.xaml<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"xml\">&lt;Window x:Class=&quot;app.MainWindow&quot;         xmlns=&quot;http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\/presentation&quot;         xmlns:x=&quot;http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml&quot;         xmlns:i=&quot;clr-namespace:app&quot;         Title=&quot;MainWindow&quot; Height=&quot;350&quot; Width=&quot;525&quot;&gt;     &lt;Grid&gt;         &lt;i:NativeWindow&gt;&lt;\/i:NativeWindow&gt;     &lt;\/Grid&gt; &lt;\/Window&gt; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043d\u0430 \u0444\u043e\u0440\u043c\u0443, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0451\u043d, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f. \u0417\u0430\u0442\u0435\u043c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c, \u0447\u0442\u043e\u0431\u044b \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0444\u043e\u0440\u043c\u0435. \u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u0438\u0437 \u0440\u0435\u0436\u0438\u043c\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0440\u0435\u0436\u0438\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430, \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0440\u0430\u0442\u044c. \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043e\u043a\u043d\u043e Visual Studio \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u0438\u043c\u0435\u0435\u0442 \u0441\u0435\u0440\u044b\u0439 \u0444\u043e\u043d:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/338\/ad4\/f0d\/338ad4f0d63b4cc895e5a9adcf91f48d.png\"\/><\/p>\n<h3>2. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c DirectX \u043d\u0430 C++<\/h3>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 C++, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 Direct2D \u043e\u043a\u043d\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043b\u0438\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c \u0444\u043e\u043d\u043e\u043c. \u0414\u043b\u044f \u0441\u0432\u044f\u0437\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0438 \u043d\u0435\u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 C++\/CLI, \u043e\u0434\u043d\u0430\u043a\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 Visual Studio \u043f\u0440\u043e\u0435\u043a\u0442 C++ CLR Class Library. \u0412 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c. \u0414\u043b\u044f \u044d\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u043d\u0438\u0436\u0435:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">Renderer.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>#include &lt;d2d1.h&gt;  namespace lib { \tclass Renderer \t{ \tpublic:  \t\t~Renderer() \t\t{ \t\t\tif (factory) factory-&gt;Release(); \t\t\tif (target) target-&gt;Release(); \t\t}  \t\tbool Initialize(HWND handle) \t\t{ \t\t\tRECT rect; \t\t\tif (!GetClientRect(handle, &rect)) return false;  \t\t\tif (FAILED(D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &factory))) \t\t\t\treturn false;  \t\t\treturn SUCCEEDED(factory-&gt;CreateHwndRenderTarget(D2D1::RenderTargetProperties(), \t\t\t\tD2D1::HwndRenderTargetProperties(handle, D2D1::SizeU(rect.right - rect.left, \t\t\t\trect.bottom - rect.top)), &target)); \t\t}  \t\tvoid Render() \t\t{ \t\t\tif (!target) return; \t\t\ttarget-&gt;BeginDraw(); \t\t\ttarget-&gt;Clear(D2D1::ColorF(D2D1::ColorF::Orange)); \t\t\ttarget-&gt;EndDraw(); \t\t}  \t\tvoid Resize(HWND handle) \t\t{ \t\t\tif (!target) return; \t\t\tRECT rect; \t\t\tif (!GetClientRect(handle, &rect)) return; \t\t\tD2D1_SIZE_U size = D2D1::SizeU(rect.right - rect.left, rect.bottom - rect.top); \t\t\ttarget-&gt;Resize(size); \t\t}  \tprivate:  \t\tID2D1Factory* factory; \t\tID2D1HwndRenderTarget* target; \t};  \tpublic ref class Scene \t{ \tpublic:  \t\tScene(System::IntPtr handle) \t\t{ \t\t\trenderer = new Renderer; \t\t\tif (renderer) renderer-&gt;Initialize((HWND)handle.ToPointer()); \t\t}  \t\t~Scene() \t\t{ \t\t\tdelete renderer; \t\t}  \t\tvoid Resize(System::IntPtr handle) \t\t{ \t\t\tHWND hwnd = (HWND)handle.ToPointer(); \t\t\tif (renderer) renderer-&gt;Resize(hwnd); \t\t}  \t\tvoid Draw() \t\t{ \t\t\tif (renderer) renderer-&gt;Render(); \t\t}  \tprivate:  \t\tRenderer* renderer; \t}; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041a\u043b\u0430\u0441\u0441 <u>Scene<\/u> \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 C# \u0438 \u043a\u043b\u0430\u0441\u0441 <u>Renderer<\/u>. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Direct2D API \u0434\u043b\u044f \u0437\u0430\u043b\u0438\u0432\u043a\u0438 \u0444\u043e\u043d\u0430 \u043e\u043a\u043d\u0430 \u043e\u0440\u0430\u043d\u0436\u0435\u0432\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c. \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043d\u0435\u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u043c \u043a\u043e\u0434\u0435, \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u043b\u0438\u0448\u044c \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440 \u043e\u043a\u043d\u0430 (HWND). \u0422\u0430\u043a\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e \u043e\u0431\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u00abRelease x86\u00bb.<\/p>\n<h3>3. \u0412\u044b\u0432\u043e\u0434 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043e\u043a\u043d\u0435 WPF<\/h3>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0444\u043e\u0440\u043c\u0443, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0441\u0431\u043e\u0440\u043a\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u043a\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f WPF \u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043e\u043a\u043e\u043d\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430. \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/a4c\/6f3\/b26\/a4c6f3b26e0a41f9a6b3f791f24f53cf.png\"\/><\/p>\n<p>  \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 <u>NativeWindow<\/u>:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">NativeWindow.cs<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>using lib; \/\/ \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438\u043c\u0451\u043d \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f using System; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Interop;  namespace app {     public class NativeWindow : HwndHost     {         public new IntPtr Handle { get; private set; }         Procedure procedure;         Scene scene; \/\/ \u041e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 Scene \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f         const int WM_PAINT = 0x000F;         const int WM_SIZE = 0x0005;          [StructLayout(LayoutKind.Sequential)]         struct WindowClass         {             public uint Style;             public IntPtr Callback;             public int ClassExtra;             public int WindowExtra;             public IntPtr Instance;             public IntPtr Icon;             public IntPtr Cursor;             public IntPtr Background;             [MarshalAs(UnmanagedType.LPWStr)]             public string Menu;             [MarshalAs(UnmanagedType.LPWStr)]             public string Class;         }          [StructLayout(LayoutKind.Sequential)]         struct Rect         {             public int Left;             public int Top;             public int Right;             public int Bottom;         }          [StructLayout(LayoutKind.Sequential)]         struct Paint         {             public IntPtr Context;             public bool Erase;             public Rect Area;             public bool Restore;             public bool Update;             [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]             public byte[] Reserved;         }          delegate IntPtr Procedure             (IntPtr handle,             uint message,             IntPtr wparam,             IntPtr lparam);          [DllImport(&quot;user32.dll&quot;)]         static extern IntPtr CreateWindowEx             (uint extended,             [MarshalAs(UnmanagedType.LPWStr)]              string name,             [MarshalAs(UnmanagedType.LPWStr)]             string caption,             uint style,             int x,             int y,             int width,             int height,             IntPtr parent,             IntPtr menu,             IntPtr instance,             IntPtr param);          [DllImport(&quot;user32.dll&quot;)]         static extern IntPtr LoadCursor             (IntPtr instance,             int name);          [DllImport(&quot;user32.dll&quot;)]         static extern IntPtr DefWindowProc             (IntPtr handle,             uint message,             IntPtr wparam,             IntPtr lparam);          [DllImport(&quot;user32.dll&quot;)]         static extern ushort RegisterClass             ([In]              ref WindowClass register);          [DllImport(&quot;user32.dll&quot;)]         static extern bool DestroyWindow             (IntPtr handle);          [DllImport(&quot;user32.dll&quot;)]         static extern IntPtr BeginPaint             (IntPtr handle,             out Paint paint);          [DllImport(&quot;user32.dll&quot;)]         static extern bool EndPaint             (IntPtr handle,             [In] ref Paint paint);          protected override HandleRef BuildWindowCore(HandleRef parent)         {             var callback = Marshal.GetFunctionPointerForDelegate(procedure = WndProc);             var width = Convert.ToInt32(ActualWidth);             var height = Convert.ToInt32(ActualHeight);             var cursor = LoadCursor(IntPtr.Zero, 32512);             var menu = string.Empty;             var background = new IntPtr(1);             var zero = IntPtr.Zero;             var caption = string.Empty;             var style = 3u;             var extra = 0;             var extended = 0u;             var window = 0x50000000u;             var point = 0;             var name = &quot;Win32&quot;;              var wnd = new WindowClass             {                 Style = style,                 Callback = callback,                 ClassExtra = extra,                 WindowExtra = extra,                 Instance = zero,                 Icon = zero,                 Cursor = cursor,                 Background = background,                 Menu = menu,                 Class = name             };              RegisterClass(ref wnd);             Handle = CreateWindowEx(extended, name, caption,                 window, point, point, width, height,                 parent.Handle, zero, zero, zero);              scene = new Scene(Handle); \/\/ \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 Scene              return new HandleRef(this, Handle);         }          protected override void DestroyWindowCore(HandleRef handle)         {             DestroyWindow(handle.Handle);         }          protected override IntPtr WndProc(IntPtr handle, int message, IntPtr wparam, IntPtr lparam, ref bool handled)         {             try             {                 if (message == WM_PAINT)                 {                     Paint paint;                     BeginPaint(handle, out paint);                     scene.Draw(); \/\/ \u041f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e                     EndPaint(handle, ref paint);                     handled = true;                 }                  if (message == WM_SIZE)                 {                     scene.Resize(handle); \/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432                     handled = true;                 }             }             catch (Exception e)             {                 MessageBox.Show(e.Message);             }              return base.WndProc(handle, message, wparam, lparam, ref handled);         }          static IntPtr WndProc(IntPtr handle, uint message, IntPtr wparam, IntPtr lparam)         {             return DefWindowProc(handle, message, wparam, lparam);         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043e\u043a\u043e\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f WM_PAINT \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430. \u0414\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u043e\u043a\u043d\u0430 (\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 WM_SIZE). \u041d\u0430 \u0440\u0438\u0441\u0443\u043d\u043a\u0435 \u043d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0437\u0430\u043b\u0438\u0442\u043e\u0435 \u043e\u0440\u0430\u043d\u0436\u0435\u0432\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c \u043e\u043a\u043d\u043e \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/eca\/b8c\/1f6\/ecab8c1f62a34cf2b772fc4e8eff5c35.png\"\/><\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u0418\u0437\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043e\u043a\u043d\u0435 WPF \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u043e\u0432\u043c\u0435\u0449\u0451\u043d \u0441 \u043e\u043a\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430. \u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f WPF \u043d\u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u0434\u0435\u043d\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u043c \u0440\u0430\u0437\u0432\u0438\u0442\u044b\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f GUI \u0434\u043b\u044f Windows, \u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043f\u043e\u0440\u043e\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430 \u043f\u0440\u043e\u0449\u0435. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043a\u043e\u0440\u0435\u0435 \u0438\u0441\u043f\u044b\u0442\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043c\u043d\u043e\u0439 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d <a href=\"https:\/\/github.com\/Grandbrain\/NativeWPF\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/a> \u043d\u0430 Github. \u0422\u0430\u043c \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0441\u0432\u0435\u0436\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f.             <\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/261927\/\"> http:\/\/habrahabr.ru\/post\/261927\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>             <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/86f\/58a\/abb\/86f58aabb4f94427b56e496eb38c3b57.png\"\/>  <\/p>\n<h3>\u0412\u0441\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h3>\n<p>  \u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c, \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438! \u041d\u0435 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u043e \u043c\u043d\u043e\u0439 \u0432\u0441\u0442\u0430\u043b\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043f\u043e\u0434 Windows, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u0435 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0434\u0432\u0443\u0445\u043c\u0435\u0440\u043d\u0443\u044e, \u0442\u0430\u043a \u0438 \u0442\u0440\u0451\u0445\u043c\u0435\u0440\u043d\u0443\u044e \u0433\u0440\u0430\u0444\u0438\u043a\u0443. \u0417\u0430\u0434\u0430\u0447\u0430 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u0440\u044f\u0434\u0443 \u0441 \u043e\u043a\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u043f\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0437\u0434\u0443\u043c\u0438\u0439 \u0431\u044b\u043b\u0438 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u044b \u0434\u0432\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430: Qt \u0438 WPF. \u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f Qt \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0445\u0432\u0430\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0445\u043e\u0440\u043e\u0448\u0438\u043c API \u0438 \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 OpenGL. \u041e\u0434\u043d\u0430\u043a\u043e \u043e\u043d\u0430 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0438 \u0440\u044f\u0434\u043e\u043c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u043b\u043e\u0436\u043d\u043e \u043c\u0438\u0440\u0438\u0442\u044c\u0441\u044f. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Qt Widgets \u0432\u044b\u0439\u0434\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043e\u0440\u043e\u0433\u0438\u043c \u0432 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0438, \u0430 \u0432 Qt Quick \u0442\u044f\u0436\u0435\u043b\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a\u0443. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0432 OpenGL \u043d\u0435\u0442 \u0440\u0430\u0437\u0432\u0438\u0442\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u043b\u044f \u0434\u0432\u0443\u0445\u043c\u0435\u0440\u043d\u043e\u0433\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0441\u044f \u043d\u0430 WPF. \u0417\u0434\u0435\u0441\u044c \u043c\u0435\u043d\u044f \u0432\u0441\u0451 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b\u043e: \u043c\u043e\u0449\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f GUI, \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f C# \u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u0442\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Direct3D \u0438 Direct2D \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u2014 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0430 C++, \u0432 \u043e\u043a\u043d\u0435 WPF. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u0418\u0442\u0430\u043a, \u0432\u043e\u0442 \u043f\u043b\u0430\u043d \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0430:<\/p>\n<ol>\n<li>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043d\u0430 C#<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c DirectX \u043d\u0430 C++<\/li>\n<li>\u0412\u044b\u0432\u043e\u0434 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043e\u043a\u043d\u0435 WPF<\/li>\n<\/ol>\n<p>  \u041d\u0435 \u0431\u0443\u0434\u0435\u043c \u0442\u0435\u0440\u044f\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0440\u0430\u0431\u043e\u0442\u0435.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-260815","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/260815","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=260815"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/260815\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=260815"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=260815"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=260815"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}