CPaintDC(this)在CStatic派生类涂料中无法控制

时间:2012-07-04 13:42:29

标签: mfc gdi

正如标题所说。 即使在派生类中使用CPaintDC,GDI绘图也不会被切断。 提前谢谢。

void CGraph::OnPaint ()
{
   CPaintDC dc(this);
   dc.SetViewportOrg (0, 400);
   dc.SetMapMode(MM_ISOTROPIC);
   dc.SetWindowExt(1000, 800);
   dc.SetViewportExt(1000, -800);

   // MessageBox(L"OnPaint");
   ProcessData ();
   DrawCoordinateSystem (&dc);
   DrawGrid (&dc);
   DrawGraph (&dc);
}

2 个答案:

答案 0 :(得分:2)

那么,你的CGraph是从CStatic派生的,你展示的绘图代码是在CStatic控件之外绘制到它所在的对话框上的吗?这是不可能的,控制只能依靠自己。你确定控制力不比你想象的要大,而你认为​​失控的实际上并不是吗?使用spy ++选择你的cstatic,它会显示窗口的边框。

也许你所看到的是不正当的失效。尝试在控件上拖动另一个窗口,看看它是做什么的。

否则,限制绘图区域的方法是

  • 您手动跟踪绘制的位置。乏味的。
  • 使用SetClipRgn()设置限制绘图的区域。
  • 不完全相同,但症状有时看起来相似:检查控件的WS_CLIPSIBLINGS和WS_CLIPCHILDREN标志及其对话框。

答案 1 :(得分:1)

这是我解决问题的方法

    CDC* pDC = GetDC();
    CRect rClient(0,0,1000,800);
    //GetClientRect(rClient);
    CRgn ClipRgn;

    if (ClipRgn.CreateRectRgnIndirect(&rClient))
    {
        pDC->SelectClipRgn(&ClipRgn);
    }

    pDC->SelectObject (PenBlack);
    pDC->MoveTo (-leftMargin*zoomWidth, setPointsCorrected);
    pDC->LineTo (1000*zoomWidth, setPointsCorrected);

    pDC->SelectClipRgn(NULL);
    ReleaseDC(pDC);