आप विभिन्न राज्यों के लिए आइटम पेंट करना भूल गए हैं। आपको यह निर्धारित करने की आवश्यकता है कि वर्तमान में आइटम किस स्थिति में है और इसके अनुसार इसे आकर्षित करें।
आपकी तस्वीर पर आपके पास क्या है, आप इस तरह से प्राप्त कर सकते हैं। हालांकि यह अच्छी तरह से लग रहा है नहीं करता है तो आप एकाधिक चयन करें सक्षम है और एक से अधिक आइटम का चयन किया है:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
Offset: Integer;
begin
with (Control as TListBox) do
begin
Canvas.Font.Color := Font.Color;
if (odSelected in State) then
begin
Canvas.Pen.Color := $00FF9932;
Canvas.Brush.Color := $00FDDDC0;
end
else
begin
Canvas.Pen.Color := Color;
Canvas.Brush.Color := Color;
end;
Canvas.Rectangle(Rect);
Canvas.Brush.Style := bsClear;
Offset := (Rect.Bottom - Rect.Top - Canvas.TextHeight(Items[Index])) div 2;
Canvas.TextOut(Rect.Left + Offset + 2, Rect.Top + Offset, Items[Index]);
end;
end;
और ItemHeight
सेट से 16 के साथ परिणाम:

बोनस - निरंतर चयन :
यहां एक सतत चयन लागू करने का एक कठिन समाधान है। सिद्धांत पहले की तरह आइटम को आकर्षित करना है, लेकिन पिछले और अगले आइटम की चयन स्थिति के आधार पर किसी रंग की रेखाओं के साथ आइटम की सीमा शीर्ष और निचली रेखाओं को ओवरराइड करना है। इसके अलावा, वर्तमान आइटम के बाहर भी प्रस्तुत किया जाना चाहिए, क्योंकि आइटम चयन स्वाभाविक रूप से पड़ोसी वस्तुओं को पुनर्निर्मित करने के लिए नहीं बुलाता है। इस प्रकार क्षैतिज रेखाओं को ऊपर एक पिक्सेल चित्रित किया जाता है और वर्तमान आइटम सीमाओं के नीचे एक पिक्सेल (इन पंक्तियों के रंग सापेक्ष चयन राज्यों पर भी निर्भर करता है)।
यहां पर अजीब अजीब वस्तु वस्तुओं का उपयोग प्रत्येक आइटम की चयनित स्थिति को संग्रहीत करने के लिए है। मैंने ऐसा किया, क्योंकि ड्रैग & ड्रॉप आइटम चयन का उपयोग करते समय, Selected
संपत्ति तब तक वास्तविक स्थिति नहीं लौटाती जब तक कि आप माउस बटन को छोड़ नहीं देते। सौभाग्य से, OnDrawItem
पाठ्यक्रम की स्थिति वास्तविक स्थिति के साथ आग लगती है, इसलिए एक कामकाज के रूप में मैंने OnDrawItem
घटना से इन राज्यों को संग्रहित किया है।
महत्वपूर्ण:
ध्यान दें, कि मैं वास्तविक चयन राज्य स्टोर करने के लिए है, इसलिए सावधान रहना, और जब आप कुछ और के लिए आइटम वस्तुओं का उपयोग कर रहे, इस वास्तविक स्टोर आइटम वस्तुओं का उपयोग कर रहा उदाहरण के लिए राज्यों बूलियन की एक सरणी में।
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
const
SelBackColor = $00FDDDC0;
SelBorderColor = $00FF9932;
var
Offset: Integer;
ItemSelected: Boolean;
begin
with (Control as TListBox) do
begin
Items.Objects[Index] := TObject((odSelected in State));
if (odSelected in State) then
begin
Canvas.Pen.Color := SelBorderColor;
Canvas.Brush.Color := SelBackColor;
Canvas.Rectangle(Rect);
end
else
begin
Canvas.Pen.Color := Color;
Canvas.Brush.Color := Color;
Canvas.Rectangle(Rect);
end;
if MultiSelect then
begin
if (Index > 0) then
begin
ItemSelected := Boolean(ListBox1.Items.Objects[Index - 1]);
if ItemSelected then
begin
if (odSelected in State) then
begin
Canvas.Pen.Color := SelBackColor;
Canvas.MoveTo(Rect.Left + 1, Rect.Top);
Canvas.LineTo(Rect.Right - 1, Rect.Top);
end
else
Canvas.Pen.Color := SelBorderColor;
end
else
Canvas.Pen.Color := Color;
Canvas.MoveTo(Rect.Left + 1, Rect.Top - 1);
Canvas.LineTo(Rect.Right - 1, Rect.Top - 1);
end;
if (Index < Items.Count - 1) then
begin
ItemSelected := Boolean(ListBox1.Items.Objects[Index + 1]);
if ItemSelected then
begin
if (odSelected in State) then
begin
Canvas.Pen.Color := SelBackColor;
Canvas.MoveTo(Rect.Left + 1, Rect.Bottom - 1);
Canvas.LineTo(Rect.Right - 1, Rect.Bottom - 1);
end
else
Canvas.Pen.Color := SelBorderColor;
end
else
Canvas.Pen.Color := Color;
Canvas.MoveTo(Rect.Left + 1, Rect.Bottom);
Canvas.LineTo(Rect.Right - 1, Rect.Bottom);
end;
end;
Offset := (Rect.Bottom - Rect.Top - Canvas.TextHeight(Items[Index])) div 2;
Canvas.Brush.Style := bsClear;
Canvas.Font.Color := Font.Color;
Canvas.TextOut(Rect.Left + Offset + 2, Rect.Top + Offset, Items[Index]);
end;
end;
और परिणाम:

मुझे नहीं लगता कि वहाँ एक सूची बॉक्स थीम चयन इस तरह। वहाँ ['LBCP_ITEM'] हैं (http://msdn.microsoft.com/en-us/library/windows/desktop/bb(v = vs.85) .aspx) सूची बॉक्स के लिए भाग, लेकिन वे बिल्कुल ठीक दिखते हैं गैर-मालिक तैयार सूची बॉक्स - उबाऊ। तो शायद आप थीम्ड चयन भागों उधार ले सकते हैं उदा। एंड्रयू जैसे पेड़ दृश्य से ['इस पोस्ट'] में वर्णित है (http://stackoverflow.com/a/10936108/960757)। आपको सूची बॉक्स राज्यों के लिए उस कोड को संशोधित करने की आवश्यकता होगी। – TLama
यह वही है जो मैं चिंतित था, ट्रीव्यूव और लिस्टव्यू के विपरीत जो सूचीबद्ध रंगों को पेंटबॉक्स नहीं करता है। –
हार्ड कोडिंग रंग जब, यह न भूलें कि उपयोगकर्ता के पास पूरी तरह से अलग रंग योजना हो सकती है। –