1

正如标题所说。即使在派生类中使用 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);
}
4

2 回答 2

2

那么,您的 CGraph 是从 CStatic 派生的,并且您显示的绘图代码在 CStatic 控件之外绘制到它所在的对话框上?这是不可能的,控件只能利用自身。你确定控制没有你想象的那么大,你认为失控的东西实际上不是吗?使用 spy++ 选择你的 cstatic,它会显示窗口的边框。

也许您看到的是不正确的失效。尝试将另一个窗口拖到您的控件上,看看会发生什么。

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

  • 您手动跟踪绘制位置。乏味。
  • 使用 SetClipRgn() 设置限制绘图的区域。
  • 不太一样,但症状有时看起来很相似:检查控件的 WS_CLIPSIBLINGS 和 WS_CLIPCHILDREN 标志以及它所在的对话框。
于 2012-07-04T15:05:07.723 回答
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);
于 2012-07-30T06:54:25.847 回答