//--------------------------------------------------------------------------- #include #pragma hdrstop #include "GlobalUnit.h" #include "SkinListBoxUnit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- __fastcall TSkinListBox::TSkinListBox(System::Classes::TComponent* AOwner) : Vcl::Stdctrls::TListBox(AOwner) { m_pSBVert = new TSkinScrollBar(this); m_pSBVert->Parent = (TWinControl*)AOwner; m_pSBVert->m_pWndCtrl = this; m_pSBVert->Enabled = true; m_bSBAction = false; Style = lbOwnerDrawVariable; } //--------------------------------------------------------------------------- __fastcall TSkinListBox::~TSkinListBox() { // if(m_pSBVert){ // delete m_pSBVert; // m_pSBVert = NULL; // } } //--------------------------------------------------------------------------- void __fastcall TSkinListBox::CreateHandle(void) { Vcl::Stdctrls::TListBox::CreateHandle(); if( m_pSBVert ) m_pSBVert->BringToFront(); } //--------------------------------------------------------------------------- void __fastcall TSkinListBox::CreateParams(Vcl::Controls::TCreateParams &Params) { Vcl::Stdctrls::TListBox::CreateParams( Params ); Params.Style = Params.Style & ~WS_BORDER; Params.ExStyle = Params.ExStyle & ~WS_EX_CLIENTEDGE; } //--------------------------------------------------------------------------- void __fastcall TSkinListBox::SetParent(TWinControl* AParent) { Vcl::Stdctrls::TListBox::SetParent( AParent ); if( m_pSBVert ) m_pSBVert->Parent = AParent; } //--------------------------------------------------------------------------- void __fastcall TSkinListBox::WMEraseBkgnd(TWMEraseBkgnd &Message) { // DefaultHandler( &Message ); if( m_pSBVert && !m_pSBVert->m_bAction ){ TScrollInfo si; si.cbSize = sizeof(si); si.fMask = SIF_ALL; GetScrollInfo( Handle, SB_VERT, &si ); int nSSBMax, nSSBMin, nSSBPos, nSSBPage; m_pSBVert->GetScrollRange( &nSSBMin, &nSSBMax ); nSSBPage = m_pSBVert->GetPageSize(); nSSBPos = m_pSBVert->GetScrollPos(); if( //m_pSBVert->Visible && ( si.nMax!=nSSBMax || si.nMin!=nSSBMin || si.nPage!=nSSBPage || si.nPos!=nSSBPos ) ){ SetScrollInfo( m_pSBVert->Handle, SB_CTL, &si, true ); m_pSBVert->Enabled = (si.nMax>=si.nPage); } } Message.Result = true; } //--------------------------------------------------------------------------- void __fastcall TSkinListBox::VisibleChanging(void) { if( !m_pSBVert ) return; DWORD dwStyle = GetWindowLong(Handle, GWL_STYLE); if( dwStyle & WS_VSCROLL ){ if( !Visible && !m_pSBVert->Visible ){ m_pSBVert->Top = Top; m_pSBVert->Visible = true; } else if( Visible && m_pSBVert->Visible ){ m_pSBVert->Visible = false; } } } //--------------------------------------------------------------------------- void __fastcall TSkinListBox::WMNCCalcSize(TWMNCCalcSize &Message) { DefaultHandler( &Message ); if( m_pSBVert && Message.CalcSize_Params ){ DWORD dwStyle = GetWindowLong(Handle, GWL_STYLE); if( dwStyle & WS_VSCROLL ){ DWORD dwSBWidth = GetSystemMetrics(SM_CXVSCROLL); if( m_pSBVert->Width < dwSBWidth ) m_pSBVert->Width = dwSBWidth; TRect newRect = Message.CalcSize_Params->rgrc[0]; m_pSBVert->Left = newRect.Left + newRect.Width() - m_pSBVert->Width + dwSBWidth; m_pSBVert->Top = newRect.Top; m_pSBVert->Height = newRect.Height(); if( Visible && !m_pSBVert->Visible ){ m_pSBVert->Visible = true; // TScrollInfo si; // si.cbSize = sizeof(si); // si.fMask = SIF_ALL; // GetScrollInfo( Handle, SB_VERT, &si ); // int nSSBMax, nSSBMin, nSSBPos, nSSBPage; // m_pSBVert->GetScrollRange( &nSSBMin, &nSSBMax ); // nSSBPage = m_pSBVert->GetPageSize(); // nSSBPos = m_pSBVert->GetScrollPos(); // if( si.nMax!=nSSBMax || si.nMin!=nSSBMin || si.nPage!=nSSBPage || si.nPos!=nSSBPos ){ // SetScrollInfo( m_pSBVert->Handle, SB_CTL, &si, true ); // m_pSBVert->Enabled = (si.nMax>=si.nPage); // } } } else{ if( m_pSBVert->Visible ){ m_pSBVert->Visible = false; m_pSBVert->SetPosition( 0, false ); } } } } //--------------------------------------------------------------------------- void __fastcall TSkinListBox::WMVScroll(TWMVScroll &Message) { DefaultHandler( &Message ); /* bool bSetScrollInfo; TScrollInfo si; if( Message.ScrollBar!=m_pSBVert->Handle ){ bSetScrollInfo = true; } else{ Message.ScrollBar = 0; bSetScrollInfo = false; } if( bSetScrollInfo ){ si.cbSize = sizeof(si); si.fMask = SIF_TRACKPOS | SIF_POS; GetScrollInfo( Handle, SB_VERT, &si ); // SetScrollInfo( m_pSBVert->Handle, SB_CTL, &si, TRUE ); } // */ Invalidate(); } //--------------------------------------------------------------------------- void __fastcall TSkinListBox::WMMouseWheel(TWMMouseWheel &Message) { DefaultHandler( &Message ); /* TScrollInfo si; si.cbSize = sizeof(si); si.fMask = SIF_POS; GetScrollInfo( Handle, SB_VERT, &si ); // SetScrollInfo( m_pSBVert->Handle, SB_CTL, &si, TRUE ); */ Invalidate(); } //--------------------------------------------------------------------------- void __fastcall TSkinListBox::AddItem(System::UnicodeString Item, System::TObject* AObject) { Vcl::Stdctrls::TListBox::AddItem( Item, AObject ); /* TScrollInfo si; si.cbSize = sizeof(si); si.fMask = SIF_ALL; GetScrollInfo( Handle, SB_VERT, &si ); // SetScrollInfo( m_pSBVert->Handle, SB_CTL, &si, TRUE ); */ } //--------------------------------------------------------------------------- void __fastcall TSkinListBox::DeleteSelected(void) { Vcl::Stdctrls::TListBox::DeleteSelected(); /* TScrollInfo si; si.cbSize = sizeof(si); si.fMask = SIF_ALL; GetScrollInfo( Handle, SB_VERT, &si ); // SetScrollInfo( m_pSBVert->Handle, SB_CTL, &si, TRUE ); */ } //--------------------------------------------------------------------------- void __fastcall TSkinListBox::KeyDown(System::Word &Key, System::Classes::TShiftState Shift) { Vcl::Stdctrls::TListBox::KeyDown( Key, Shift ); /* LockWindowUpdate( Handle ); switch( Key ){ case 33: case 34: case 35: case 36: case 38: case 40: { TScrollInfo si; si.cbSize = sizeof(si); si.fMask = SIF_POS; GetScrollInfo( Handle, SB_VERT, &si ); // SetScrollInfo( m_pSBVert->Handle, SB_CTL, &si, TRUE ); } break; } LockWindowUpdate( NULL ); */ Invalidate(); } //--------------------------------------------------------------------------- void __fastcall TSkinListBox::DrawItem(int Index, const System::Types::TRect &Rect, Winapi::Windows::TOwnerDrawState State) { Vcl::Stdctrls::TListBox::DrawItem(Index, Rect, State); } //--------------------------------------------------------------------------- void __fastcall TSkinListBox::MeasureItem(int Index, int &Height) { Vcl::Stdctrls::TListBox::MeasureItem(Index, Height); } //--------------------------------------------------------------------------- bool __fastcall TSkinListBox::IsSBLButtonDown(int X, int Y) { TPoint point(X,Y); point = m_pSBVert->ScreenToClient(point); return point.X>=0 && point.XWidth && point.Y>=0 && point.YHeight; } //---------------------------------------------------------------------------