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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π˜ΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰Π΅Π΅ руководство ΠΏΠΎ написанию Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… подсказок». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 7

Автор Π ΠΎΠ΄ΠΆΠ΅Ρ€ Π”ΠΆΠ΅ΠΊ

Ѐункция CTitleTipListBox::AdjustTitleTip ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈΠ»ΠΈ прячСт элСмСнт TitleTip. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ nNewIndex являСтся индСксом строки для отобраТСния. Он ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ константы m_nNoIndex, Ссли подсказка Π½Π΅ Π½ΡƒΠΆΠ½Π° Π½ΠΈ для ΠΎΠ΄Π½ΠΎΠΉ строки. Ѐункция создаСт элСмСнт ToolTip, Ссли ΠΎΠ½ Π΅Ρ‰Π΅ Π½Π΅ создан. Если Π² качСствС индСкса строки пСрСдаСтся m_nNoIndex, функция прячСт Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ подсказку. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС функция ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ идСальной строки Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ CTitleTipListBox::GetIdealItemRect. Если Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ идСальной строки ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ с Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ CListBox::GetItemRect, Ρ‚ΠΎ Π² подсказкС Π½Π΅Ρ‚ нСобходимости, ΠΈ подсказка прячСтся. Если Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ, Ρ‚ΠΎ функция измСняСт Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ идСальной строки Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΠ»Π°ΡΡŒ Π½Π° экранС ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ подсказку. Если элСмСнт TitleTip Π²ΠΈΠ΄ΠΈΠΌΠ°, дСлаСтся Π·Π°Ρ…Π²Π°Ρ‚ ΠΌΡ‹ΡˆΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° подсказку слСдуСт ΡΠΊΡ€Ρ‹Ρ‚ΡŒ. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ссли курсор ΠΌΡ‹ΡˆΠΈ Π½Π΅ находится Π½ΠΈ Π½Π°Π΄ ΠΎΠ΄Π½ΠΎΠΉ строкой, функция Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΊΡ€Ρ‹Ρ‚ΡŒ подсказку; Ссли элСмСнт TitleTip Π½Π΅Π²ΠΈΠ΄ΠΈΠΌ, Ρ‚ΠΎ функция освобоТдаСт ΠΌΡ‹ΡˆΡŒ. Для Π·Π°Ρ…Π²Π°Ρ‚Π° курсора ΠΌΡ‹ΡˆΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция CTitleTipListBox::CaptureMouse. Она сохраняСт ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ курсора Π² клиСнтской систСмС ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ CTitleTipListBox::m_LastMouseMovePoint, Π° Ρ‚Π°ΠΊΠΆΠ΅ устанавливаСт Ρ„Π»Π°Π³ m_bMouseCaptured Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ TRUE для ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ курсор ΠΌΡ‹ΡˆΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π·Π°Ρ…Π²Π°Ρ‡Π΅Π½.

ΠœΠ΅Ρ‚ΠΎΠ΄ CTitleTipListBox::IsAppActive Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ TRUE, Ссли ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находится элСмСнт "список", Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ. ΠΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ прилоТСния опрСдСляСтся ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π° ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ, являСтся Π»ΠΈ ΠΎΠ½ΠΎ ΠΎΠΊΠ½ΠΎΠΌ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня прилоТСния (ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Π΅Π³ΠΎ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… ΠΎΠΊΠΎΠ½). Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² CTitleTipListBox::OnMouseMove для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄ΠΎΡΡ‚ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ подсказка отобраТаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.

CTitleTipListBox::OnContentChanged прячСт подсказку ΠΈ вызываСтся ΠΏΠΎ Π½Π°ΡΡ‚ΡƒΠΏΠ»Π΅Π½ΠΈΡŽ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… событий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ содСрТимоС элСмСнта "список". НапримСр, сообщСниС LB_INSERTSTRING, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ вставляСт строку Π² список, ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ подсказку Π½Π΅Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ послС вставки курсор ΠΌΡ‹ΡˆΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½Π°Π΄ совсСм Π΄Ρ€ΡƒΠ³ΠΎΠΉ строкой. Бписок Ρ‚Π°ΠΊΠΈΡ… событий ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π² ΠΊΠ°Ρ€Ρ‚Π΅ сообщСний (message map) ΠΏΠΎ макросам ON_MESSAGE. Π’Ρ‹ спроситС, ΠΏΠΎΡ‡Π΅ΠΌΡƒ я Π½Π΅ использовал CWnd::PreTranslateMessage для ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° этих сообщСний? ЧСстно говоря, я пытался Ρ‚Π°ΠΊ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π½ΠΎ CWnd::PreTranslateMessage ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сообщСния ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний, Π° ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠ΅ нас сообщСния ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π° самой Windows Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ SendMessage, которая ΠΌΠΈΠ½ΡƒΠ΅Ρ‚ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний.

CTitleTipListBox::OnMouseMove провСряСт, Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π»ΠΈ курсор ΠΌΡ‹ΡˆΠΈ Π½Π° ΠΊΠ°ΠΊΡƒΡŽ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ строку, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ подсказку для этой строки. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° осущСствляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с элСмСнтом "список" Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈ курсор ΠΌΡ‹ΡˆΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» своС ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π― выяснил, Ρ‡Ρ‚ΠΎ Windows ΠΈΠ½ΠΎΠ³Π΄Π° посылаСт нСсколько сообщСний WM_MOUSEMOVE для ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ курсора, поэтому я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ m_LastMouseMovePosition для Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ этих Π»ΠΈΡˆΠ½ΠΈΡ… сообщСний. Π”Π°Π»Π΅Π΅ CTitleTipListBox::OnMouseMove провСряСт, находится Π»ΠΈ курсор ΠΌΡ‹ΡˆΠΈ Π² клиСнтской области списка. ΠšΡƒΡ€ΡΠΎΡ€ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ клиСнтской области ΠΈΠ·-Π·Π° Π·Π°Ρ…Π²Π°Ρ‚Π° курсора ΠΌΡ‹ΡˆΠΈ. Π—Π°Π±Π°Π²Π½Ρ‹ΠΉ ΠΏΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΉ эффСкт Π½Π°Π±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ, Ссли Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ – подсказка ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ для строк, Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡ‹Ρ… Π² спискС Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. Если ΠΆΠ΅ курсор ΠΌΡ‹ΡˆΠΈ находится Π² клиСнтской области списка, CTitleTipListBox::OnMouseMove ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ списку ΠΈ выясняСт, Π½Π°Π΄ ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ строкой находится курсор. Если это Ρ‚Π°ΠΊ, функция ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ этот индСкс для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ CTitleTipListBox::AdjustTitleTip.

CTitleTipListBox::OnSelchange ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π½ΠΎΡ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ΅ сообщСниС LBN_SELCHANGE. Если Π±Ρ‹Π»Π° Π²Ρ‹Π±Ρ€Π°Π½Π° другая строка Π² спискС, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ подсказку. НапримСр, Ссли Π²Ρ‹Π±Ρ€Π°Π½Π° Ρ‚Π° ΠΆΠ΅ строка, которая отраТаСтся элСмСнтом TitleTip, Ρ‚ΠΎ TitleTip Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ для ΠΏΠΎΠΊΠ°Π·Π° Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ строки. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ CTitleTipListBox::OnSelchange Ρ€Π°Π·Π»ΠΈΡ‡Π°Π΅Ρ‚ списки с ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΌ ΠΈ мноТСствСнным Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ. Для списков с мноТСствСнным Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ CListBox::GetCaretIndex, Π° для списков с ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΌ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ – CListBox::GetCurSel. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½ΠΎΡ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ сообщСния LBN_SELCHANGE Ρ‚Π°ΠΊΠΆΠ΅ позволяСт ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ подсказку, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ строки ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ, Π° Π½Π΅ ΠΌΡ‹ΡˆΡŒΡŽ.

CTitleTipListBox::OnKillFocus ΠΈ CTitleTipListBox::OnDestroy ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ просты. CTitleTipListBox::OnKillFocus прячСт подсказку, Ссли Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΊΠ½ΠΎ, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π΅Π΅ фокус, Π½Π΅ являСтся ΠΎΠΊΠ½ΠΎΠΌ подсказки. Π­Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ автоматичСски ΠΏΡ€ΡΡ‚Π°Ρ‚ΡŒ подсказку, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ со списка клавишСй Tab. CTitleTipListBox::OnDestroy скрываСт ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°Π΅Ρ‚ элСмСнт TitleTip.

CTitleTipListBox::OnLButtonDown ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅Ρ‚ элСмСнт TitleTip для пСрСрисовки ΠΏΡ€ΠΈ смСнС строки. Π― Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°ΡŽ Π·Π°Ρ…Π²Π°Ρ‚ ΠΌΡ‹ΡˆΠΈ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ΡΡΠ½ΠΈΠ»ΠΎΡΡŒ, Ссли этого Π½Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π½Π°Ρ€ΡƒΡˆΠ°Π΅Ρ‚ΡΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π²Ρ‹Π±ΠΎΡ€Π° Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строк (ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅Ρ‚Π΅ курсор ΠΌΡ‹ΡˆΠΈ ΠΏΠΎ строкам, удСрТивая Π»Π΅Π²ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ я Π½Π΅ посвящСн Π² Ρ‚Π°ΠΉΠ½Ρ‹ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ устройства стандартного элСмСнта "список", я ΠΌΠΎΠ³Ρƒ лишь Π΄ΠΎΠ³Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, список сам Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΌΡ‹ΡˆΡŒ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π»Π΅Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡ‹ΡˆΠΈ для отслСТивания ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΉ курсора.

CTitleTipListBox::OnLButtonUp Π·Π°Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ курсор ΠΌΡ‹ΡˆΠΈ, Ссли ΠΎΠΊΠ½ΠΎ подсказки ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° экранС ΠΈ CTitleTipListBox Π΅Ρ‰Π΅ Π½Π΅ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠ» ΠΌΡ‹ΡˆΡŒ. CTitleTipListBox::PreTranslateMessage слСдит Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ сообщСниями ΠΎΡ‚ ΠΌΡ‹ΡˆΠΈ ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΎΠΊΠ½ΠΎ прСдставлСния Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ, Ссли список находится Π² этом ΠΎΠΊΠ½Π΅. Π― Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π» это для ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΠΈ повСдСния MFC-ΠΎΠΊΠ½Π° прСдставлСния, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ сообщСниС WM_MOUSEACTIVATE. Π˜Π½Π°Ρ‡Π΅ ΠΎΠΊΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сообщСниС ΠΎΠ± Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ ΠΌΡ‹ΡˆΡŒΡŽ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ‰Π΅Π»ΠΊΠ°Π΅Ρ‚ Π½Π° ΠΎΠΊΠ½Π΅ подсказки.

CODListBox прСдставляСт собой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ подсказок TitleTips для элСмСнта "список" с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ отрисовкой (см. рис.13). ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° CODListBox::m_nEdgeSpace ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для добавлСния пространства ΠΏΠΎ краям тСкста. ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° CODListBox::m_nFontHeight прСдставляСт ΠΆΠ΅Π»Π°Π΅ΠΌΡƒΡŽ высоту ΡˆΡ€ΠΈΡ„Ρ‚Π° для отобраТСния строк. Π’ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ CODListBox::m_Font хранится ΡˆΡ€ΠΈΡ„Ρ‚ для отобраТСния строк. CODListBox::CODListBox создаСт ΡˆΡ€ΠΈΡ„Ρ‚ (m_Font) ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ ΠΏΡ€ΠΈ отрисовкС элСмСнта "список".

Рис.13. CODListBox

// ODListBox.h : header file

//


/////////////////////////////////////////////////////////////////////////////

// CODListBox window

#include "TitleTipListBox.h"


class CODListBox : public CTitleTipListBox { // Construction public:

 CODListBox();

// Overrides

 // ClassWizard generated virtual function overrides

 //{{AFX_VIRTUAL(CODListBox)

public:

 virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);

 virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);

 //}}AFX_VIRTUAL

 // Implementation

public:

 virtual ~CODListBox();

protected:

 const int m_nEdgeSpace; // Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ пространство Π²ΠΎΠΊΡ€ΡƒΠ³ тСкста

 const int m_nFontHeight; // Высота ΡˆΡ€ΠΈΡ„Ρ‚Π°

 CFont m_Font; // Π¨Ρ€ΠΈΡ„Ρ‚ для отобраТСния строк

 virtual int GetIdealItemRect(int nIndex, LPRECT lpRect);

 // Generated message map functions protected:

 //{{AFX_MSG(CODListBox)

 // NOTE – the ClassWizard will add and remove member functions here.

 //}}AFX_MSG

 DECLARE_MESSAGE_MAP()

};


///////////////////////////////////////////////////////////////////////////// // ODListBox.cpp : implementation file //

#include "stdafx.h"

#include "TTDemo.h"

#include "ODListBox.h"


#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif


/////////////////////////////////////////////////////////////////////////////

// CODListBox

CODListBox::CODListBox() : m_nEdgeSpace(4), m_nFontHeight(20) {

 VERIFY(m_Font.CreateFont(m_nFontHeight, 0, 0, 0, FW_BOLD, 0, 0, 0, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial"));

}


CODListBox::~CODListBox() { }


int CODListBox::GetIdealItemRect(int nIndex, LPRECT lpRect) {

 ASSERT(nIndex >= 0);

 int nResult = GetItemRect(nIndex, lpRect);

 if (nResult != LB_ERR) {

  CClientDC DC(this);

  CFont* pOldFont = DC.SelectObject(&m_Font);

  // Calculate the text length.

  CString strItem;

  GetText(nIndex, strItem);

  CSize TextSize = DC.GetTextExtent(strItem);

  // Π’Π·ΡΡ‚ΡŒ максимум ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΉ ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΈ идСальной ΡˆΠΈΡ€ΠΈΠ½Ρ‹.

  lpRect->right = max(lpRect->right, lpRect->left + TextSize.cx + (m_nEdgeSpace * 2));

  DC.SelectObject(pOldFont);

 }

 return nResult;

}


BEGIN_MESSAGE_MAP(CODListBox, CTitleTipListBox)

 //{{AFX_MSG_MAP(CODListBox)

 // NOTE – the ClassWizard will add and remove mapping macros here.

 //}}AFX_MSG_MAP

END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////

// CODListBox message handlers

void CODListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) {

 CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);

 ASSERT_VALID(pDC);

 int nSavedDC = pDC->SaveDC();

 CString strItem;

 if (lpDrawItemStruct->itemID != –1) {

  GetText(lpDrawItemStruct->itemID, strItem);

 }

 COLORREF TextColor;

 COLORREF BackColor;

 UINT nItemState = lpDrawItemStruct->itemState;

 if (nItemState & ODS_SELECTED) {

  TextColor = RGB(255, 255, 255); // Π‘Π΅Π»Ρ‹ΠΉ

  BackColor = RGB(255, 0, 0); // ΠšΡ€Π°ΡΠ½Ρ‹ΠΉ

 } else {

  TextColor = RGB(255, 0, 0); // ΠšΡ€Π°ΡΠ½Ρ‹ΠΉ

  BackColor = RGB(255, 255, 255); // Π‘Π΅Π»Ρ‹ΠΉ

 }