Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как убрать моргание?

725
12 августа 2006 года
UnErase
190 / / 08.06.2006
Попробовал сделать графическую кнопку, методом - навел на компонент Image мышкой (событие OnMouseMove), картинка поменялась на нажатую кнопку, отвел мышку от компонента Image (событие на форме OnMouseMove), катинка поменялась на НЕ нажатую кнопку.

Все работает, но когда наводишь или отводишь (меняется картинка) то область где расположен компонент Image моргает, что есть не очень красиво.

Как этого можно избежать? Или посоветуйте другой способ реализации графической кнопки!

Спасибо!
8.7K
12 августа 2006 года
Rubicon
55 / / 28.10.2005
[QUOTE=UnErase]Попробовал сделать графическую кнопку, методом - навел на компонент Image мышкой (событие OnMouseMove), картинка поменялась на нажатую кнопку, отвел мышку от компонента Image (событие на форме OnMouseMove), катинка поменялась на НЕ нажатую кнопку.

Все работает, но когда наводишь или отводишь (меняется картинка) то область где расположен компонент Image моргает, что есть не очень красиво.

Как этого можно избежать? Или посоветуйте другой способ реализации графической кнопки!

Спасибо![/QUOTE]

Установи у формы свойство DoubleBuffered=true;
21K
10 сентября 2006 года
casy
1 / / 10.09.2006
Не получится через DoubleBuffered, проверено.

Единственный способ - использовать работу через DirectX. Только работать с DirectDraw (входит в состав DirectX) надо не в полноэкранном (как обычно везде рекомендуют и пишут в книгах с примерами), а в оконном режиме. Это не принципиально, но обычно требуется работа приложения без разворота на весь экран, в окне. Отсюда и решение.

И хотя везде и пишут, что в оконном режиме DirectDraw будет работать медленнее в несколько раз по сравнению с полноэкранным, все это ерунда. Для эффекта нажатия/отжатия кнопки этого за глаза хватает.
Пример: у меня было 32-битное изображение кнопки размером 80х25, нажим был натуральный, без морганий и заметных глазу прорисовок.
1.9K
10 сентября 2006 года
SABROG
242 / / 26.01.2006
А при перемещении указателя по области Image на каждую смену координат курсора вызывается OnMouseMove ?
-------
В общем сам поставил эксперимент. На любое движение мышки вызывается OnMouseMove, правда я не могу понять почему невозможно получить координаты контрола без нажатой левой кнопки мышки (ControlAtPos). Тем не менее, я вызываю смену картинки у Image1, на одну когда курсор над ней и на другую, когда курсор не над ней. При перемещении указателя на Image1 картинка действительно моргала. Я добавил DoubleBuffered = true; в конструктор формы, моргание пропало. Это на машине 900Mhz Celeron, 512 ОЗУ. Интересно посмотреть на ваш код.
246
11 сентября 2006 года
GIZMO
1.8K / / 30.07.2004
[QUOTE=UnErase]Попробовал сделать графическую кнопку, методом - навел на компонент Image мышкой (событие OnMouseMove), картинка поменялась на нажатую кнопку, отвел мышку от компонента Image (событие на форме OnMouseMove), катинка поменялась на НЕ нажатую кнопку.
[/QUOTE]
Это надо делать в сообщениях CM_MOUSEENTER/CM_MOUSELEAVE.

Цитата:

Все работает, но когда наводишь или отводишь (меняется картинка) то область где расположен компонент Image моргает, что есть не очень красиво.


возможно это из-за - OnMouseMove, или см. ниже...

Цитата:

Как этого можно избежать? Или посоветуйте другой способ реализации графической кнопки!


Сначала пишешь (Gliph, Caption e.t.c.) в память (TBitmap) потом переносишь на канву BitBlt(Canvas->Handle, 0, 0, ClientWidth, ClientHeight, bit->Canvas->Handle, 0, 0,
SRCCOPY);

Смотри примеры Борландовские там все есть.

1.9K
12 сентября 2006 года
SABROG
242 / / 26.01.2006
Вот как это может быть:
//Unit1.h
Код:
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TButton *Button1;
private:    // User declarations
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
        void __fastcall BtnWindowProcess(TMessage &);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

//Unit1.cpp
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TWndMethod PrevProc;
TCanvas *BtnCan;
HDC BtnDC;
Graphics::TBitmap *bmpEnter,*bmpLeave;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
PrevProc = Button1->WindowProc;
Button1->WindowProc = BtnWindowProcess;
BtnCan = new TCanvas;
BtnDC = GetDC(Button1->Handle);
BtnCan->Handle = BtnDC;
bmpEnter = new Graphics::TBitmap;
bmpLeave = new Graphics::TBitmap;
bmpEnter->Transparent = true;
bmpLeave->Transparent = true;
bmpEnter->LoadFromFile("I:\\FastIcons\\BMPs\\48X48\\tools.bmp");
bmpLeave->LoadFromFile("I:\\FastIcons\\BMPs\\48X48\\user.bmp");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BtnWindowProcess(TMessage &mess)
{
         switch (mess.Msg)
         {
           case CM_MOUSEENTER:
           BtnCan->Draw(0,0,bmpEnter);
           break;
           case CM_MOUSELEAVE:
           BtnCan->Draw(0,0,bmpLeave);
           break;
         }
PrevProc(mess);
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог