2012-04-03 19 views
0

「静的CPaintDC dc(this);」を作成しない限り、ラインは描画されませんか?しかし、これは最終的にはエラーになりますので、グラフィックスは画面上に表示されません。dc.Lineマウスを動かしてウィンドウを移動しない限り、OnPaint()を描画しないでください。

わからない私が間違って

注意をしています:私は

void CGraphicsDlg::OnPaint() 
{ 
    CString s; 
    CPaintDC dc(this);// device context for painting 

    if (IsIconic()) 
    { 
     SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 

     // Center icon in client rectangle 
     int cxIcon = GetSystemMetrics(SM_CXICON); 
     int cyIcon = GetSystemMetrics(SM_CYICON); 
     CRect rect; 
     GetClientRect(&rect); 
     int x = (rect.Width() - cxIcon + 1)/2; 
     int y = (rect.Height() - cyIcon + 1)/2; 

     // Draw the icon 
     dc.DrawIcon(x, y, m_hIcon); 
    } 
    else if(x==0) 
    { 
     s.Format("%d", x); 
     edXa->SetWindowText(s); 

     dc.MoveTo(20,400); 
    } 
    else if (x>0){ 
     s.Format("%d", x); 
     edXb->SetWindowText(s); 

     dc.LineTo(20 + x, 40); // doesn't draw unless I make "static CPaintDC dc(this);" <- which will error out 
    } 
    CDialog::OnPaint(); 
} 

void CGraphicsDlg::OnTimer(UINT nIDEvent) 
{ 
    if(nIDEvent==1){ 
     srand((unsigned)time(NULL)); 

     //y = rand() % 100; 
     y++; 
     x++; 

     OnPaint(); 
    } 
} 

答えて

1

LineToは一点から線を描画 THX(xとyがインクリメントされている)100ms毎にこれに呼び出すタイマーを持っています選択したペンを使用して別のペンに移動します。行の先頭を定義するにはMoveToを使用する必要があります.DCにペンを選択する必要があります。

大きな問題は、DCをどのように使用しようとしているかです。それは恒久的なものではありません。あなたはそれを取得し、すべてを引き出し、それをシャットダウンするはずです。 CPaintDCを静的にしようとすると、Windowsは最終的にシャットダウンし、それ以降の使用はエラーを返します。

すべての必要な座標を保存する必要があります。する必要があります。 MoveToLineToの組み合わせを使用して個々の線分を描画し、OnPaintを再入力するたびに最初からやり直す必要があります。

+0

を解決するために{}の余分なペアを使用する必要があるだろうと思い – jdl

+0

何あなたは「ペンをDCに」という意味ですか? thx – jdl

+1

@jdlでは、CPenオブジェクトを作成し、 'dc.SelectObject'を使用してそれを選択します。あなたは 'MoveTo'を行うコードを持っていますが、同時に両方を行う必要があります。 OnPaintが次に呼び出されるときに 'MoveTo'が失われます。 –

0

私はあなたの質問に答えていないのですが、あなたはのCDialog ::のOnPaint()があってもIsIconic()戻りTRUEと呼ぶことに気づきましたか?

は、私はあなたが私は、x == 0の条件が満たされたとき...あなたはコード内で見ることができません。この;-)

関連する問題