2016-04-08 10 views
2

私はMFCを学んでいますが、MFCダイアログベースのアプリケーションのメインウィンドウにいくつかの線を描こうとしていますが、それはむしろ単純な作業ですが、実行中はダイアログに線が表示されません。CDC :: LineTo()がVisual C++ 2015 MFCダイアログで描画されないのはなぜですか?

// draw corner of a rectangle on specified device context 
void CTestDrawCornerDlg::DrawCorner(
    CDC* pDC, 
    const CornerType& type, 
    const CPoint& position, 
    const unsigned int& size 
    ) 
{ 
    CPen pen(PS_SOLID, 5, RGB(0, 0, 0)); 
    CPen* pOldPen = pDC->SelectObject(&pen); 

    CPoint pH, pV; 
    // I could make following lines simply with a 2-lines block, 
    // but I'd leave it as it was to make it easier to understand. 
    switch (type) 
    { 
    case LEFT_TOP: 
     pH.x = position.x + size; 
     pH.y = position.y; 
     pV.x = position.x; 
     pV.y = position.y + size; 
     break; 
    case LEFT_BOTTOM: 
     pH.x = position.x - size; 
     pH.y = position.y; 
     pV.x = position.x; 
     pV.y = position.y + size; 
     break; 
    case RIGHT_TOP: 
     pH.x = position.x + size; 
     pH.y = position.y; 
     pV.x = position.x; 
     pV.y = position.y - size; 
     break; 
    case RIGHT_BOTTOM: 
     pH.x = position.x - size; 
     pH.y = position.y; 
     pV.x = position.x; 
     pV.y = position.y - size; 
     break; 
    default: break; 
    } 
    pDC->MoveTo(position); 
    pDC->LineTo(pH); 
    pDC->MoveTo(position); 
    pDC->LineTo(pV); 

    pDC->SelectObject(pOldPen); 
} 

をそして、私はダイアログクラスののOnPaintメソッドでこのメソッドを呼び出した:

void CTestDrawCornerDlg::OnPaint() 
{ 
    if (IsIconic()) 
    { 
     CPaintDC dc(this); // device context for painting 
     // lines generated automatically when creating 
     // MFC project are truncated for brevity 
    } 
    else 
    { 
     CDialogEx::OnPaint(); 
    } 

    CPaintDC pDC(this); 
    DrawCorner(&pDC, LEFT_TOP, CPoint(50, 50), 50); 
} 

私はそれが初心者の間違いだと思うけど、私はただ知らない後

は、私が書いた方法であり、間違いは何ですか?手伝ってくれてありがとう!

P.S.再作成し、この問題には次のリンクからMFCプロジェクトをダウンロードしてください: https://www.dropbox.com/s/exeehci9kopvgsn/TestDrawCorner.zip?dl=0

+0

コードは問題ありません。 ON_WM_PAINTを持っていない可能性があります –

+0

ON_WM_PAINTは、ダイアログプロジェクトの作成時にデフォルトで宣言されています。私はこのポストに小さなデモプロジェクトをアップロードしようとしていましたが、今はその方法を理解していませんでした... –

+0

私は、DrawCornerコールをOnPaint()メソッド、すなわちCDialogEx :: OnPaint()を呼び出す前に呼び出されます。そして、私はダイアログで期待される線を得ることができます。理由が誰にでも答えられるようにまだ開いています... –

答えて

3

あなたは次のようにCDialogEx::OnPaint() + CClientDCを使用するようにコードを変更することができます。

void CTestDrawCornerDlg::OnPaint() 
{ 
    CDialogEx::OnPaint(); 
    CClientDC pDC(this); 
    DrawCorner(&pDC, LEFT_TOP, CPoint(50, 50), 50); 
} 

またはちょうどCPaintDCを使用します。

void CTestDrawCornerDlg::OnPaint() 
{ 
    CPaintDC pDC(this); 
    DrawCorner(&pDC, LEFT_TOP, CPoint(50, 50), 50); 
} 

ただし、使用しないでください。OnPaint + CPaintDC

OnPaintCPaintDCがMFCに定義されているかに注意し、問題を表示するには:

void CDialog::OnPaint() 
{ 
    CPaintDC dc(this); 
    if (PaintWindowlessControls(&dc)) 
     return; 
    Default(); 
} 

CPaintDC::CPaintDC(CWnd* pWnd) 
{ 
    if (!Attach(::BeginPaint(m_hWnd = pWnd->m_hWnd, &m_ps))) 
     AfxThrowResourceException(); 
} 

::BeginPaintは、コアWinAPIの関数です。それはWM_PAINTに応答して一度だけ呼び出され、他の場所では使用できません。

CClientDCは、::GetDCを使用しています。これは、ウィンドウハンドルが利用できる限り、どこでも使用できます。

+0

すばらしい答え!なぜ私はOnPaint + CPaintDCを使用してはならないのか分かりませんでした。私は解決策を試して、今すぐ動作します。 –

関連する問題