C++ 强制重新绘制Direct2D BeginDraw(); DrawD2DResource(pRenderTarget); pRenderTarget->EndDraw(); } void RenderArea::DrawD2DResource(CDCRenderTarget*pDCRenderTarget) { 断言_有效(pDCRenderTarget); D2D1_彩色_F crBack= CRenderTarget::COLORREF_TO_D2DCOLOR(::GetSysColor(COLOR_窗口)); pDCRenderTarget->清除(crBack); CD2DSizeF-sizeTrans(0.f,105.f); pDCRenderTarget->SetTransform(D2D1::Matrix3x2F::Translation(sizeTrans)); cd2deliple椭圆(cd2drecf(10.f,10.f,200.f,100.f)); CD2DSolidColorBrush画笔(pDCRenderTarget,::GetSysColor(COLOR_WINDOWTEXT)); pDCRenderTarget->Drumellipse(椭圆和笔刷); CD2DPointF pointFrom(10.f,10.f),pointTo(200.f,100.f); pDCRenderTarget->DrawLine(点起点、点终点和笔刷); pDCRenderTarget->SetTransform(D2D1::IdentityMatrix()); 返回; } LRESULT RenderArea::OnAfxDraw2D(WPARAM WPARAM,LPARAM LPARAM) { CDCRenderTarget*pDCRenderTarget=(CDCRenderTarget*)LPRAM; ASSERT_KINDOF(CDCRenderTarget、pDCRenderTarget); DrawD2DResource(pDCRenderTarget); HRESULT hr=pDCRenderTarget->EndDraw(); 返回静态_cast(TRUE); } 调试断言对话框中有获取更多信息的说明。如果您调试应用程序,IDE将直接导致失败的断言。这会提示您哪些条件失败。对你或任何想帮忙的人都很有帮助。故障点的调用堆栈也是非常有价值的信息。您应该在问题中添加这两个细节。在Invalidate()上会发生什么,您是否在某处有WM_PAINT处理程序?关于选项2,您需要在某个时候调用BIndDC。

C++ 强制重新绘制Direct2D BeginDraw(); DrawD2DResource(pRenderTarget); pRenderTarget->EndDraw(); } void RenderArea::DrawD2DResource(CDCRenderTarget*pDCRenderTarget) { 断言_有效(pDCRenderTarget); D2D1_彩色_F crBack= CRenderTarget::COLORREF_TO_D2DCOLOR(::GetSysColor(COLOR_窗口)); pDCRenderTarget->清除(crBack); CD2DSizeF-sizeTrans(0.f,105.f); pDCRenderTarget->SetTransform(D2D1::Matrix3x2F::Translation(sizeTrans)); cd2deliple椭圆(cd2drecf(10.f,10.f,200.f,100.f)); CD2DSolidColorBrush画笔(pDCRenderTarget,::GetSysColor(COLOR_WINDOWTEXT)); pDCRenderTarget->Drumellipse(椭圆和笔刷); CD2DPointF pointFrom(10.f,10.f),pointTo(200.f,100.f); pDCRenderTarget->DrawLine(点起点、点终点和笔刷); pDCRenderTarget->SetTransform(D2D1::IdentityMatrix()); 返回; } LRESULT RenderArea::OnAfxDraw2D(WPARAM WPARAM,LPARAM LPARAM) { CDCRenderTarget*pDCRenderTarget=(CDCRenderTarget*)LPRAM; ASSERT_KINDOF(CDCRenderTarget、pDCRenderTarget); DrawD2DResource(pDCRenderTarget); HRESULT hr=pDCRenderTarget->EndDraw(); 返回静态_cast(TRUE); } 调试断言对话框中有获取更多信息的说明。如果您调试应用程序,IDE将直接导致失败的断言。这会提示您哪些条件失败。对你或任何想帮忙的人都很有帮助。故障点的调用堆栈也是非常有价值的信息。您应该在问题中添加这两个细节。在Invalidate()上会发生什么,您是否在某处有WM_PAINT处理程序?关于选项2,您需要在某个时候调用BIndDC。,c++,mfc,direct2d,C++,Mfc,Direct2d,稍后,当我想将组合框返回到初始状态时,我调用DoD2D()方法。如果该方法是使用第一个选项实现的,那么它将按预期工作,但有时会在Visual Studio中产生断言错误(Winhand.cpp第208行)。如果我使用DoD2D()方法的第二个选项,则什么也不会发生(图形内容不会绘制) 我是不是遗漏了什么 RenderArea::RenderArea() : CButton() { BOOL bUseDCRenderTarget = TRUE; EnableD2DSupport(T

稍后,当我想将组合框返回到初始状态时,我调用DoD2D()方法。如果该方法是使用第一个选项实现的,那么它将按预期工作,但有时会在Visual Studio中产生断言错误(Winhand.cpp第208行)。如果我使用DoD2D()方法的第二个选项,则什么也不会发生(图形内容不会绘制)

我是不是遗漏了什么

RenderArea::RenderArea() : CButton()
{
    BOOL bUseDCRenderTarget = TRUE;
    EnableD2DSupport(TRUE, bUseDCRenderTarget);
}

void RenderArea::DoDataExchange(CDataExchange* pDX)
{
    CButton::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(RenderArea, CButton)
    ON_REGISTERED_MESSAGE(AFX_WM_DRAW2D, &RenderArea::OnAfxDraw2D)
END_MESSAGE_MAP()

void RenderArea::DoD2D()
{
    if (!IsD2DSupportEnabled())
        return;

    // Option 1) Works, but fails an assertion in debug mode
    Invalidate();
    return;

    // Option 2) Does not work.
    CDCRenderTarget *pRenderTarget = GetDCRenderTarget();
    pRenderTarget->BeginDraw();
    DrawD2DResource(pRenderTarget);
    pRenderTarget->EndDraw();
}

void RenderArea::DrawD2DResource(CDCRenderTarget* pDCRenderTarget)
{
    ASSERT_VALID(pDCRenderTarget);

    D2D1_COLOR_F crBack =
        CRenderTarget::COLORREF_TO_D2DCOLOR(::GetSysColor(COLOR_WINDOW));
    pDCRenderTarget->Clear(crBack);

    CD2DSizeF sizeTrans(0.f, 105.f);
    pDCRenderTarget->SetTransform(D2D1::Matrix3x2F::Translation(sizeTrans));

    CD2DEllipse ellipse(CD2DRectF(10.f, 10.f, 200.f, 100.f));
    CD2DSolidColorBrush brush(pDCRenderTarget, ::GetSysColor(COLOR_WINDOWTEXT));
    pDCRenderTarget->DrawEllipse(ellipse, &brush);
    CD2DPointF pointFrom(10.f, 10.f), pointTo(200.f, 100.f);
    pDCRenderTarget->DrawLine(pointFrom, pointTo, &brush);

    pDCRenderTarget->SetTransform(D2D1::IdentityMatrix());

    return;
}

LRESULT RenderArea::OnAfxDraw2D(WPARAM wParam, LPARAM lParam)
{
    CDCRenderTarget* pDCRenderTarget = (CDCRenderTarget*)lParam;
    ASSERT_KINDOF(CDCRenderTarget, pDCRenderTarget);

    DrawD2DResource(pDCRenderTarget);

    HRESULT hr = pDCRenderTarget->EndDraw();

    return static_cast<LRESULT>(TRUE);
}
RenderArea::RenderArea():CButton()
{
BOOL-bUseDCRenderTarget=TRUE;
启用D2D支持(正确,bUseDCRenderTarget);
}
void RenderArea::DoDataExchange(CDATA Exchange*pDX)
{
CButton::DoDataExchange(pDX);
}
开始消息映射(渲染区域、C按钮)
在已注册的消息上(AFX\U WM\U DRAW2D和RenderArea::OnAfxDraw2D)
结束消息映射()
void RenderArea::DoD2D()
{
如果(!IsD2DSupportEnabled())
返回;
//选项1)工作,但在调试模式下断言失败
使无效();
返回;
//选项2)不起作用。
CDCRenderTarget*pRenderTarget=GetDCRenderTarget();
pRenderTarget->BeginDraw();
DrawD2DResource(pRenderTarget);
pRenderTarget->EndDraw();
}
void RenderArea::DrawD2DResource(CDCRenderTarget*pDCRenderTarget)
{
断言_有效(pDCRenderTarget);
D2D1_彩色_F crBack=
CRenderTarget::COLORREF_TO_D2DCOLOR(::GetSysColor(COLOR_窗口));
pDCRenderTarget->清除(crBack);
CD2DSizeF-sizeTrans(0.f,105.f);
pDCRenderTarget->SetTransform(D2D1::Matrix3x2F::Translation(sizeTrans));
cd2deliple椭圆(cd2drecf(10.f,10.f,200.f,100.f));
CD2DSolidColorBrush画笔(pDCRenderTarget,::GetSysColor(COLOR_WINDOWTEXT));
pDCRenderTarget->Drumellipse(椭圆和笔刷);
CD2DPointF pointFrom(10.f,10.f),pointTo(200.f,100.f);
pDCRenderTarget->DrawLine(点起点、点终点和笔刷);
pDCRenderTarget->SetTransform(D2D1::IdentityMatrix());
返回;
}
LRESULT RenderArea::OnAfxDraw2D(WPARAM WPARAM,LPARAM LPARAM)
{
CDCRenderTarget*pDCRenderTarget=(CDCRenderTarget*)LPRAM;
ASSERT_KINDOF(CDCRenderTarget、pDCRenderTarget);
DrawD2DResource(pDCRenderTarget);
HRESULT hr=pDCRenderTarget->EndDraw();
返回静态_cast(TRUE);
}

调试断言对话框中有获取更多信息的说明。如果您调试应用程序,IDE将直接导致失败的断言。这会提示您哪些条件失败。对你或任何想帮忙的人都很有帮助。故障点的调用堆栈也是非常有价值的信息。您应该在问题中添加这两个细节。在Invalidate()上会发生什么,您是否在某处有WM_PAINT处理程序?关于选项2,您需要在某个时候调用BIndDC。