繁体   English   中英

MFC 在基于对话框的应用程序中在 OnPaint 之外绘制内容

[英]MFC Draw Stuff Outside OnPaint in a Dialog-based App

我目前正在尝试在 OnPaint function 之外绘制一些东西。我知道在 inte.net 上有很多重复的问题,但是,我没有让他们中的任何一个工作。 这完全是因为我对MFC缺乏了解。

OnPaint 内部的工作原理:

CDC* pDC = GetDC();
HDC hDC = pDC->GetSafeHdc();
CRect lDisplayRect;
GetDlgItem(IDC_DISPLAYPOS)->GetClientRect(&lDisplayRect);
GetDlgItem(IDC_DISPLAYPOS)->ClientToScreen(&lDisplayRect);
ScreenToClient(&lDisplayRect);
pDC->FillSolidRect(&lDisplayRect, GetSysColor(COLOR_3DDKSHADOW));
pDC->TextOutW(300, 300, TEXT("test"));

它用定义的颜色填充按钮控件的区域。 它会毫无问题地打印出“测试”字符串。

但它不会在 OnPaint 之外工作。

我已经看到许多建议,例如使用 CmemDC、CPaintDC 等,但没有一个在 OnPaint 之外工作。

例如,

CClientDC dc(this);
dc.rectangle( ....);

不起作用。

请注意,这是一个临时测试代码,我最终要做的是在 DisplayPos 区域和我的 dlg 对象(对话框) 拥有 DisplayThread class 的一个实例。我在创建成员 mDisplayThread 时传递了 HWND 和 displayrect,这样我就可以在显示线程中绘制东西,这就是为什么我需要能够在 OnPaint 之外绘制到 DC (DisplayThread class没有 OnPaint 或继承任何具有它的 class)。

我急需帮助...请帮忙!

补充:我已经覆盖了 PreTranslateMessage(MSG* pMsg) 并使其返回而不调用默认值 function 以防 WM_ERASE msg 擦除所有内容,但这种方法也不起作用。

例如:

void CMFCApplicationDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: Add your message handler code here and/or call default
    HDC hdc = ::GetDC(m_hWnd);
    Ellipse(hdc, point.x - 10, point.y - 10, point.x + 10, point.y + 10);

   ::ReleaseDC(m_hWnd, hdc);
    CDialogEx::OnLButtonDown(nFlags, point);
}

两个重要的建议:

  1. 不要在OnPaint之外绘制。 内容可能会在操作系统的指导下被擦除或涂上。

  2. 不要在对话框表面上绘制。 首先,它不是为此而设计的。 它可能会受到其他控件或主题、皮肤等的影响。只需使用您自己的 window 过程创建一个 window,这样您就可以控制了。

我会将绘图所需的信息存储在您的frame grabber中,并通过调用RedrawWindow立即进行 window 绘图

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM