MFC应用程序中AFX_WM_DRAW2D和WM_PAINT的关系
Relationship between AFX_WM_DRAW2D and WM_PAINT in MFC Application
主题中两个消息之间的关系是什么?当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);
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未被处理或D2D不被操作系统支持或未启用,则标准WM_PAIT算法正在工作。
注:: MFC 12只支持D2D 1.0,不支持D2D 1.1或D2D 1.2!因为D2D。x需要完整的Direct3D初始化为D2D的地下关卡,因此很难在MFC中为它们编写通用代码。
P.P.S.:如果你的APP执行打印抛出MFC,那么查看器OnDraw方法将被调用。这是因为D2D渲染不支持绘制到打印机上下文。任何打印的D2D应用程序必须实现两个方法:用于打印和旧操作系统(不支持D2D)的OnDraw()和用于屏幕上绘制的AFX_WM_DRAW2D处理。
相关文章:
- "WM" C++是什么意思?
- 如何访问委托的paint()函数中的另一个索引?
- 直接在QlistView上绘制小部件,并使用QStyleDitemdelegate :: Paint()
- QT4:在所有qgraphicsItem上的单个qgraphictem rapers paint()上的update()
- 什么是窗口最大化/最小化/恢复的WM Windows消息
- Qt. 方法显示文本() 如果我在 QStyledItemDelegate 中定义了 paint() 方法不起作用
- 如何在我的子类控件paint方法中在默认的paint结果之上绘制一些东西
- 请求X11在C或C++中合成WM的图像
- Qt QTableView paint() 事件无限期交付,占用 100% 的 CPU 内核
- Paint QPushButton with QLinearGradient
- Paint Job Estimator C++
- Q即使宽度和高度都为非零,也不调用ridget paint
- Qt paint事件崩溃
- 如何使用插槽实时更新paint()
- paint函数中的QStyleOptionViewItem参数-如何处理它
- 除非先使用MS Paint打开/保存文件,否则带有QRCode位图的LoadImage()将失败
- 如何将使用Qt Paint Application绘制的图像传输到Mat openCV
- OpenGL新手,致力于"paint"程序
- 如果在WM/CE平台中用于卸载,DMProcessConfigXML将关闭正在运行的应用程序
- 重写QGraphicsItem的paint()和mouseEvents()