//---------------------------------------------------------------------------
#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
Как убрать моргание?
Все работает, но когда наводишь или отводишь (меняется картинка) то область где расположен компонент Image моргает, что есть не очень красиво.
Как этого можно избежать? Или посоветуйте другой способ реализации графической кнопки!
Спасибо!
Все работает, но когда наводишь или отводишь (меняется картинка) то область где расположен компонент Image моргает, что есть не очень красиво.
Как этого можно избежать? Или посоветуйте другой способ реализации графической кнопки!
Спасибо![/QUOTE]
Установи у формы свойство DoubleBuffered=true;
Единственный способ - использовать работу через DirectX. Только работать с DirectDraw (входит в состав DirectX) надо не в полноэкранном (как обычно везде рекомендуют и пишут в книгах с примерами), а в оконном режиме. Это не принципиально, но обычно требуется работа приложения без разворота на весь экран, в окне. Отсюда и решение.
И хотя везде и пишут, что в оконном режиме DirectDraw будет работать медленнее в несколько раз по сравнению с полноэкранным, все это ерунда. Для эффекта нажатия/отжатия кнопки этого за глаза хватает.
Пример: у меня было 32-битное изображение кнопки размером 80х25, нажим был натуральный, без морганий и заметных глазу прорисовок.
-------
В общем сам поставил эксперимент. На любое движение мышки вызывается OnMouseMove, правда я не могу понять почему невозможно получить координаты контрола без нажатой левой кнопки мышки (ControlAtPos). Тем не менее, я вызываю смену картинки у Image1, на одну когда курсор над ней и на другую, когда курсор не над ней. При перемещении указателя на Image1 картинка действительно моргала. Я добавил DoubleBuffered = true; в конструктор формы, моргание пропало. Это на машине 900Mhz Celeron, 512 ОЗУ. Интересно посмотреть на ваш код.
[/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);
Смотри примеры Борландовские там все есть.
//Unit1.h
Код:
//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);
}
#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);
}