Problem z kodem w C++ toolbar, Dla tych co znają c++ banał..

0

Zaczynam programować w C++, umiem już podstawowe rzeczy, lecz stanąłem na pewnej rzeczy, otóż na formie wstawiłem panel, do niego drugi, w tym drugim panelu usunąłem obramowanie i dałem do niego event OnMouseMove który powoduje obramowanie tego panelu (bvRaised), lecz po zjechaniu myszką z tego drugiego panelu obramowanie nie znika, próbowałem wszystkiego co umiem aby obramowanie wracało do bvNone, ale nic nie pomaga. Ma to mniej więcej wyglądać jak każdy guzik w toolbarze w jakimkolwiek programie windowsowskim, np C++ Builder 6, tam wszystkie guziki tak działają.

Proszę o jakieś naprowadzenie, lub kod!

Dzięki za każdą pomoc!

0

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 .

1 użytkowników online, w tym zalogowanych: 0, gości: 1