ComboBox nolaižamā platuma lieluma noteikšana

click fraud protection

TComboBox komponents apvieno rediģēšanas lodziņu ar ritināmo "izvēles" sarakstu. Lietotāji var atlasīt vienumu no saraksta vai rakstīt tieši rediģēšanas lodziņš.

Izvēlnes saraksts

Kad kombinētā lodziņa nolaižamajā stāvoklī Windows operētājsistēma pievelk saraksta lodziņa vadības veidu, lai parādītu kombinētā lodziņa elementus atlasīšanai.

Īpašums DropDownCount norāda maksimālo vienumu skaitu, kas tiek parādīts nolaižamajā sarakstā.

nolaižamā saraksta platums pēc noklusējuma būtu vienāds ar kombinētā lodziņa platumu.

Kad priekšmetu garums (virknes) pārsniedz kombinētā lodziņa platumu, priekšmeti tiek parādīti kā nogriezti!

TComboBox nenodrošina veidu, kā iestatīt nolaižamā saraksta platumu :(

ComboBox nolaižamā saraksta platuma fiksēšana

Mēs varam iestatīt nolaižamā saraksta platumu, nosūtot īpašu Windows ziņojums uz kombinēto lodziņu. Ziņojums ir CB_SETDROPPEDWIDTH un nosūta kombinētā lodziņa saraksta lodziņa minimālo pieļaujamo platumu pikseļos.

Lai cietajā kodē nolaižamā saraksta lielumu līdz, teiksim, 200 pikseļiem, jūs varētu rīkoties šādi:

instagram viewer

Nosūtīt ziņojumu (. Rokturis, CB_SETDROPPEDWIDTH, 200, 0); 

Tas ir tikai tad, ja esat pārliecināts, ka viss jūsu ComboBox. Vienumi nav garāki par 200 pikseļiem (uzzīmējot).

Lai nodrošinātu, ka nolaižamā saraksta displejs vienmēr ir pietiekami plašs, mēs varam aprēķināt vajadzīgo platumu.

Šī ir funkcija, lai iegūtu nepieciešamo nolaižamā saraksta platumu un iestatītu to:

procedūra ComboBox_AutoWidth (const theComboBox: TCombobox); const
HORIZONTAL_PADDING = 4; var
itemsFullWidth: vesels skaitlis; idx: vesels skaitlis; itemWidth: vesels skaitlis; sākt
itemsFullWidth: = 0; // nolaižamajā stāvoklī iegūstiet nepieciešamo vienumu skaitupriekš idx: = 0 uz -1 + the ComboBox. Priekšmeti. Grāfs darītsākt
itemWidth: =ComboBox. Audekls. Teksta platums (. Priekšmeti [idx]); Inc (vienuma platums, 2 * HORIZONTAL_PADDING); if (itemWidth> itemsFullWidth) tad itemsFullWidth: = itemWidth; beigas; // Ja nepieciešams, iestatiet nolaižamās platumuja (itemsFullWidth> the ComboBox. Platums). sākt// pārbaudiet, vai būtu ritjoslaja the ComboBox. DropDownCount tad
itemsFullWidth: = itemsFullWidth + GetSystemMetrics (SM_CXVSCROLL); Nosūtīt ziņojumu (. Rokturis, CB_SETDROPPEDWIDTH, itemsFullWidth, 0); beigas; beigas; 

Nolaižamā saraksta platumam tiek izmantots garākās virknes platums.

Kad piezvanīt ComboBox_AutoWidth?
Ja jūs iepriekš aizpildāt priekšmetu sarakstu (noformēšanas laikā vai veidojot veidlapu), veidlapas iekšpusē varat piezvanīt procedūrai ComboBox_AutoWidth. OnCreate pasākumu kopējs.

Ja dinamiski maināt kombinētā lodziņa vienumu sarakstu, varat izsaukt procedūru ComboBox_AutoWidth OnDropDown notikumu apstrādātājs - rodas, kad lietotājs atver nolaižamo sarakstu.

Tests
Testa veikšanai veidlapā mums ir 3 kombinētās kastes. Visiem ir vienumi, kuru teksts ir platāks par faktisko kombinētās ailes platumu. Trešais kombinētais lodziņš ir novietots netālu no veidlapas malas labās malas.

Īpašums Items šajā piemērā ir iepriekš aizpildīts - mēs izsaucam mūsu ComboBox_AutoWidth OnCreate notikumu apstrādātājā par formu:

// Veidlapa OnCreateprocedūra TForm. FormCreate (Sūtītājs: TObject); sākt
ComboBox_AutoWidth (ComboBox2); ComboBox_AutoWidth (ComboBox3); beigas; 

Mēs neesam izsaukuši ComboBox_AutoWidth par Combobox1, lai redzētu atšķirību!

Ņemiet vērā, ka palaišanas laikā Combobox2 nolaižamais saraksts būs plašāks nekā Combobox2.

Pilns novietojums labajā malā ir nogriezts viss nolaižamais saraksts.

Combobox3, kas atrodas netālu no labās malas, nolaižamais saraksts tiek izgriezts.

Nosūtot CB_SETDROPPEDWIDTH, nolaižamā saraksta lodziņš vienmēr tiks paplašināts pa labi. Kad jūsu kombinētais lodziņš atrodas netālu no labās malas, paplašinot saraksta lodziņu vairāk pa labi, saraksta lodziņa displejs tiks nogriezts.

Sarakstu lodziņš mums kaut kādā veidā jāpagarina pa kreisi, kad tas tā ir, nevis pa labi!

CB_SETDROPPEDWIDTH nav veids, kā norādīt, kurā virzienā (pa kreisi vai pa labi) paplašināt saraksta lodziņu.

Risinājums: WM_CTLCOLORLISTBOX

Tikko tad, kad ir jāparāda nolaižamais saraksts, Windows nosūta WM_CTLCOLORLISTBOX ziņojumu uz saraksta lodziņa vecāku logu - uz mūsu kombinēto lodziņu.

Spēja rīkoties ar WM_CTLCOLORLISTBOX gandrīz labās malas kombinētajā lodziņā atrisinās problēmu.

Visvarenais WindowProc
Katra VCL vadība pakļauj WindowProc rekvizītu - procedūru, kas reaģē uz vadībai nosūtītajiem ziņojumiem. Mēs varam izmantot WindowProc īpašumu, lai īslaicīgi aizstātu vai apakšklasētu vadības loga procedūru.

Šis ir mūsu pārveidotais Combobox3 WindowProc (tas atrodas labajā malā):

// modificēts ComboBox3 WindowProcprocedūra TForm. ComboBox3WindowProc (var Ziņojums: TMessage); var
cr, lbr: TRect; sākt// saraksta lodziņa zīmēšana ar kombinētās vienības elementiem
ja Ziņa. Msg = WM_CTLCOLORLISTBOX tad. sākt
GetWindowRect (ComboBox3.Handle, cr); // saraksta lodziņa taisnstūris
GetWindowRect (ziņojums. LParam, lbr); // pārvietojiet to pa kreisi, lai tas sakristu ar labo maluja kr. Pa labi <> lbr. Taisnība tad
(Ziņojums. LParam, lbr. Kreisais (lbr. Pa labi-clbr. Pa labi), lbr. Augšā, lbr. Pa labi-lbr. Kreisais, lbr. Apakšā-lbr. Augšā, taisnība); beigascits
ComboBox3WindowProcORIGINAL (ziņojums); beigas; 

Ja ziņojums, ko saņem mūsu kombinētais lodziņš, ir WM_CTLCOLORLISTBOX, mēs iegūstam tā loga taisnstūri, mēs arī iegūstam parādāmā saraksta lodziņa taisnstūri (GetWindowRect). Ja šķiet, ka saraksta lodziņš parādās vairāk pa labi - mēs to pārvietojam pa kreisi, lai kombinētā lodziņa un saraksta lodziņa labā mala būtu vienāda. Tik vienkārši :)

Ja ziņojums nav WM_CTLCOLORLISTBOX, mēs vienkārši izsaucam oriģinālo ziņojumu apstrādes procedūru kombinētajam lodziņam (ComboBox3WindowProcORIGINAL).

Visbeidzot, tas viss var darboties, ja mēs to esam pareizi iestatījuši (veidlapas OnCreate notikumu apstrādātājā):

// Veidlapa OnCreateprocedūra TForm. FormCreate (Sūtītājs: TObject); sākt
ComboBox_AutoWidth (ComboBox2); ComboBox_AutoWidth (ComboBox3); // pievienojiet modificētu / pielāgotu WindowProc ComboBox3
ComboBox3WindowProcORIGINAL: = ComboBox3.WindowProc; ComboBox3.WindowProc: = ComboBox3WindowProc; beigas; 

Kur veidlapas deklarācijā mums ir (viss):

tips
TForm = klase(TForm) ComboBox1: TComboBox; ComboBox2: TComboBox; ComboBox3: TComboBox;procedūra FormCreate (Sūtītājs: TObject); Privāts
ComboBox3WindowProcORIGINAL: TWndMethod; procedūra ComboBox3WindowProc (var Ziņojums: TMessage); publiski{Publiskās deklarācijas}beigas; 

Un tas arī viss. Viss apstrādāts :)

instagram story viewer