Trzeba obsłużyć komunikaty CM_MOUSEENTER i CM_MOUSELEAVE [wewnętrzne VCL]
co wiąże się ze zrobieniem nowego komponentu na bazie TPanel .
Lub za pomocą Win API dobrać się do obsługi komunikatów kontrolki np. dla dwóch paneli w aplikacji
[przykładowo] coś takiego :
#define STRICT //<<== UWAGA WAŻNE
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
WNDPROC OldProc[2] ;
TPanel * panel[2] ;
//------------------------------------
TRACKMOUSEEVENT tme = { sizeof(tme) };
BOOL MouseIn = false ;
//------------------------------------
LRESULT CALLBACK WndProcPanel(HWND hwnd ,UINT message,WPARAM wParam ,LPARAM lParam)
{
TPanel* p ;
for(int i = 0 ; i < 2 ;i++)
{
if(hwnd == panel[i]->Handle)
{
p = panel[i] ;
break ;
}
}
switch (message)
{
case WM_MOUSEMOVE:
if (!MouseIn)
{
MouseIn = true;
tme.dwFlags = TME_LEAVE;
tme.hwndTrack = hwnd ;
TrackMouseEvent(&tme);
p->BevelOuter = bvRaised ;
}
break;
case WM_MOUSELEAVE:
MouseIn = false ;
p->BevelOuter = bvNone ;
break;
default: ;
}
return CallWindowProc(OldProc[p->Tag],hwnd,message,wParam,lParam);
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
panel[0] = Panel1 ;
panel[1] = Panel2 ;
OldProc[0] = (WNDPROC)SetWindowLong(Panel1->Handle,GWL_WNDPROC,(LONG)WndProcPanel);
OldProc[1] = (WNDPROC)SetWindowLong(Panel2->Handle,GWL_WNDPROC,(LONG)WndProcPanel);
Panel1->Tag = 0 ;
Panel2->Tag = 1 ;
Panel1->BevelOuter = bvNone ;
Panel2->BevelOuter = bvNone ;
}
//---------------------------------------------------------------------------
Tylko co Ci to da ?
SpeedButton [ Additional] z ustawonym 'Flat = true' działa podobnie .