Проблем със flat SpeedButton-и

3 отговора 0 прегледа
#1

Проблем със flat SpeedButton-и

Правя тука една програмка на D5, в която има панел с няколко SpeedButton-а и поле за чертане в PaintBox. Бутоните са flat. Hint-овете им излизат върху полето за чертане и за да ги скрие, Windows-a го пречертава, като всеки път вика PaintBox.Paint. При определени обстоятелства, пречертаването на полето започва да отнема време, което може да е 1-2 секунди, че и повече. Това обикновено не е проблем, но ако всичките бутони се обходят бързо с мишката, накрая голяма част от тях остават с рамките си, въпреки, че са flat. Някаква идея как да се справя с този проблем? Функционалността не се нарушава, но седи грозно и ме дразни.

P.S. С D2005 и включен манифест за теми е същата работа. Пробвам под XP SP2.

Mixy
Отговор
в отговор на Mixy #2

Дървения начин не ти ли харесва?

Дървения начин не ти ли харесва?
Правиш наследник на tSpeedButon, прехващаш message CM_HINTSHOW, преценяваш дали ще показваш Hint (или не - примерно, ако скоро си бил върху друг бутон, или ако много малко си бил върху текущия - няма да е съвсем елементарно).
CMHintShow е привейт в TControl.

(Впрочем, нещо полигонско ли ползваш или ти изчисляваш, че мишката кликва върху стрелкичката? - доста добре е отработено)

Отговор
в отговор на NikB #3

Re: Дървеното е за дърводелци :)

Не искам да се бъркам в механизма за обработка на hint-овете, но и това може да е решение в краен случай, ако не измислим друго. Има начин да се оптимизира изчертаването да става малко по-бързо, но винаги можеш да добавш още обекти, та и това не е окончателно решение.

Иначе стрелките са полигони с по 4 точки - при всеки клик ги обхождам и проверявам дали курсора не попада в някой от тях.

Mixy
Отговор
в отговор на Mixy #4

Re: Дървеното е за дърводелци :)

Реших проблема радикално - след всяко пречертаване на полето, обхождам бутоните и им пращам CM_MOUSELEAVE.



Mixy
Отговор