WinRT рдШрдЯрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Direct2D рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдпрд╣ рд▓реЗрдЦ рд╣рдорд╛рд░реА рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╡рд┐рдВрдбреЛрдЬ 8 рдпреВрдЖрдИ рдХреА рд╢реИрд▓реА рдореЗрдВ рд╡рд┐рдЬреБрдЕрд▓ WinRT рдирд┐рдпрдВрддреНрд░рдг рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрдкрдирд╛ рдЕрдиреБрднрд╡ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВред

рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╣рдордиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ WinRT рдирд┐рдпрдВрддреНрд░рдг рдФрд░ SDK рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдмреБрдирд┐рдпрд╛рджреА рдХрджрдо рджрд┐рдП рдереЗ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдЖрдкрдХреЗ WinRT рдШрдЯрдХ рдореЗрдВ рджреГрд╢реНрдп рдкреНрд░рднрд╛рд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Direct2D рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЙрд░реНрдл тАЛтАЛрдЧреЗрдЬ рдЗрдВрдбрд┐рдХреЗрдЯрд░ (рдЧреЗрдЬ рдирд┐рдпрдВрддреНрд░рдг) рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдЪрд▓рддреЗ рд╕рдордп рддреАрд░ рдзреБрдВрдзрд▓рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдиреЛрдЯ: рдЖрдк рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд▓рд┐рдВрдХ рдирд┐рдореНрди рд▓рд┐рдВрдХ рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: go.devexpress.com/Habr_WinRTSample.aspx



Direct2D рдХреНрдпрд╛ рд╣реИ?


Direct2D рддрдХрдиреАрдХ рдПрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░-рддреНрд╡рд░рд┐рдд рджреЛ-рдЖрдпрд╛рдореА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдПрдкреАрдЖрдИ рд╣реИ рдЬреЛ рджреЛ-рдЖрдпрд╛рдореА рдЬреНрдпрд╛рдорд┐рддрд┐, рдмрд┐рдЯрдореИрдк рдФрд░ рдкрд╛рда рдХреЗ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

Direct2D API рдХреЛ Microsoft рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдВрдбреЛрдЬ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдФрд░ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ GDI, GDI + рдпрд╛ Direct3D рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдЕрдкрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ Direct2D рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрдм рдЖрд╡рд╢реНрдпрдХ рд╣реИ?

рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдХреВрд▓рди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдХ рддрддреНрд╡ рдЦреАрдВрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛, рдореИрдкреНрд╕ рдФрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреЗрдЬ рд╕рдВрдХреЗрддрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЧреНрд░рд╛рдлрд╝ рдмрдирд╛рддреЗ рд╕рдордп рдЖрд╡рд╢реНрдпрдХ рд╣реИ)ред

рдЖрдк рд╕рдВрдмрдВрдзрд┐рдд MSDN рдЕрдиреБрднрд╛рдЧ рдореЗрдВ Direct2D рдФрд░ рдЗрд╕рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред

рд╕рд┐рд╕реНрдЯрдо рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ


Windows 8 UI (METRO) рдХреА рд╢реИрд▓реА рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ Windows 8 рдФрд░ Visual Studio 2012 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЖрдк рд╣рдорд╛рд░реЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

Direct2D рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдШрдЯрдХ рдХреЗ рд╕рд╛рде C ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдирд╛


рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ Direct2D рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ C ++ рдореЗрдВ WinRT рдШрдЯрдХ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрди рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ:
  1. рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2012 рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ (рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдХрднреА рднреА рдмрдВрдж рдХрд░ рджреЗрдВ :-))
  2. рдПрдХ рдирдпрд╛ рд╡рд┐рдЬреБрдЕрд▓ C ++ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдЬреИрд╕реЗ рд╡рд┐рдВрдбреЛрдЬ рд░рдирдЯрд╛рдЗрдо рдХрдВрдкреЛрдиреЗрдВрдЯ



    рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдбрд╛рдпрд░реЗрдХреНрдЯ 2 рдбреА рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдШреЛрд╖рдгрд╛ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред
  3. рдлрд┐рд░ рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ C ++ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЧреБрдгреЛрдВ рдореЗрдВ Direct2D рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ: d2d1.lib рдФрд░ d3d11.lib рд╕реЗ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред



  4. рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ Direct2D рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред

    рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдПрдХрд▓ CreateRenderer рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреИрдЯрд┐рдХ рдбреНрд░реЙрдЗрдВрдЧрдлреИрдХреНрдЯрд░реА рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдБ, рдЬреЛ DirectX рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдЧрд╛, рд░реЗрдВрдбрд░рд░ рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдБ рдФрд░ рд▓реМрдЯрд╛рдПрдБ :

    public ref class DrawingFactory sealed { public: static IRenderer^ CreateRenderer(); }; 

    рджреВрд╕рд░реЗ, рд╣рдо рдореБрдЦреНрдп IRenderer рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐рдпрд╛рдБ рдФрд░ рдЧреБрдг рд╣реЛрдВрдЧреЗ:
    - рд░реАрд╕реЗрдЯ рд╡рд┐рдзрд┐, рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рддрд╣ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрдореЗрдЬрдмреНрд░рд╢ рдЙрди рдЖрдпрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдП рдЧрдП рдереЗред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ WinRT рдШрдЯрдХ рдХреЗ рджреГрд╢реНрдп рдкреЗрдбрд╝ рдореЗрдВ рдХрд┐рд╕реА рднреА рддрддреНрд╡ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк ImageBrush рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВрдЧреЗ;
    - рдЯрд╛рд░рдЧреЗрдЯрдмреНрд░рд╢ рд╕рдВрдкрддреНрддрд┐, рдЬреЛ рд░реАрд╕реЗрдЯ рдкрджреНрдзрддрд┐ рдореЗрдВ рдмрдирд╛рдП рдЧрдП рдмреНрд░рд╢ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ рдФрд░ рдЗрд╕рдореЗрдВ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП;
    - рдЧреБрдг EnableMotionBlur , MotionBlurAngle , MotionBlurDeviation , рдЬреЛ рдХрд┐ рдЖрджрд┐рдо рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд╕рдордп рдзрдмреНрдмрд╛ рдкреНрд░рднрд╛рд╡ рдХреЛ рд╕рдХреНрд╖рдо рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
    - рдЬреНрдпрд╛рдорд┐рддрд┐ рдмрдирд╛рдиреЗ рдФрд░ рдбреНрд░рд╛рдЗрдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП CreateGeometry , DrawGeometry , FillGeometry рддрд░реАрдХреЗ;
    - рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рд╢реНрди рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХрдИ рдФрд░ рдЕрдзрд┐рдХ рд╕рд░рд▓ рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рддрд░реАрдХреЗ рдФрд░ рдЧреБрдг рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ BeginDraw , EndDraw , Clear , TargetWidth рдФрд░ TargetHeight ред

     public interface class IRenderer { property int TargetWidth { int get(); } property int TargetHeight { int get(); } property ImageBrush^ TargetBrush { ImageBrush^ get(); } property bool EnableMotionBlur { bool get(); void set(bool value); } property float MotionBlurAngle { float get(); void set(float value); } property float MotionBlurDeviation { float get(); void set(float value); } void Reset(int width, int height); void BeginDraw(); void EndDraw(); void Clear(Color color); IShapeGeometry^ CreateGeometry(); void DrawGeometry(IShapeGeometry^ geometry, Color color, float width); void FillGeometry(IShapeGeometry^ geometry, Color color); }; 


    рдЕрдм рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдзрдмреНрдмрд╛ рдкреНрд░рднрд╛рд╡ рдХреИрд╕реЗ рдмрдирд╛рдПрдВрдЧреЗред Direct2D рдХреЗ рд╕рд╛рде, рдпрд╣ рдХрд╛рд░реНрдп рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рд░реАрд╕реЗрдЯ рд╡рд┐рдзрд┐ рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рдорд╛рдирдХ DirectionalBlur рдкреНрд░рднрд╛рд╡, рдФрд░ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдмрд┐рдЯрдореИрдк ( m_inputSource ) рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЗрд╕реЗ рдкрд╣рд▓реЗ рдмрдирд╛рдП рдЧрдП рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдХрд░реНрд╖рд┐рдд рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

     void Renderer::Reset(int width, int height) { D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, D3D_FEATURE_LEVEL_9_3, D3D_FEATURE_LEVEL_9_2, D3D_FEATURE_LEVEL_9_1 }; ThrowIfFailed(D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, 0, D3D11_CREATE_DEVICE_BGRA_SUPPORT, featureLevels, ARRAYSIZE(featureLevels), D3D11_SDK_VERSION, &m_d3dDevice, NULL, &m_d3dContext)); ThrowIfFailed(m_d3dDevice.As(&m_dxgiDevice)); ThrowIfFailed(m_d2dFactory->CreateDevice(m_dxgiDevice.Get(), &m_d2dDevice)); ThrowIfFailed(m_d2dDevice->CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_NONE, &m_d2dContext)); m_imageSource = ref new SurfaceImageSource(width, height, false); IInspectable* inspectable = (IInspectable*) reinterpret_cast<IInspectable*>(m_imageSource); ThrowIfFailed(inspectable->QueryInterface(__uuidof(ISurfaceImageSourceNative), (void**)&m_imageSourceNative)); ThrowIfFailed(m_imageSourceNative->SetDevice(m_dxgiDevice.Get())); m_imageBrush = ref new ImageBrush(); m_imageBrush->ImageSource = m_imageSource; m_targetWidth = width; m_targetHeight = height; ThrowIfFailed(m_d2dContext->CreateEffect(CLSID_D2D1DirectionalBlur, &m_blurEffect)); m_d2dContext->CreateBitmap(D2D1::SizeU(m_targetWidth, m_targetHeight), nullptr, 0, D2D1::BitmapProperties1(D2D1_BITMAP_OPTIONS_TARGET,D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED)), &m_inputSource); m_blurEffect->SetInput(0, m_inputSource.Get()); } 


    рдлрд┐рд░, BeginDraw рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рддрд╣ рдХреЗ рд░реВрдк рдореЗрдВ m_inputSource рдордзреНрдпрд╡рд░реНрддреА рдмрд┐рдЯрдореИрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рдбреНрд░рд╛рдЗрдВрдЧ EndDraw рд╡рд┐рдзрд┐ рдореЗрдВ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ , рддреЛ TargetBrush рд╕рддрд╣ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░, EnableMotionBlur рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдПрдХ рдкреНрд░рднрд╛рд╡ рдпрд╛ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдмрд┐рдЯрдореИрдк рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВред

     void Renderer::BeginDraw() { if (!m_drawingInProcess && (m_d2dContext.Get() != NULL)) { m_d2dContext->BeginDraw(); m_d2dContext->SetTarget(m_inputSource.Get()); m_drawingInProcess = true; } } void Renderer::EndDraw() { if (m_drawingInProcess) { m_d2dContext->EndDraw(); ComPtr<ID2D1Bitmap1> bitmap; PrepareSurface(&bitmap); m_d2dContext->SetTarget(bitmap.Get()); m_d2dContext->BeginDraw(); m_d2dContext->Clear(D2D1::ColorF(0.0f, 0.0f, 0.0f, 0.0f)); if (m_motionBlurEnabled) { m_blurEffect->SetValue(D2D1_DIRECTIONALBLUR_PROP_STANDARD_DEVIATION, m_motionBlurDeviation); m_blurEffect->SetValue(D2D1_DIRECTIONALBLUR_PROP_ANGLE, m_motionBlurAngle); m_d2dContext->DrawImage(m_blurEffect.Get()); } else m_d2dContext->DrawImage(m_inputSource.Get()); m_d2dContext->EndDraw(); m_d2dContext->SetTarget(NULL); m_imageSourceNative->EndDraw(); m_drawingInProcess = false; } } 



WinRT рдШрдЯрдХ рдпреБрдХреНрдд C # рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдирд╛



рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ, рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдПрдХ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдЗрд╕ рдмрд╛рд░ рд╕реА #ред рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ WinRT рдШрдЯрдХ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд┐рдд C ++ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред



рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдирд┐рд░реНрдорд┐рдд C ++ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рдиреЗ рд╣реЛрдВрдЧреЗ:



рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ WinRT рдЧреЗрдЬ рд╣реА рд╣реЛрдЧрд╛ред рдЗрд╕реЗ рд╣рдорд╛рд░реА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдпрд╛ рдЕрд╕реНрдерд╛рдпреА рдирд┐рдпрдВрддреНрд░рдг рдЬреЛрдбрд╝реЗрдВ:



рд╕рднреА рджреГрд╢реНрдп рддрддреНрд╡, рддреАрд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рд╣рдо рдорд╛рдирдХ WinRT рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреНрд░рд╛ рдХрд░реЗрдВрдЧреЗ, рдЕрд░реНрдерд╛рддреН, рд╣рдо рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ:

 <Style TargetType="local:Gauge"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="local:Gauge"> <Grid> <Grid Margin="0,0,0,0"> <Rectangle Fill="#FF252525" RadiusX="30" RadiusY="30"/> <Path Stretch="Uniform" VerticalAlignment="Top" HorizontalAlignment="Center" Stroke="#FFDAA5F8" Fill="#FFD365F8" StrokeThickness="3" StrokeStartLineCap="Square" StrokeEndLineCap="Square" Margin="150,0,150,0"> <Path.Data> <PathGeometry> <PathGeometry.Figures> <PathFigure StartPoint="0,0"> <PathFigure.Segments> <LineSegment Point="0.1,0"/> <ArcSegment Point="10.1,0" Size="5,5" RotationAngle="180" IsLargeArc="False" SweepDirection="Counterclockwise"/> <LineSegment Point="10.2,0"/> <ArcSegment Point="0,0" Size="5.1,5.1" RotationAngle="180" IsLargeArc="False" SweepDirection="Clockwise"/> </PathFigure.Segments> </PathFigure> </PathGeometry.Figures> </PathGeometry> </Path.Data> </Path> <TextBlock Text="{Binding Value, RelativeSource={RelativeSource Mode=TemplatedParent}}" FontSize="100" Foreground="#FFD365F8" VerticalAlignment="Top" HorizontalAlignment="Center"/> <Border x:Name="RendererSurface"/> </Grid> </Grid> </ControlTemplate> </Setter.Value> </Setter> </Style> 


рдШрдЯрдХ рдХреЗ рдЗрд╕ рджреГрд╢реНрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдореЗрдВ, рдПрдХ рдЦрд╛рд▓реА рдмреЙрд░реНрдбрд░ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рд░реЗрдВрдбрд░рд░ рд╕рд░реНрдлреЗрд╕ рд╣реИ ред рд╣рдо рдЗрд╕ рддрддреНрд╡ рдХреЛ OnApplyTemplate рд╡рд┐рдзрд┐ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╡рд░реНрдЧ рдЪрд░ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВрдЧреЗ рддрд╛рдХрд┐ рд╣рдо рд░реЗрдВрдбрд░рд░ рд╕реЗ рдЗрд╕рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рд╕рдВрдкрддреНрддрд┐ рддрдХ рдмреНрд░рд╢ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХреЗрдВред

 protected override void OnApplyTemplate() { base.OnApplyTemplate(); rendererSurface = (Border)GetTemplateChild("RendererSurface"); } 


рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рд╣рдореЗрдВ DrawingFactory рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ IRenderer рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ SizeChanged рдИрд╡реЗрдВрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рднреА рд▓реЗрдиреА рдЪрд╛рд╣рд┐рдП ред рдЗрд╕ рдШрдЯрдирд╛ рдкрд░, рд╣рдо IRenderer.Reset рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдЦреАрдВрдЪреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдмреНрд░рд╢ рдХрд╛ рдЖрдХрд╛рд░ рдШрдЯрдХ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛред рд╣рдо рд╕реНрдереИрддрд┐рдХ рдХрдореНрдкреЛрдЬрд╝рд┐рдЯрдЯрд╛рд░реНрдЧ рдХреА рд╕рджрд╕реНрдпрддрд╛ рднреА рд▓реЗрддреЗ рд╣реИрдВред рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЗрд╡реЗрдВрдЯ - рдЗрд╕ рдИрд╡реЗрдВрдЯ рдХреЗ рд╣реИрдВрдбрд▓рд░ рдкрд░ рд╣рдо рдЕрдкрдирд╛ рддреАрд░ рдЫреЛрдбрд╝реЗрдВрдЧреЗред

 public Gauge() { renderer = DrawingFactory.CreateRenderer(); DataContext = this; this.DefaultStyleKey = typeof(Gauge); arrowStrokeColor = ColorHelper.FromArgb(0xFF, 0xD3, 0xAA, 0xF8); arrowFillColor = ColorHelper.FromArgb(0xFF, 0xD3, 0x65, 0xF8); this.SizeChanged += Gauge_SizeChanged; CompositionTarget.Rendering += CompositionTarget_Rendering; } void Gauge_SizeChanged(object sender, SizeChangedEventArgs e) { renderer.Reset((int)e.NewSize.Width, (int)e.NewSize.Height); rendererSurface.Background = renderer.TargetBrush; } void CompositionTarget_Rendering(object sender, object e) { Render(); } 


рдЕрдм рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдореВрд▓реНрдп рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рддреАрд░ рдХреА рдЬреНрдпрд╛рдорд┐рддрд┐ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

 static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(Gauge), new PropertyMetadata(0.0, ValuePropertyChanged)); public double Value { get { return (double)GetValue(ValueProperty); } set { SetValue(ValueProperty, value); } } public static void ValuePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { Gauge gauge = d as Gauge; if (gauge != null) gauge.renderer.EnableMotionBlur = true; } void Render() { double angle = Math.PI * Value / 1000 - Math.PI / 2.0; IShapeGeometry geometry = CreateArrowGeometry(angle); renderer.BeginDraw(); renderer.MotionBlurAngle = (float)(angle / Math.PI * 180); renderer.MotionBlurDeviation = 5.0f; renderer.Clear(Colors.Transparent); renderer.FillGeometry(arrow, ColorHelper.FromArgb(0xFF, 0xD3, 0x65, 0xF8)); renderer.DrawGeometry(arrow, ColorHelper.FromArgb(0xFF, 0xD3, 0xAA, 0xF8), 3.0f); renderer.EndDraw(); if (renderer.EnableMotionBlur) renderer.EnableMotionBlur = false; } 


рд╡рд╣ рд╕рдм рд╣реИред рд╣рдорд╛рд░рд╛ рдШрдЯрдХ рддреИрдпрд╛рд░ рд╣реИ, рдФрд░ рдЕрдм рд╣рдо рдЗрд╕реЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

WinRT рдЧреЗрдЬ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдПрдХ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЗрд╕реЗ Blank App (XAML) рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реЛрдиреЗ рджреЗрдВред рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирд╛рдо Gрд╛рдореАMatrix :



рдлрд┐рд░, рдкрд╣рд▓реЗ рдмрдирд╛рдП рдЧрдП рдЧреЗрдЬ рдФрд░ рдбреНрд░рд╛рдЗрдВрдЧрд▓реЗрдпрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реЗрдВ:



рдЗрд╕рдХреЗ рдмрд╛рдж, MainPage.xaml рдореЗрдВ рдЧреНрд░рд┐рдб рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕рдореЗрдВ рджреЛ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдФрд░ рджреЛ рдХреЙрд▓рдо рдмрдирд╛рдПрдБред

 <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> 


рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдиреЗ рдЧреЗрдЬ рдШрдЯрдХ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЧреЗрдЬ рдирд┐рдпрдВрддреНрд░рдг рдкрд░ рддреАрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП:

 <Grid Grid.Column="0" Grid.Row="0" Margin="30"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Slider Grid.Row="0" Name="ValueSlider1" Minimum="0" Maximum="1000" Value="0" Width="1000" Margin="50,0,50,0"/> <g:Gauge Grid.Row="1" Value="{Binding ElementName=ValueSlider1, Path=Value}"/> </Grid> 


рд╣рдо рдЧреЗрдЬрдореИрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ ... рд╕рдм рдХреБрдЫ, рдЖрдк рдЕрдкрдиреЗ WinTL рдПрдкреНрд▓реАрдХреЗрд╢рди рдореЗрдВ Direct2D рдХреЗ рд╕рд╛рде рдбреНрд░рд╛рдЗрдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ! рдмрдзрд╛рдИ!



рдиреЛрдЯ: рдЖрдк рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд▓рд┐рдВрдХ рдирд┐рдореНрди рд▓рд┐рдВрдХ рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: go.devexpress.com/Habr_WinRTSample.aspx

рдкреБрдирд╢реНрдЪ рд╣рдо рдЙрди рд╕рднреА рдХреЛ рджреЗрдЦ рдХрд░ рдкреНрд░рд╕рдиреНрди рд╣реЛрдВрдЧреЗ рдЬреЛ рд╣рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬ 8 рдХреИрдВрдк рдореЗрдВ рдореЙрд╕реНрдХреЛ рдореЗрдВ 7 рд╕рд┐рддрдВрдмрд░ рдХреЛ рд╡рд┐рдирдЖрд░рдЯреА рдХреЗ рд▓рд┐рдП рдШрдЯрдХреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреЗ рд╕рд╡рд╛рд▓ рдкреВрдЫрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ! рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдСрдирд▓рд╛рдЗрди рдкреНрд░рд╕рд╛рд░рдг рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ!

Source: https://habr.com/ru/post/In150618/


All Articles