0

「静的 CPaintDC dc(this);」を作成しない限り 線が引かない?しかし、これは最終的にエラーになるため良くありません。また、グラフィックが画面に表示されなくなります。

何が間違っているのかわからない

注:100msごとにこれを呼び出すタイマーがあります(xとyがインクリメントされます)thx

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();
    }
}
4

2 に答える 2

1

LineTo選択したペンを使用して、ある点から別の点まで線を引きます。を使用MoveToして線の始点を定義する必要があり、ペンを DC に選択する必要があります。

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

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

于 2012-04-03T21:15:32.120 に答える
0

私はあなたの質問に答えていませんが、 IsIconic()がTRUEを返してもCDialog::OnPaint()が呼び出されることに気付きましたか?

これを解決するには、追加の{}ペアを使用する必要があると思います;-)

于 2012-04-19T06:29:31.207 に答える