| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > "Аномалия" с ico->Width |
| Автор: artsb 22.6.2008, 20:03 | ||
| Всем привет! Вот кусок кода:
Проблема в том, что при первой отрисовке ico->Width=32 не зависимо от реального размера иконки и, естественно, при появлении окна иконка отображается не на своём месте. При последующих отрисовках - размер правильный. В чём может быть проблема? Спасибо. |
| Автор: Rrader 23.6.2008, 07:38 | ||||||
| artsb, это связано со спецификой класса TIcon Вот код получения ширины:
GetSystemMetrics(SM_CXICON) возвращает 32 (по умолчанию). При создании TIcon поле FImage инициализируется нулями, т.е. FSize->X == 0; FSize->Y == 0; Соответственно возращается 32. При вызове Canvas->Draw() в данном случае вызывается метод TIcon->Draw() и происходит следующее: вызывается функция (ACanvas - это Canvas формы в данном случае):
При обращении к свойству Handle запрашивается дескриптор иконки:
В процедуре HandleNeeded() вызывается функция ReadIcon. Она довольно объёмная, в ней сначала тоже происходит вызов GetSystemMetrics(SM_CXICON), но потом значение берется из массива указателей на структуру TIconRec. Там проводятся предварительные расчеты (в функции BetterSize), и мы получаем 16х16 |
| Автор: artsb 23.6.2008, 18:41 |
| Rrader, спасибо! Но, вообще, странно, ведь я после создания объекта TIcon загружаю в него иконку. Размер не изменяется? |
| Автор: Rrader 24.6.2008, 14:22 |
| Нет. Не сразу |
| Автор: artsb 24.6.2008, 21:08 |
| Спасибо. |