2012-05-05 3 views
0

이미지에서 다룰 수있는 몇 가지 사용자 지정 컨트롤이 있는데,이 컨트롤이 화면에서 드래그되어 다시 표시되면 이미지가 제대로 다시 그려지지 않습니다. 나는이 다양한 컨트롤에 대해 페인트를 오버 라이딩했습니다. 화면에서 계속 드래그하면 올바르게 그려지지 않는 것 외에는 잘 작동하는 것 같습니다. 누구나 이것이 일어날 수있는 이유와 해결책을 알고 있습니까?오프 스크린/흐리게 처리 된 후 사용자 정의 컨트롤에서 다시 그리기를 트리거 하시겠습니까?

편집 : 대화 상자가 단순히 화면에서 벗어난 경우가 아니라 너무 빨리 크기가 조정 된 경우에도 문제가있는 것 같습니다. 그들은 그들 자신 위에 그려진 것처럼 보이기 시작합니다. 어떤 종류의 의미가 있지만, 나는 그것을 치료하는 방법을 알아낼 수 없습니다.

편집 2 : 이들은 fourstates (호버, 정상 장애인 클릭)와 사용자 정의 버튼, 그래서 내가 컨테이너 것은 내가 문제를 생각하지 않는 생각하지 않습니다 ..? 의 OnPaint 코드는 다음과 같습니다



private void CQPButton_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.Clear(BackColor); 

    if (BackgroundImage != null) 
     e.Graphics.DrawImage(BackgroundImage, e.ClipRectangle); 

    if (Image != null) 
    { 
     RectangleF rect = new RectangleF(); 
     rect.X = (float)((e.ClipRectangle.Width - Image.Size.Width)/2.0); 
     rect.Y = (float)((e.ClipRectangle.Height - Image.Size.Height)/2.0); 
     rect.Width = Image.Width; 
     rect.Height = Image.Height; 
     e.Graphics.DrawImage(Image, rect); 
    } 

    if (Text != null) 
    { 
     SizeF size = e.Graphics.MeasureString(this.Text, this.Font); 

     // Center the text inside the client area of the PictureButton. 
     e.Graphics.DrawString(this.Text, 
      this.Font, 
      new SolidBrush(this.ForeColor), 
      (this.ClientSize.Width - size.Width)/2, 
      (this.ClientSize.Height - size.Height)/2); 
    } 

} 

나는 시도하고 그들이 스크린 떨어져있을 때 처리하는 ClientSizeChanged 다양한 이벤트 LocationChanged에 다시 칠하고 시도하고 크기 조정 문제를 처리하는 이동 강제로 시도했습니다, 그리고 아무것도 고집. 나는 내가 무엇을 놓치고 있는지 모른다. ...

+0

: 당신은 당신의 통제의 실제 크기를 사용해야합니다. –

+0

@ JohnArlen - OnPaint 이벤트와 약간의 설명을 추가했습니다. – trycatch

답변

3

나는 코드 스 니펫을 본 후 나의 대답을 완전히 바꿨다. 그것은 버그가 있습니다 e.ClipRectangle 여기에 잘못 사용

RectangleF rect = new RectangleF(); 
    rect.X = (float)((e.ClipRectangle.Width - Image.Size.Width)/2.0); 
    rect.Y = (float)((e.ClipRectangle.Height - Image.Size.Height)/2.0); 

을 항상 그려야하는 제어 요구의 어떤 부분에 따라 변경되는 값입니다. 그리고 예, 컨트롤의 크기를 조정하거나 화면에서 부분적으로 드래그하면 대부분 변경됩니다. 그것은 당신의 렌더링 코드의 관련 조각을보고 도움이 될 수

rect.X = (float)((this.ClientSize.Width - Image.Size.Width)/2.0); 
    rect.Y = (float)((this.ClientSize.Height - Image.Size.Height)/2.0); 
+0

내 대답을 OnPaint 코드로 편집했습니다. 불행히도, 이것들은 콘테이너가 아니고, 버튼입니다. 편집에 좀 더 설명했습니다. – trycatch

+0

답답합니다. 향후 질문에 코드 스 니펫을 게시하십시오. –

+0

Bah, 그게 다야! 나는 내가 어떻게 생각하지 않았는지 모르겠다! – trycatch