Files
AccompanyCube/SkinListBoxUnit.cpp
2026-06-13 00:10:11 +08:00

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;
}
//---------------------------------------------------------------------------