재 DrawItem 에 대한 ListBox-선택하지 않은 항목은 다시 그
-
17-09-2020 - |
문제
이것은 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().을 지우는 기존 텍스트,그리고 텍스트 오른쪽에 다시습니다.나는 생각하지 않는 이중 버퍼링이가 그 문제를 해결하기 위해,당신은 것을 그릴 수 있 전체 항목 그래서 당신은하지 않을 그릴 수 있다.까다로운 당신이 얻을 수없는 경우 정확한 텍스트 크기와 큰 글꼴,해결 방법을 그리는 비트맵으로 처음이다.