[MFC]CPaintDCとCClientDC | Assertion Failed!

[MFC]CPaintDCとCClientDC

ダイアログベースアプリで以下を試してみた。


※ 1/15訂正


■CPaintDC

void CSampleDlg::OnPaint()
{
  if (IsIconic())
  {
    ・・・中略
  }
  else
  {
    // CDialog::OnPaint();

    // ↑を削除すればOK

    CPaintDC dc(this);
    
    // 太さ2の赤色実線
    CPen pen(PS_SOLID, 2, RGB(255,0,0));
    
    CPen *old = dc.SelectObject(&pen);
    dc.MoveTo(10,10);
    dc.LineTo(100,100);
    
    dc.SelectObject(old);
    pen.DeleteObject();
  }
}


■CClientDC

void CSampleDlg::OnPaint()
{
  if (IsIconic())
  {
    ・・・中略
  }
  else
  {
    CDialog::OnPaint();

    CClientDC dc(this);
    
    // 太さ2の赤色実線
    CPen pen(PS_SOLID, 2, RGB(255,0,0));
    
    CPen *old = dc.SelectObject(&pen);
    dc.MoveTo(10,10);
    dc.LineTo(100,100);
    
    dc.SelectObject(old);
    pen.DeleteObject();
  }
}


結果、CPaintDCは描画されず、CClientDCは描画された。


CPaintDCはWM_PAINTメッセージをハンドルする関数のはずだけどわけがわからん。


ダイアログだから?SDIとかでOnPaint内に書けばいける?未確認。


<1/15追記>

ダイアログの基底クラスのOnPaintを呼んでいるらしく、削除したら

CPaintDCもいけた。


そもそもBeginPaintとEndPaintはきらい。

たとえコンストラクタとデストラクタでカプセル化しようとも。


CDCクラスを使うのが個人的に一番美しいと思う。