263 lines
7.1 KiB
C++
263 lines
7.1 KiB
C++
//---------------------------------------------------------------------------
|
|
#include <vcl.h>
|
|
#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.X<m_pSBVert->Width
|
|
&& point.Y>=0 && point.Y<m_pSBVert->Height;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|