문제

이것은 C#데스크톱 응용 프로그램입니다.이 DrawStyle 시설 내 ListBox 설정 OwnerDrawFixed.

문제: 나는 무시 DrawItem 을 그리는 텍스트에는 다른 글꼴,그리고 그것을 작동합니다.하지만 시작할 때의 크기를 조정 양식에서 런타임,선택된 항목이 올바르게 그려진,그러나 나머지 그들을 그리는지 원인,텍스트 보고 손상에 대한 선택되지 않은 항목입니다.

여기 나의 코드:

private void listDevices_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();

    string textDevice = ((ListBox)sender).Items[e.Index].ToString();

    e.Graphics.DrawString(textDevice,
        new Font("Ariel", 15, FontStyle.Bold), new SolidBrush(Color.Black), 
        e.Bounds, StringFormat.GenericDefault);


    // Figure out where to draw IP
    StringFormat copy = new StringFormat(
        StringFormatFlags.NoWrap |
        StringFormatFlags.MeasureTrailingSpaces
    );
    copy.SetMeasurableCharacterRanges(new CharacterRange[] {new CharacterRange(0, textDevice.Length)});

    Region[] regions = e.Graphics.MeasureCharacterRanges(
        textDevice, new Font("Ariel", 15, FontStyle.Bold), e.Bounds, copy);

    int width = (int)(regions[0].GetBounds(e.Graphics).Width);
    Rectangle rect = e.Bounds;
    rect.X += width;
    rect.Width -= width;

    // draw IP
    e.Graphics.DrawString(" 255.255.255.255",
        new Font("Courier New", 10), new SolidBrush(Color.DarkBlue),
        rect, copy);

    e.DrawFocusRectangle();
}

listDevices.Items.Add("Device001");
listDevices.Items.Add("Device002");

또한,품목하는 올바르게 그려진(하)은 깜박에서 형태로 크기를 조정합니다.더 중요한 것,그러나 누가 알고 있는 이유는 무엇인가....다.

도움이 되었습니까?

해결책

다음 코드에서 크기를 조절 이벤트:

private void listDevices_Resize(object sender, EventArgs e) {
    listDevices.Invalidate();
}

이 발생 한 모든 것을 다시 그려집니다.

를 중지 깜박이는,당신은 이중 버퍼링이 필요.

이를 위해,새로운 클래스에서 파생된 목록 상자에 넣고 다음에서 생성자:

this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

하거나 이로드 파일:

using System.Windows.Forms;

namespace Whatever {
    public class DBListBox : ListBox {
        public DBListBox(): base() {
            this.DoubleBuffered = true;
            // OR
            // this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        }
    }
}

대체"무엇으로"네임스페이스 프로젝트에서 사용하거나,그것은 무언가를 더 유용합니다.후 컴파일할 수 있어야 합 추가 DBListBox 형태로 디자이너입니다.

다른 팁

나의 재현 문제입니다.거기에 여러 가지 실수는 코드에서 글꼴 이름은"Arial",당신이하지 않아야를 조정 rect.폭,당신을 호출하는 것을 잊지 처분()글꼴에,브러시 및 지역입니다.하지만 그들은 설명하지 않는 행동입니다.가 무언가 잘못되면 클리핑 지역을 방지하는 텍스트에서 올바르게 업데이트됩니다.보이지 않는 곳에 발생하는,그래픽 객체 상태가 좋아요.

그래픽입니다.DrawString()은 매우 험 방법은,당신이 정말로 반드시 피해야 합니다.모든 Windows Forms 컨트롤,등의 ListBox,사용 TextRenderer.DrawText().그것이 문제를 해결할 때 사용하고 있습니다.내가 알고 있을 측정하는 것이 더 어렵,일할 수 있는 주위에 표시하여 IP 주소에 고정된 오프셋이 있습니다.상도,그들은 선에서는 열 방법입니다.

그것을 깜박이기 때문에 당신은 사용자.DrawBackground().을 지우는 기존 텍스트,그리고 텍스트 오른쪽에 다시습니다.나는 생각하지 않는 이중 버퍼링이가 그 문제를 해결하기 위해,당신은 것을 그릴 수 있 전체 항목 그래서 당신은하지 않을 그릴 수 있다.까다로운 당신이 얻을 수없는 경우 정확한 텍스트 크기와 큰 글꼴,해결 방법을 그리는 비트맵으로 처음이다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top