Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «ИспользованиС ListView Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ списка»

Автор Π’ΠΈΠΌΠΎΡ„Π΅ΠΉ Π§Π°Π΄ΠΎΠ²

ДСмонстрационная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° – 161 KB

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹Π΅ тСксты – 39 KB

ВсС программисты дСлятся Π½Π° Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ повсСмСстно примСняСт Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ, ΠΈ Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ ΠΎ Π½Π΅ΠΌ Π΄Π°ΠΆΠ΅ ΠΈ Π½Π΅ ΡΠ»Ρ‹ΡˆΠ°Π». ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, это ΡˆΡƒΡ‚ΠΊΠ°, ΠΊΠ°ΠΊ ΠΈ любая с Π΄ΠΎΠ»Π΅ΠΉ … ΡˆΡƒΡ‚ΠΊΠΈ-)

На Ρ‚Π°ΠΊΠΈΡ… сайтах ΠΊΠ°ΠΊ CodeGuru, Π΅ΡΡ‚ΡŒ нСсколько Π½Π΅ΠΏΠ»ΠΎΡ…ΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² примСнСния Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… списков. Однако, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ программисты, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠ½Π΅ приходится ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ, лишь ΠΈΠ·Ρ€Π΅Π΄ΠΊΠ° ΠΏΡ€ΠΈΠ±Π΅Π³Π°ΡŽΡ‚ ΠΊ этой Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ΅, ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ считая, Ρ‡Ρ‚ΠΎ это Ссли Π½Π΅ ΠΈΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ ΡƒΠΆ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΈΠ·Π»ΠΈΡˆΠ΅ΡΡ‚Π²ΠΎ. МногиС Π·Π°Π±Π»ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ, считая, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… списков Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ лишь Π² случаях Π±ΠΎΠ»ΡŒΡˆΠΈΡ… массивов Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ· Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ это справСдливо, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΎ Ρ‡Π΅ΠΌ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ часто Π·Π°Π±Ρ‹Π²Π°ΡŽΡ‚ – ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… списков позволяСт Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π½ΠΎ ΠΈ обСспСчиваСт Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΈΡ… прСдставлСний. ПослСднСС, Π½Π° ΠΌΠΎΠΉ взгляд, Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈ Π²Π΅Π·Π΄Π΅, Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΌΠ΅Ρ€Ρƒ. НС стоит сломя Π³ΠΎΠ»ΠΎΠ²Ρƒ Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ свой ΠΊΠΎΠ΄, Ссли трСбуСтся вывСсти Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ для Π²Ρ‹Π±ΠΎΡ€Π° дСсятков элСмСнтов: cΠΎΠΉΠ΄Π΅Ρ‚ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. Однако, Ссли Π»ΠΎΠ³ΠΈΠΊΠ° вашСго прилоТСния основана Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ прСдставлСния Π½Π° основС ListView с ΡˆΠΈΡ€ΠΎΠΊΠΈΠΌΠΈ возмоТностями ΠΏΠΎ добавлСнию|ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡŽ|Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ, Π΄Π° ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ большого объСма записСй, – стоит Π·Π°Π΄ΡƒΠΌΠ°Ρ‚ΡŒΡΡ ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅.

Π˜Ρ‚Π°ΠΊ, Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΡŽ ΠΏΡ€ΠΈΠΏΠΎΠ΄Π½ΡΡ‚ΡŒ завСсу Ρ‚Π°ΠΉΠ½Ρ‹ Π½Π°Π΄ этим чудСсным Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ. Π’Ρ‹ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΈΡŽ Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ?

Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ это просто

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ списком Π² ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΌ случаС достаточно ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ:

β€’ Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ список

β€’ ВоврСмя Π·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ количСствС элСмСнтов

β€’ По запросу списка Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ элСмСнты Π½ΡƒΠΆΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ понадобятся ΠΈ Π±ΠΎΠ»Π΅Π΅ слоТныС Π²Π΅Ρ‰ΠΈ:

β€’ ΠšΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅

β€’ Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ°

β€’ Быстрый поиск элСмСнтов

Π˜Ρ‚Π°ΠΊ, ΠΎΠ±ΠΎ всСм ΠΏΠΎ порядку.

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² Ρ€Π΅ΠΆΠΈΠΌ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ "Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ", Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡΡ‚ΠΈΠ»ΡŒ LVS_OWNERDATA. ВСкущая вСрсия Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ элСмСнтов управлСния Π½Π΅ позволяСт ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ список ΠΈΠ· ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ "Π½Π° Π»Π΅Ρ‚Ρƒ", поэтому установку Π΄Π°Π½Π½ΠΎΠ³ΠΎ стиля Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ создании элСмСнта. Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ Π΄ΠΈΠ°Π»ΠΎΠ³Π° достаточно ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»ΡŒ Owner Data Π½Π° Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ More Style Π² ΠΎΠΊΠ½Π΅ свойств List Control. Π’ случаС примСнСния класса Π‘ListView слСдуСт ΠΏΠ΅Ρ€Π΅ΠΊΡ€Ρ‹Ρ‚ΡŒ PreCreateWindow.

Вся ΠΏΡ€Π΅Π»Π΅ΡΡ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ список Ρ…Ρ€Π°Π½ΠΈΡ‚ Π½Π΅ сами элСмСнты, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΡ… ΠΎΠ±Ρ‰Π΅Π΅ количСство, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹Ρ… Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ "ΠΌΠ΅Π»ΠΎΡ‡ΡŒ". ЗначСния самих элСмСнтов (строковыС ΠΌΠ΅Ρ‚ΠΊΠΈ, рисунки ΠΈ Ρ‚.ΠΏ) Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°ΡŽΡ‚ΡΡ Ρƒ прилоТСния нСпосрСдствСнно ΠΏΠ΅Ρ€Π΅Π΄ ΠΈΡ… отрисовкой Π½Π° экранС. Π’Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΈΠ΅ΠΌ позволяСт Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ сущСствСнно ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, особСнно для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… объСмов Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Π’ MSDN сказано, Ρ‡Ρ‚ΠΎ послС установки Π΄Π°Π½Π½ΠΎΠ³ΠΎ стиля, число элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ смоТСт Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ список, Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ DWORD (для ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… списков Ρ‚ΠΎΠ»ΡŒΠΊΠΎ int). Однако, всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Π² Ρ‚ΠΎΠΌ числС ΠΈ API) для Ρ€Π°Π±ΠΎΡ‚Ρ‹ со списком ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ int. ΠšΡ€ΠΎΠΌΠ΅ этого, ΠΌΠ½Π΅ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ 100.000.000 элСмСнтов. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ MSJ Π·Π° Π½ΠΎΡΠ±Ρ€ΡŒ 1996 Π³. ΠΎΡ‚ Strohm Armstrong встрСчаСтся ΠΈΠΌΠ΅Π½Π½ΠΎ эта магичСская Ρ†ΠΈΡ„Ρ€Π°. ΠžΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΊΠ°, стандартна: "Π‘Π»ΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ большС". НСт вопросов, Ссли Π±Ρ‹ использовалась хотя Π±Ρ‹ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ Π΄Π²ΠΎΠΉΠΊΠΈ, Π° Ρ‚Π°ΠΊ, IMHO, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠΉ странной (ΠΊΡ€ΡƒΠ³Π»ΠΎΠΉ) Ρ†ΠΈΡ„Ρ€ΠΎΠΉ выглядит ΠΊΠΎΠ²Π°Ρ€Π½Ρ‹ΠΌ замыслом.

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ элСмСнтов

Π˜Ρ‚Π°ΠΊ, список создан. Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Π½Π΅Π³ΠΎ элСмСнты, достаточной Π·Π°Π΄Π°Ρ‚ΡŒ ΠΈΡ… количСство. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ элСмСнтов Π² Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌ спискС задаСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

void CListCtrl::SetItemCount(int iCount);

void CListCtrl::SetItemCountEx(int iCount, DWORD dwFlags = LVSICF_NOINVALIDATEALL);

iCount

Π½ΠΎΠ²ΠΎΠ΅ количСство элСмСнтов

dwDlags

ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ Π€Π»Π°Π³ΠΎΠ² ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π°Ρ Ρ€Π΅Π°ΠΊΡ†ΠΈΡŽ списка Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ количСства элСмСнтов.

LVSICF_NOINVALIDATEALL Бписок Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ пСрСрисован, ΠΏΠΎΠΊΠ° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ элСмСнты Π½Π΅ окаТутся с ΠΏΠΎΠ»Π΅ видимости.

LVSICF_NOSCROLL ΠŸΠΎΠ·ΠΈΡ†ΠΈΡ скроллинга Π½Π΅ измСнится.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, всС Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ элСмСнтами списка, – это Π·Π°Π΄Π°Ρ‚ΡŒ ΠΈΡ… количСство. Никаких Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² InsertItem, DeleteItem ΠΈ Ρ‚.ΠΏ. Π­Ρ‚ΠΎ сущСствСнно ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΊΠΎΠ΄, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΡΡ†ΠΈΡŽ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, это Π½Π΅ избавляСт ΠΎΡ‚ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с самой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅-прСдставлСниС благоприятно сказываСтся Π½Π° ясности ΠΊΠΎΠ΄Π°, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ способствуСт ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡŽ ошибок.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ элСмСнтов

Π˜Ρ‚Π°ΠΊ, Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ список Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»ΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Π—Π° Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ элСмСнтов ΠΏΠ΅Ρ€Π΅Π΄ отрисовкой ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Для этого список посылаСт ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ LVN_GETDISPINFO. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ нСслоТно Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ, воспользовавшись ClassWizzard.

Π’ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ увСдомлСния LVN_GETDISPINFO Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, какая информация трСбуСтся, ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ поля.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· способов Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

void CMyListView::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult) {

 LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;

 LV_ITEM* pItem= &(pDispInfo)->item;

 CMyDocument* pDoc = GetDocument();

 int nIndex= pItem->iItem;

 if (pItem->mask & LVIF_TEXT) //трСбуСтся тСкст?

 strcpy(pItem->pszText, pDoc->GetItemText(pItem->iSubItem, nIndex));

 if pItem->mask & LVIF_IMAGE) //трСбуСтся ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°

  pItem->iImage= pDoc->GetItemImage(nIndex);

}

Π—Π΄Π΅ΡΡŒ GetItemText ΠΈ GetItemImage Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ класса Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠ΅ тСкст ΠΌΠ΅Ρ‚ΠΎΠΊ ΠΈ Π½ΠΎΠΌΠ΅Ρ€ изобраТСния Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ³ΠΎ элСмСнта соотвСтствСнно.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ список Π½Π΅ Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ поля state, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π΄Π²ΡƒΡ… Ρ„Π»Π°Π³ΠΎΠ² LVIS_SELECTED ΠΈ LVIS_FOCUSED. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ использованиС ΠΈΠΊΠΎΠ½ΠΎΠΊ состояния (state image) Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Однако эту ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ. НСобходимо ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сообщСниС LVM_SETCALLBACKMASK, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ Π·Π°Π΄Π°Ρ‚ΡŒ маску для Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠΉ списком ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± элСмСнтах.

// Π Π°Π·Ρ€Π΅ΡˆΠ°Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΊΠΎΠ½ΠΊΠΈ состояния

SendMessage(LVM_SETCALLBACKMASK, LVIS_STATEIMAGEMASK, 0);

ΠšΠ°ΠΆΡƒΡ‰ΠΈΠ΅ΡΡ трудности

Π˜Ρ‚Π°ΠΊ, список создан ΠΈ Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях, Π’Π°ΠΌ захочСтся Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π±ΠΎΠ»Π΅Π΅ слоТныС Π²Π΅Ρ‰ΠΈ.

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ.

Если Π²Ρ‹ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ большими объСмами ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ – Π±Π΅Π· ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ. Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ список ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ процСссом ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, посылая ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ увСдомлСния LVN_ODCACHEHINT, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π½Π° экранС. Π­Ρ‚Ρƒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для динамичСского выдСлСния памяти ΠΏΠΎΠ΄ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ число элСмСнтов ΠΈ заполнСния ΠΈΡ… ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ значСниями.

void CMyListView::OnOdcachehint(NMHDR* pNMHDR, LRESULT* pResult) {

 NMLVCACHEHINT* pCacheHint = (NMLVCACHEHINT*)pNMHDR;

 // ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ кСш

 PrepareCach(pCacheHint->iFrom, pCacheHint->iTo);

 *pResult = 0;

}

РСализация Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ PrepareCach, зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΈΠΌ способом Π²Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚Π΅ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠΉ Π² зависимости ΠΎΡ‚ Ρ€Π΅ΡˆΠ°Π΅ΠΌΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ. Π”Π°Π½Π½ΠΎΠ΅ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ всСго лишь своСврСмСнная подсказка.

НахоТдСниС спСцифичСских элСмСнтов

Когда списку Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΉΡ‚ΠΈ спСцифичСский элСмСнт, ΠΎΠ½ посылаСт ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ LVN_ODFINDITEM. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ, Ссли трСбуСтся Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ быстрой клавиши (поиск ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ), ΠΈΠ»ΠΈ элСмСнт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» сообщСниС LVM_FINDITEM. Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ для поиска пСрСдаСтся Π² Π΄Π²ΡƒΡ… структурах NMLVFINDITEM ΠΈ LVFINDINFO. Π’ Π½ΠΈΡ… содСрТится: Π½ΠΎΠΌΠ΅Ρ€ элСмСнта, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ слСдуСт Π½Π°Ρ‡Π°Ρ‚ΡŒ поиск; элСмСнт искомой строки; Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ поиска ΠΈ Ρ‚.ΠΏ.

void CMyListView::OnOdfinditem(NMHDR* pNMHDR, LRESULT* pResult) {

 NMLVFINDITEM* pFindInfo = (NMLVFINDITEM*)pNMHDR;

 LVFINDINFO FindItem = pFindInfo->lvfi;


 if (FindItem.flags & LVFI_STRING) {

  //ишСм FindItem.psz начиная pFindInfo->iStart

  *pResult = GetDocument()->FindItem(FindItem.psz, pFindInfo->iStart);

  return;

 }

 *pResult = –1;

}

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ увСдомлСния Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ искомого элСмСнта ΠΈΠ»ΠΈ –1 Π² случаС Π½Π΅ΡƒΠ΄Π°Ρ‡ΠΈ.

Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ°

Врудности? Π­Ρ‚ΠΎ Π΅Ρ‰Π΅ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅? Однако бСсплатный сыр сами Π·Π½Π°Π΅Ρ‚Π΅ Π³Π΄Π΅. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ сами элСмСнты Π² спискС Π½Π΅ хранятся, придСтся самим заботится ΠΎ сортировкС. НС удастся Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ CListCtrl::SortItems, бСсполСзно ΠΏΠΈΡΠ°Ρ‚ΡŒ CompareItems ΠΈ Ρ‚.ΠΏ. ВсС, Ρ‡Ρ‚ΠΎ Ρƒ вас Π΅ΡΡ‚ΡŒ – это порядковый Π½ΠΎΠΌΠ΅Ρ€ элСмСнта.

Но, Π½Π΅Ρ‚ Ρ…ΡƒΠ΄Π° Π±Π΅Π· Π΄ΠΎΠ±Ρ€Π°. Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, обладая Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎΠ± ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΡΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ сортировки, Π° Π·Π½Π°Ρ‡ΠΈΡ‚ – ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² рядС случаСв, Π΄Π°ΠΆΠ΅ такая ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π½Π΅ стоит. Если информация бСрСтся ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π΅Ρ‚ нСобходимости ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ элСмСнты, достаточно ΡƒΡ‡Π΅ΡΡ‚ΡŒ это ΠΏΡ€ΠΈ составлСнии запроса. ΠŸΡ€ΠΈ использовании Π² качСствС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° элСмСнтов ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² ΠΈΠ· STL, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ возмоТности этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ практичСских случаСв этого Π±Ρ‹Π²Π°Π΅Ρ‚ достаточно.