Windows桌面应用程序(1-2-4-6th) 使用Direct2D绘图
2018-01-12 20:59
447 查看
创建图形资源后,即可绘制图形。
绘制一个椭圆
Circle程序执行非常简单的绘图逻辑:
用纯色填充背景。
画一个实心圆。
Circle程序的屏幕截图。
因为渲染目标是一个窗口(与位图或其他非屏幕表面相反),所以绘制是为了响应WM_PAINT消息而完成的。以下代码显示了Circle程序的窗口过程。
这是绘制圆的代码。
ID2D1RenderTarget接口用于所有绘图操作。该程序的OnPaint方法执行以下操作:
ID2D1RenderTarget::BeginDraw方法表示绘图的开始。
ID2D1RenderTarget::Clear方法使用纯色填充整个渲染目标。颜色以D2D1_COLOR_F结构给出。您可以使用D2D1::ColorF类来初始化结构。有关更多信息,请参阅在Direct2D中使用颜色。
ID2D1RenderTarget::FillEllipse方法使用指定的填充画笔绘制一个填充的椭圆。椭圆由中心点和x和y半径指定。如果x和y半径相同,则结果是一个圆。
ID2D1RenderTarget::EndDraw方法表示此帧的绘制完成。所有绘图操作必须放在对BeginDraw和EndDraw的调用之间。
BeginDraw,Clear和FillEllipse方法都有一个void返回类型。如果在执行任何这些方法的过程中发生错误,则通过EndDraw方法的返回值来指示错误。 CreateGraphicsResources方法显示在创建Direct2D资源主题中。此方法创建渲染目标和纯色画笔。
设备可能会缓冲绘图命令并推迟执行,直到调用EndDraw。您可以通过调用ID2D1RenderTarget::Flush来强制设备执行任何挂起的绘图命令。但是,冲洗会降低性能。
处理设备丢失
程序正在运行时,正在使用的图形设备可能不可用。例如,如果显示分辨率改变,或者用户移除了显示适配器,则设备可能会丢失。如果设备丢失,则渲染目标也会与设备关联的任何设备相关资源一起失效。Direct2D通过从EndDraw方法返回错误代码D2DERR_RECREATE_TARGET来指示丢失的设备。如果收到此错误代码,则必须重新创建渲染目标和所有设备相关的资源。
要放弃资源,只需释放该资源的接口即可。
创建资源可能是一项昂贵的操作,因此不要为每个WM_PAINT消息重新创建资源。创建资源一次,然后缓存资源指针,直到资源由于设备丢失而变为无效,或直到您不再需要该资源为止。
Direct2D渲染循环
无论你画什么,你的程序都应该执行一个类似于下面的循环。
创建独立于设备的资源。
渲染场景。
检查是否存在有效的渲染目标。如果没有,则创建渲染目标和设备相关的资源。
调用ID2D1RenderTarget::BeginDraw。
发出绘图命令。
调用ID2D1RenderTarget::EndDraw。
如果EndDraw返回D2DERR_RECREATE_TARGET,则放弃渲染目标和设备相关的资源。
无论何时需要更新或重绘场景,请重复第2步。
如果渲染目标是一个窗口,则每当窗口收到WM_PAINT消息时,就会发生第2步。
此处显示的循环通过丢弃与设备相关的资源来处理设备丢失,并在下一个循环开始时重新创建它们(步骤2-1)。
下一个
DPI和设备无关的像素
原文链接:Drawing with Direct2D
绘制一个椭圆
Circle程序执行非常简单的绘图逻辑:
用纯色填充背景。
画一个实心圆。
Circle程序的屏幕截图。
因为渲染目标是一个窗口(与位图或其他非屏幕表面相反),所以绘制是为了响应WM_PAINT消息而完成的。以下代码显示了Circle程序的窗口过程。
LRESULT MainWindow::HandleMessage(UINT uMsg,WPARAM wParam,LPARAM lParam){ switch(uMsg){ case WM_PAINT: OnPaint(); return 0; // Other messages not shown... } return DefWindowProc(m_hwnd,uMsg,wParam,lParam); }
这是绘制圆的代码。
void MainWindow::OnPaint(){ HRESULT hr=CreateGraphicsResources(); if(SUCCEEDED(hr)){ PAINTSTRUCT ps; BeginPaint(m_hwnd,&ps); pRenderTarget->BeginDraw(); pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::SkyBlue)); pRenderTarget->FillEllipse(ellipse,pBrush); hr=pRenderTarget->EndDraw(); if(FAILED(hr)||hr==D2DERR_RECREATE_TARGET) DiscardGraphicsResources(); EndPaint(m_hwnd,&ps); } }
ID2D1RenderTarget接口用于所有绘图操作。该程序的OnPaint方法执行以下操作:
ID2D1RenderTarget::BeginDraw方法表示绘图的开始。
ID2D1RenderTarget::Clear方法使用纯色填充整个渲染目标。颜色以D2D1_COLOR_F结构给出。您可以使用D2D1::ColorF类来初始化结构。有关更多信息,请参阅在Direct2D中使用颜色。
ID2D1RenderTarget::FillEllipse方法使用指定的填充画笔绘制一个填充的椭圆。椭圆由中心点和x和y半径指定。如果x和y半径相同,则结果是一个圆。
ID2D1RenderTarget::EndDraw方法表示此帧的绘制完成。所有绘图操作必须放在对BeginDraw和EndDraw的调用之间。
BeginDraw,Clear和FillEllipse方法都有一个void返回类型。如果在执行任何这些方法的过程中发生错误,则通过EndDraw方法的返回值来指示错误。 CreateGraphicsResources方法显示在创建Direct2D资源主题中。此方法创建渲染目标和纯色画笔。
设备可能会缓冲绘图命令并推迟执行,直到调用EndDraw。您可以通过调用ID2D1RenderTarget::Flush来强制设备执行任何挂起的绘图命令。但是,冲洗会降低性能。
处理设备丢失
程序正在运行时,正在使用的图形设备可能不可用。例如,如果显示分辨率改变,或者用户移除了显示适配器,则设备可能会丢失。如果设备丢失,则渲染目标也会与设备关联的任何设备相关资源一起失效。Direct2D通过从EndDraw方法返回错误代码D2DERR_RECREATE_TARGET来指示丢失的设备。如果收到此错误代码,则必须重新创建渲染目标和所有设备相关的资源。
要放弃资源,只需释放该资源的接口即可。
void MainWindow::DiscardGraphicsResources(){ SafeRelease(&pRenderTarget); SafeRelease(&pBrush); }
创建资源可能是一项昂贵的操作,因此不要为每个WM_PAINT消息重新创建资源。创建资源一次,然后缓存资源指针,直到资源由于设备丢失而变为无效,或直到您不再需要该资源为止。
Direct2D渲染循环
无论你画什么,你的程序都应该执行一个类似于下面的循环。
创建独立于设备的资源。
渲染场景。
检查是否存在有效的渲染目标。如果没有,则创建渲染目标和设备相关的资源。
调用ID2D1RenderTarget::BeginDraw。
发出绘图命令。
调用ID2D1RenderTarget::EndDraw。
如果EndDraw返回D2DERR_RECREATE_TARGET,则放弃渲染目标和设备相关的资源。
无论何时需要更新或重绘场景,请重复第2步。
如果渲染目标是一个窗口,则每当窗口收到WM_PAINT消息时,就会发生第2步。
此处显示的循环通过丢弃与设备相关的资源来处理设备丢失,并在下一个循环开始时重新创建它们(步骤2-1)。
下一个
DPI和设备无关的像素
原文链接:Drawing with Direct2D
相关文章推荐
- Windows桌面应用程序(1-2-4-8th) 在Direct2D中使用颜色
- Windows桌面应用程序(1-2-4-4th) 您的第一个Direct2D程序
- electron之Windows下使用 html js css 开发桌面应用程序
- Windows桌面应用程序(1-1-2-1st) 使用DirectX设备资源
- Windows桌面应用程序(1-2-2-6th) 管理应用程序状态
- Windows桌面应用程序(1-2-3rd) 模块2.在Windows程序中使用COM
- Windows桌面应用程序(1-2-3-6th) 管理对象的生命周期
- Windows桌面应用程序(1-1-2nd) 开始使用DirectX for Windows
- electron之Windows下使用 html js css 开发桌面应用程序
- C#编写windows桌面应用程序将控件放入数组以便在循环中使用
- 使用Eclipse RCP进行桌面程序开发(五):2D绘图
- 使用Eclipse RCP进行桌面程序开发(五):2D绘图
- Windows桌面应用程序(1-2-5-6th) 加速器表
- 使用Eclipse RCP进行桌面程序开发(五):2D绘图
- Windows桌面应用程序(1-1st) 使用DirectX创建您的第一个Windows应用程序
- 使用NetBeans开发Java桌面应用程序时修改应用的UI样式为Windows
- 使用Eclipse RCP进行桌面程序开发(五):2D绘图
- Windows桌面应用程序(1-1-2-3rd) 使用着色器和着色器资源
- (Mirage系列之一)使用VMware Horizon Mirage进行灵活高效的Windows桌面分层、灾备、迁移及应用程序管理
- Windows桌面应用程序(1-1-1st) 使用DirectX进行开发的先决条件