我已經創建了自定義comboBox
,支持項目文本前面的圖像。下面是它的外觀: 自定義ImageComboBox不總是以相同的方式
對於這一點,我創建了一個名爲ImageComboBox
新的控制存儲在我的WinForms項目引用的dll
。
這ImageComboBox
不過是一個ComboBox
與DrawMode
設置爲DrawMode.OwnerDrawFixed
和持有ImageList
包含所有圖像繪製。有一個DrawItemEventHandler
負責繪製圖像和每個項目的文字。
我遇到了一個兩像素的問題,但令人困惑的部分是問題並不總是發生。當我創建一個新的winforms項目並簡單地添加一個新的ImageComboBox
時,我沒有問題。當我在winforms項目中添加一個新的ImageComboBox
時,問題就會出現 - 10次中的9次(或類似的情況)。
這裏重現我的兩個像素爲題步驟:
- 當我打開窗體,一切都很好:
- 當我下拉
imageComboBox
,一切都很好:
- 當我懸停一個項目來選擇它,一切都很好:
- 當我選擇一個項目,一切都很好:
- 當我下拉
imageComboBox
時,有一個項目被選中,出現問題:在選定的項目面前的形象由兩個轉變右側和文字像素一個像素移位左:
讓我們變焦: - 在這裏證明我沒有有時錯誤:
讓我們再次放大:
這裏是我的ImageComboBox
的DrawItemEvent
:
(this._imageList
是我ImageList
對象)
private void OnDrawItem(object sender, DrawItemEventArgs e) {
if (e.Index >= 0) {
// If the current item is one in the comboBox
// Compute the X location of the text to drawn
int strLocationX = this._imageList.Images.Count > e.Index ?
this._imageList.Images[e.Index].Width + 1 :
e.Bounds.X + 1;
// Get the displayed text of the current item
String itemText = this.Items[e.Index].ToString();
if (this.DroppedDown) {
// If the comboBox is dropped down
// Draw the blue rectangle
e.DrawBackground();
if (e.State == DrawItemState.ComboBoxEdit) {
// If we are drawing the selected item
// Draw the text
e.Graphics.DrawString(itemText, this.Font, Brushes.Black,
new Point(strLocationX + 1, e.Bounds.Y + 1));
if (this._imageList.Images.Count > e.Index) {
// If we have an image available
// Draw the image
e.Graphics.DrawImage(this._imageList.Images[e.Index],
new Point(e.Bounds.X, e.Bounds.Y - 1));
}
} else {
// If we are drawing one of the item in the drop down
// Check if the item is being highlighted
if (e.State.ToString().Contains(DrawItemState.Focus.ToString()) &&
e.State.ToString().Contains(DrawItemState.Selected.ToString())) {
// Draw the text in White
e.Graphics.DrawString(itemText, this.Font, Brushes.White,
new Point(strLocationX, e.Bounds.Y + 1));
} else {
// Draw the text in Black
e.Graphics.DrawString(itemText, this.Font, Brushes.Black,
new Point(strLocationX, e.Bounds.Y + 1));
}
if (this._imageList.Images.Count > e.Index) {
// If we have an image available
// Draw the image
e.Graphics.DrawImage(this._imageList.Images[e.Index],
new Point(e.Bounds.X + 2, e.Bounds.Y - 1));
}
}
} else {
// If the comboBox is not dropped down
// Draw the text
e.Graphics.DrawString(itemText, this.Font, Brushes.Black,
new Point(strLocationX + 1, e.Bounds.Y + 1));
if (this._imageList.Images.Count > e.Index) {
// If we have an image available
// Draw the image
e.Graphics.DrawImage(this._imageList.Images[e.Index],
new Point(e.Bounds.X, e.Bounds.Y - 1));
}
}
}
}
對於我的觀點,代碼應該是對的,但似乎有時候條件不成立,噸返回相同的結果,而我認爲它應該做的。
任何關於這個問題可能來自哪裏的線索?