Mfc CStatic派生类中的CPaintDC(this)无法控制

Mfc CStatic派生类中的CPaintDC(this)无法控制,mfc,gdi,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");

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

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

也许你看到的是不恰当的无效宣告。尝试在控件上拖动另一个窗口,看看它的作用

否则,将使用以下方法限制绘图区域:

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

    • 以下是我解决问题的方法

          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);
      

      在我的控件上拖动另一个窗口不会产生任何效果。这幅画还保留着。此外,控件实际上比我的图形小。顺便说一下,控件不在对话框上。它直接嵌入到视图中,所以你没有使用CFormView?您的控件是否直接位于子窗口中?您是否编写了自己的窗口创建代码?因为在常规mfc框架中,您总是需要窗口中的视图控件,当窗口中有控件时,通常是CFormView。那么你的控制画在什么上面呢?甚至在主应用程序窗口之外,您是否使用SDI或MDI接口?MDI接口,窗口内的CStatic控件。顺便说一句,这个例子从严格意义上讲可能并不“错误”,因为它不起作用,但至少它错误地使用了几个win32概念。首先,在最初的示例中,您是在OnPaint()中绘制的,在这里您使用GetDC()-在OnPaint()中,始终从GetPaintDC()获取DC(或者使用CPaintDC为您执行此操作)。其次,正如我在下面的回答中所建议的,将剪辑区域设置为非常大的区域与SetClipRgn(NULL)相同。这样,您就不必创建一个新的GDI对象,只需将其设置为表示“整个控件”的内容即可。因此,您可以使用CPaintDC删除整个示例(如下所示);dc.选择cliprgn(空);dc.MoveTo()/LineTo();-消除CRgn和DC的潜在泄漏。我仍然不确定你的应用程序一开始到底发生了什么-cstatic利用了什么?你说它在窗户里,但是什么窗户?我感觉你不知道发生了什么,MDI应用程序的子窗口中通常有几个窗口。如果不直接设置剪辑区域,则必须清除该区域通常表示您的窗口排序/创建有问题。