2009-07-09 3 views
1

저는 C++/CLI System::Windows::Forms::UserControl 파생 된 컨트롤을 가지고 있습니다.이 컨트롤은 새 데이터가 공급 될 때만 그 자체를 다시 그려야합니다. 어떤 이유로 인해 OnPaint 메커니즘은 앱 외부에 아무 것도없는 경우에도 호출됩니다.System :: Windows :: Forms :: UserControl이 백그라운드를 지우지 않게하려면 어떻게합니까?

여기에 코드 조각입니다 :

void Spectrogram::OnPaint(System::Windows::Forms::PaintEventArgs ^e) 
{ 
    // Overidden to stop the background being painted(?) 
} 

void Spectrogram::AddNewFFTData(float* data, int fataWidth) 
{ 
    Graphics^ gfx = CreateGraphics(); 

    //now do some drawing 

    gfx->Dispose(); 
} 

그래서 내가 (일부 강조를 지 웁니다) 이전 항목을 통해 이론 쓰기에 새 항목을 작성해야 새로운 데이터를 추가하기 위해 추가 데이터 메서드를 호출합니다.

위로 MFC/OpenGL 앱을 개발하는 데 사용했던 날에 처음으로 할 일 중 하나는 OnEraseBackground 메서드를 덮어 쓰는 것입니다. 내가 볼 수있는 한, 지우는 것을 막을 명백한 방법은 없습니다. 나는 무엇을 놓쳤는가? 그래서 당신은 OnPaintBackground를 오버라이드 (override) 할 필요가 없습니다, 대신 당신은 (배경을 지울 수 있습니다 : 나는 그 OnPaintBackground 전혀 호출되는 것을 방지 생각

//do own background painting 
this.SetStyle(ControlStyles.Opaque, true); 

:

답변

5

Control.OnPaintBackground()을 찾고있을 수 있습니다. WinForms 프로젝트에 레거시 MFC 컨트롤을 가져 오기 위해 작성한 사용자 지정 컨트롤에 대해 아무 것도하지 않으려면이 컨트롤을 재정의해야했습니다. 그렇지 않은 경우는, 백그라운드를 MFC 컨트롤의 페인트 작업의 맨 위에 페인트합니다.

본질적으로, 통화 당에서 : 프로토 타입에

void MyControl::OnPaintBackground(System::Windows::Forms::PaintEventArgs ^pevent) 
{ 
    // Do nothing, we don't want to paint over the native control. 
    // You may want to do something a little fancier for DesignMode 
    // if you use the winforms designer, though. 
} 

:

protected: 
    void virtual OnPaintBackground(System::Windows::Forms::PaintEventArgs ^pevent) override; 

이벤트 인수를 통해 당신에게 어떤 사각형을 전달되는? 전체 컨트롤이 무효화 되었습니까, 아니면 일부만 무효화 되었습니까?

+0

+1 : 그게 훌륭합니다. 정확히 내가 찾고 있던 것이 었습니다. –

+0

기억할 것은 한 가지 더 있습니다. 이중 버퍼링을 해제했는지 확인하십시오. 그렇지 않으면 버퍼가 가끔 스왑하고 모든 것을 지울 것입니다. –

+0

아, 전체 컨트롤이 무효화되었습니다. –

4

은 아마 폼의 생성자에서이 같은 문이다 또는 아닙니다) OnPaint에 자신을 초대하십시오.

+1

+1 : 방금 테스트 했으므로 옳았습니다. 배경이 지워지는 것을 막을 수있는 설정 - 두 가지 대답을 모두 받아 들일 수 있기를 바랍니다. –

+0

+1 : 쿨, 그 것에 대해 몰랐습니다. :) –

0

최근에 OnPaint를 사용하여 (C#, 중요하다면) 몇 가지 작업을 수행했으며 컨트롤의 영역이 공개 될 때 문자 그대로 그려지는 것으로 나타났습니다.

더 나은 솔루션은 캐시 된 Bitmap에 그려서 dotNet에서 요청할 때마다 컨트롤에 그립니다.

관련 문제