主题中两条消息之间的关系是什么?何时将AFX_WM_DRAW2D传递给应用程序队列。
我在问,因为我遇到了AFX_WM_DRAW2D处理程序最奇怪的递归调用。每当我试图在AFX_WM_DRAW2Din兼容渲染目标中绘制内容时,处理程序以某种方式递归调用,我很难解释。 MFC应用程序的结构如下: -
BEGIN_MESSAGE_MAP(CTACSIView, CView)
// Standard printing commands
...
ON_REGISTERED_MESSAGE(AFX_WM_DRAW2D, &CTACSIView::OnDraw2D)
END_MESSAGE_MAP()
afx_msg LRESULT CTACSIView::OnDraw2D(WPARAM wParam, LPARAM lParam)
{
CHwndRenderTarget* pRenderTarget = (CHwndRenderTarget*)lParam;
ASSERT_VALID(pRenderTarget);
CRect clientRect;
GetClientRect(clientRect);
if (m_BackGroundHasChanged)
{
CBitmapRenderTarget compatibleRenderTarget;
pRenderTarget->CreateCompatibleRenderTarget(compatibleRenderTarget, m_viewScreenSize);
compatibleRenderTarget.BeginDraw();
//
// ----> HERE THE RECURSIVE CALL OCCURS <----
//
D2D1::Matrix3x2F shiftRightTranslation = D2D1::Matrix3x2F::Translation(D2D1::SizeF(TACSI_VIEW_BATTLE_FIELD_OFFSET_X, 0));
m_pRulerBitmapBrush_X.SetTransform(&shiftRightTranslation);
compatibleRenderTarget.FillRectangle(rulerRectangle_X, &m_pRulerBitmapBrush_X);
答案 0 :(得分:0)
MFC内部处理WM_PAINT消息(查看CWnd :: OnWndMsg源代码)并尝试进行D2D绘制(调用受保护的CWnd :: DoD2DPaint()方法)。此方法检查是否为窗口启用了D2D(方法CWnd :: EnableD2DSupport)并为此窗口发送内部MFC消息AFX_WM_DRAW2D。
因此,如果您在代码中处理AFX_WM_DRAW2D,则CWnd :: DoD2DPaint()将返回TRUE,并且阻止进一步处理WM_PAINT。如果未处理AFX_WM_DRAW2D或OS未支持D2D或未启用D2D,则标准WM_PAIT算法正在运行。
P.S。: MFC 12仅包含D2D 1.0支持,而不包含D2D 1.1或D2D 1.2! 因为D2D 1.x需要将完整的Direct3D初始化作为D2D的地下级别,因此很难在MFC中为它们编写通用代码。
P.P.S。:如果您的APP执行打印抛出MFC,则将调用查看器OnDraw方法。这是因为D2D渲染不支持绘制到打印机上下文。 任何打印的D2D应用程序都必须实现两种方法:OnDraw()用于打印和旧操作系统(不支持D2D)和AFX_WM_DRAW2D处理用于在屏幕上绘制。