2015-09-01 18 views
3

enter image description hereenter image description hereTComboBoxEx項沒有被正確地繪製時BiDiMode = bdRightToLeft和類型= csDropDownList和應用使用VCL樣式

喜。

當BiDiMode = bdRightToLeft和Style = csDropDownList和應用程序使用VCL Style時,TComboBoxEx項目繪製不正確;在DropDown列表中,在左側繪製圖標和文本,選擇項目時,左側繪製的圖標和文本將消失!

我看到Right to left ComboBox in Delphi XE2 with styles但沒有幫助我。

我應該怎麼做才能糾正它,並在ComboBoxEx右側繪製圖標和文本(第一個圖標和下一個文本)?

這正是我需要的,我設計了這個樣品用Photoshop:

enter image description here

我用Delphi XE8

請幫助我。

+0

我沒能重現XE5的bug 。該項目以下列方式顯示 - 下拉按鈕 - 最左側 - 左側的圖像和文本無空格。請提供MCVE。 –

+0

@ asd-tm嗨。我編輯了我的帖子。請檢查一下。 – smartiz

+0

嗨。現在我明白你到底想要什麼。我刪除了我的答案。希望,這個零答案得分會吸引社區對你的問題的關注。 –

回答

1

BiDiMode適用於從右向左書寫的語言,因此不適用於您的需求。

我看不出用TComboBoxEx做到這一點的方法,但你可以很容易地用TComboBox來做到這一點。

添加一個TComboBox並使其風格csOwnerDrawFixed。我在下面的代碼中假定了TImageList(你必須已經擁有)和TComboBox的基本名稱。你將需要修改它爲你自己的名字。添加一個類似於下面的OnDrawItem事件。 (你可能想把它稍微提高一點)。

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; 
    Rect: TRect; State: TOwnerDrawState); 
var 
    iImageWidth, iTextWidth, iMargin : integer; 
    iText : string; 
    iCanvas : TCanvas; 
begin 
    // draw image at right and text right justify 
    // assume image index = Item for now. 
    iCanvas := ComboBox1.Canvas; 
    // need to check state; Just ignore for now. 
    iImageWidth := ImageList1.Width; 
    iMargin := 4; // pixels - can calculate instead 
    iText := ComboBox1.Items[ Index ]; 
    iTextWidth := iCanvas.TextWidth(iText); 

    ImageList1.Draw(iCanvas, Rect.Right - iImageWidth - iMargin, Rect.Top, Index); 
    iCanvas.TextOut(Rect.Right - 2 * iMargin - iTextWidth - iImageWidth, Rect.Top, iText); 
end; 

我已經測試過它,它工作正常

更新

這裏是操作我對它的形象與正好所示的代碼 Dropped down

+0

ty。但是有很多項目繪圖的問題......在csOwnerDrawFixed模式中,在選定項目周圍繪製邊框也存在問題...示例鏡頭:http://i.imgur.com/NKzBIEd.png – smartiz

+0

這只是爲了一個起點 - 你需要自己做一些工作。我不知道你有什麼其他的選擇,也許使用樣式弄糊塗 - 我當然沒有像你的形象畫兩次文字。對於我來說一切正常 - 文本在選定的項目周圍顯示爲藍色,但我同意你可能需要通過查看State參數來改進它 - 正如我在代碼中所評論的那樣。 – Dsm

+0

我正在研究它,ty – smartiz