Изображение Delphi 2010 на кнопке исчезает / мигает - PullRequest
4 голосов
/ 01 июля 2011

Когда я устанавливаю свойство imageindex и images для кнопки (из компонента / списка изображений / pngs), запускаю программу и нажимаю кнопку, изображение медленно мигает / исчезает и исчезает.Как это предотвратить и в чем проблема?

Ответы [ 2 ]

8 голосов
/ 08 октября 2013

Возрождая старую тему ...

После поиска решения в интернете и ничего не нашел, я заглянул в код TCustomButton.

Бывает, что, внутри, кнопкаэлемент управления в Windows имеет список изображений с 6 изображениями, как показано ниже:

индекс 0: нормальное изображение
индекс 1: горячее изображение (при наведении мыши на кнопку)
индекс 2: нажатое изображение (во времяВы держите кнопку мыши d собственной)
индекс 3: отключенное изображение
индекс 4: выбранное изображение (когда кнопка имеет фокус, но не нажата и не наведена на нее мышью)
индекс 5: (тот,что нам нужно и не может быть указано в элементе управления TButton; мы поговорим об этом)

В элементе управления TButton в Delphi вы можете установить для ImageList свойство «Images» и установить «ImageIndex "," HotImageIndex "," PressedImageIndex "," DisabledImageIndex "и" SelectedImageIndex ".

Если эти свойства установлены, элемент управления TButton создает ДРУГОЙ список изображений и копирует индексы, указанные в пропеИз списка изображений в свойстве «Изображения» этого нового списка изображений в порядке, указанном выше.

Проблема в том, что при фокусировке элемента управления Win 7 Aero приводит к тому, что он исчезаети выделите цвет подсветки (небольшая анимация), и он использовал 6-е изображение из своего внутреннего списка изображений для увеличения и уменьшения изображения, но НЕВОЗМОЖНО предоставить этот индекс изображения «FADE» для управления TButton, поэтому я имеюсоздал простое решение, которое работает для меня, но я должен позвонить в RunTime.(Вы можете получить новый класс из TCustomButton и создать новый элемент управления, например, установить новый SelectedFadeImageIndex, но я этого не сделал).

Я создал эту процедуру:

    procedure MakeButtonImageStopBlinking(AButton: TCustomButton);
    var
      ButtonImageList: TButtonImageList;
      Icon: HICON;
    begin
      SendMessage(AButton.Handle, BCM_GETIMAGELIST, 0, LPARAM(@ButtonImageList));
      Icon := ImageList_GetIcon(ButtonImageList.himl, 0, ILD_NORMAL);
      ImageList_AddIcon(ButtonImageLIst.himl, Icon);
      DestroyIcon(Icon);
    end;


поэтому, когда окно создано (по событию OnCreate), я просто вызываю MakeButtonImageStopBlinking, заменяя каждую кнопку с изображением в качестве параметра, и все это теперь работает.

Прошу прощения за ревингтакая старая тема, но, похоже, ничего подобного не получится (или я не смог найти должным образом).

Редактировать: Установка DoubleBufferd в True будет работать, но остановит небольшую анимацию изкнопка с фокусом.Используя приведенное выше решение, вы можете оставить DoubleBuffered в False, и вы получите все это (анимация из аэро и без затухания изображения).

3 голосов
/ 03 июля 2011

Похоже, что это свойство doubleBuffered для кнопки Tbutton. Когда установлено значение false, изображение мигает, когда установлено значение true, оно работает. Это происходит на Win 7 с включенным Aero.

...