Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > onmousemove


Автор: darkida 27.1.2010, 15:19
Как избавиться от мигания при использовании onmousemove? Или какая есть этому альтернатива?
Ну вот к примеру я хочу создать кнопку, ставлю изображение и на каждое действие изменяю её на другое. На onmousemove, onclick, onup, ondown. Так если мышкой водить по этому изображению начинают идти полосы. Как быть?

Автор: darkida 27.1.2010, 15:53
Блин, хотя может быть это потому что использую Delphi 6, не помню сейчас как работало на 7. Проверьте пожалуйста.

Ну а если же на последних версиях такая же баида. То хорошо было бы менять картинки используя IF. К примеру: если курсор мышы находиться в таком то квадрате то такое то изображение иначе другое. 

Автор: darkida 27.1.2010, 17:17
Ой, да перло. Можно с viseble играть, но вот тока почему то не работает. Почему? Что не так? Или надо что то дополнительно прописывать вот к этому: 
image1.Visible:=true;

Хотя тоже не уверен в том что поможет. Ведь она будет выполняться ровно столько же сколько мы будем двигать мышью.

Помогите народ... 
Неужто у всех все нормально с этим.

Автор: darkida 27.1.2010, 21:12
Код

procedure CMMouseEnter(var msg:TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE;
..
..
..
procedure MyComponent.CMMouseEnter(var msg:TMessage);
begin

inherited;
{действия на вход мыши в область компонента}
end;

procedure MyComponent.CMMouseLeave(var msg: TMessage);
begin

inherited;
{действия на покидание мыши области компонента}
end; 


Нашел вот это. Но воспользоваться никак не смог. Походу для них еще обработчик надо писать.

Я запарился ждать разумный вариант. И сделал пока так чтоб глаза не резала. Создал shape и на него событие onmove и на image загружаю картинку на этот shape наложил еще один shape чуть меньше размером опять onmove и на тот же image другую картинку,  а потом тока сам image опять же меньший размером предыдущих shapov. Вот такую вот глупость пришлось делать, и если умных ответов не будет,  то может кому-нибудь то поможет.  

Автор: ~FoX~ 27.1.2010, 21:22
darkida, Ух, какая активность...
Мигание происходит потому что при каждом движении ты свою картинку подгружаешь, рисуешь или чего ты там с ней делаешь... работа с графикой вообще процесс напряжный, для ВЦЛ-я.
Заведи специальный флажок булевый глобальный, при событии онмаусмув проверяй его состояние и если он, допустим истеный, то меня картинку и ставь его в ложь..
Код

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if flag = true then begin
    //Меняем картинку
  end;
  flag := false;
end;

А при остальных событиях  
Цитата

onclick, onup, ondown
 возвращай его в истину...

Автор: darkida 27.1.2010, 23:12
О дождался.
А то как чокнутый сам спрашиваю. И сам себе отвечаю и сам идеи себе талкаю. Но это я потому что память плохая и с блокнотами проблема и комп люблю форматировать.  
Мда точно что-то не подумал. С флажками то. ))

Пусть гооглик будет всегда здоровым. ))) Вот нашел ещё методы, испробовал - рабочие. Выложу чтоб другие не тратили на поиски свое время.  И мне легче было потом найти.
Код

const  
  BS_UP=1001;         //последнее событие было mouseup  
  BS_DOWN=1002;       //последнее событие было mousedown  
  BS_HOVER=1003;      //последнее событие было mousemove  
  BS_FORM=1004;  //мышь двигается по форме  

а потом присваиваем их:
Код

   procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,  
   Y: Integer);  
   begin  
   if Image1.Tag<>BS_HOVER then  
   SetState(Image1,IM_HOVER);  
   Image1.Tag:=BS_HOVER;  
   end;  
  
   procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;  
  10.   Shift: TShiftState; X, Y: Integer);  
   begin  
   if Image1.Tag<>BS_UP then  
   SetState(Image1,IM_MAIN);  
   Image1.Tag:=BS_UP;  
   end;  
 
   procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;  
   Shift: TShiftState; X, Y: Integer);  
   begin  
   if Image1.Tag<>BS_DOWN then  
   SetState(Image1,IM_DOWN);  
  Image1.Tag:=BS_DOWN;  
  end;  
   
  procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,  
  Y: Integer);  
  begin  
   if Image1.Tag<>BS_FORM then  
   SetState(Image1,IM_MAIN);  
   Image1.Tag:=BS_FORM;  
   end;  
 

Хотя можно было тока часть скинуть и так понятно. Ну ладно.

 http://parsers.info/2009/12/sender-sozdayom-svoj-stil-knopok/

2 метод 

B:Bool; //Объявите B где-нибудь после implementation

В FormCreate включите следующее

B:=True;
SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, 0, @B,  SPIF_SENDCHANGE)

тоже помогает. 

Так что методы есть. АЖ целых 3. Хотя на vingrade не находил.
Спасибо FOX. Сейчас проверю. 

Автор: darkida 27.1.2010, 23:27
Вот ещё один вопрос, ну даже не вопрос а просьба. 
Скиньте кодинг как можно checkbox заменить image' ами. Что то не получается? Думаю что image надо присваивать TAG и считать клики? А как правильно не знаю. Помогите?  

Автор: ~FoX~ 28.1.2010, 13:00
darkida, Одна тема - один вопрос!
Тебе галочки нужно заменить картинками или что?

Автор: darkida 28.1.2010, 13:19
Ну да. Так же две картинки. одна с галочкой другая без нее. И при клике менялись.  

Цитата

Одна тема - один вопрос!
 
Я думаю из-за такого вопроса не стоит создавать тему. Напиши пожалуйста код FOX. Заранее благодарен. 

Автор: eXtr0gen 2.2.2010, 21:14
Так же рекомендую поставить флаг DoubleBuffered в значение True. Тоже повышает скорость отрисовки. + более тщательно проработай процедуру перерисовки. Очень часто некоторые функции можно вынести за пределы цикла... 

Автор: darkida 3.2.2010, 07:41
Да DoubleBuffered  помогает. Но страшно жрет ресурсы. Если много картинок то потом начинает подвисать все.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)