Files
AC_Pro/ToolpalPanel.cpp
2026-06-13 00:05:19 +08:00

374 lines
9.2 KiB
C++

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "GlobalUnit.h"
#include "MessageDef.h"
#include "ToolpalPanel.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
extern TImage * w_imgDrag; //拖动图片
extern bool w_bDraging;
extern int w_iDragMode, //拖动模式
w_xImgDrag, //透明图片位置
w_yImgDrag,
w_xOldDrag, //透明图片上次位置
w_yOldDrag,
w_xOffDrag, //图片左上角与鼠标距离
w_yOffDrag;
const COLORREF clrBackground = RGB(47, 50, 57), //面板背景
clrBackboard = RGB( 29,31,35 ), //面板边框
clrHeaderback = RGB( 58, 62, 69 ); //标题栏背景
TMenuPanel* TToolpalPanel::m_PopMenu = NULL;
__fastcall TToolpalPanel::TToolpalPanel(TComponent* AOwner)
: Vcl::Extctrls::TPanel(AOwner)
{
Visible = false;
ParentFont = true;
ShowHint = true;
DoubleBuffered = true;
m_nTitleHeight = 25;
m_iType = 0;
Color = clrBackground;
m_sbVert = NULL;
m_ApplicationEvents = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TToolpalPanel::CreateWnd(void)
{
Vcl::Extctrls::TPanel::CreateWnd();
if( m_ApplicationEvents==NULL ){
m_ApplicationEvents = new TApplicationEvents(NULL);
m_ApplicationEvents->OnMessage = DoHandleMessage;
}
}
//---------------------------------------------------------------------------
__fastcall TToolpalPanel::~TToolpalPanel()
{
if( m_ApplicationEvents )
delete m_ApplicationEvents;
if( m_sbVert )
delete m_sbVert;
while( m_lstBtnTools.size()>0 ){
delete m_lstBtnTools.back();
m_lstBtnTools.pop_back();
}
}
//---------------------------------------------------------------------------
void __fastcall TToolpalPanel::Paint()
{
if( w_bDraging ){
//绘制半透明图片
TBlendFunction Blend;
Blend.BlendOp = AC_SRC_OVER;
Blend.BlendFlags = 0;
Blend.AlphaFormat = 0;
Blend.SourceConstantAlpha =135;
TPoint pt(w_xImgDrag, w_yImgDrag);
pt = ScreenToClient( pt );
::AlphaBlend (Canvas->Handle,
pt.X,
pt.Y,
w_imgDrag->Width,
w_imgDrag->Height,
w_imgDrag->Canvas->Handle,
0,
0,
w_imgDrag->Width,
w_imgDrag->Height,
Blend
);
}
}
//---------------------------------------------------------------------------
void __fastcall TToolpalPanel::WMEraseBkgnd(Winapi::Messages::TWMEraseBkgnd &Message)
{
TRect rect = GetClientRect();
TCanvas* tempCanvas = new TCanvas;
tempCanvas->Handle = Message.DC;
//绘制外边框
tempCanvas->Brush->Color = clrBackboard;
tempCanvas->FrameRect(rect);
//绘制标题栏
tempCanvas->Pen->Color = clrBackboard;
tempCanvas->MoveTo( 1, m_nTitleHeight );
tempCanvas->LineTo( Width-1, m_nTitleHeight );
TRect rtTitle(rect);
rtTitle.Left++;
rtTitle.Right--;
rtTitle.Top++;
rtTitle.Bottom = m_nTitleHeight;
tempCanvas->Brush->Color = clrHeaderback;
tempCanvas->FillRect(rtTitle);
tempCanvas->Font->Name = g_strTxtFontName;
tempCanvas->Font->Size = g_szFont9;
tempCanvas->Font->Color = RGB(156, 170, 189);
TSize size = tempCanvas->TextExtent( m_strTitle );
int x = 12,//(Width - size.Width) / 2,
y = (25 - size.Height) / 2 + 1;
tempCanvas->TextOut( x, y, m_strTitle );
//绘制底色
rect.Top += m_nTitleHeight;
rect.Left++;
rect.Right--;
rect.Bottom--;
tempCanvas->Brush->Color = clrBackground;
tempCanvas->FillRect( rect );
delete tempCanvas;
Message.Result = true;
}
//---------------------------------------------------------------------------
void __fastcall TToolpalPanel::WMSize(Winapi::Messages::TWMSize &Message)
{
DefaultHandler( &Message );
LayoutBtns();
}
//---------------------------------------------------------------------------
void __fastcall TToolpalPanel::AddToolBtn( int stateCount, String resName,
TNotifyEvent aClickEvent, String strHint,
int index )
{
if( resName.Length()>0 ){
TPngImage* img = new TPngImage();
img->LoadFromResourceName( int(HInstance), resName );
TPNGButton* pBtn = new TPNGButton(NULL);
pBtn->SetStateCount( stateCount );
pBtn->SetPngImg( img );
delete img;
pBtn->Parent = this;
// pBtn->Left = Width - pBtn->Width - 4;
pBtn->Top = ( m_nTitleHeight - pBtn->Height );
pBtn->OnClick = aClickEvent;
pBtn->ShowHint = true;
pBtn->Hint = strHint;
pBtn->OnMouseEnter = BtnToolMouseEnter;
if( index==-1 )
m_lstBtnTools.push_back( pBtn );
else
m_lstBtnTools.insert( m_lstBtnTools.begin()+index, pBtn );
LayoutBtns();
}
}
//---------------------------------------------------------------------------
void __fastcall TToolpalPanel::DoHandleMessage(MSG &Msg, bool &Handled)
{
if( !Visible )
return;
if( Msg.message==WM_MOUSEMOVE && Msg.wParam==0 ){
TPoint pt( Msg.pt.x, Msg.pt.y );
pt = ScreenToClient( pt );
if( m_sbVert && m_sbVert->Visible && Msg.hwnd!=m_sbVert->Handle ) //滚动条自动隐藏
m_sbVert->Visible = false;
if( pt.x>=0 && pt.x<Width && pt.y>=0 && pt.y<Height && Msg.hwnd==Handle ){
if( pt.x <= LEFT_BOUND ){ //拖动调整宽度
if( g_iToolPanelShow==0 ){
Screen->Cursor = crHSplit;
m_ApplicationEvents->CancelDispatch();
}
}
else{
if( Screen->Cursor==crHSplit )
Screen->Cursor = crDefault;
if( CanVSplit() && pt.y <= LEFT_BOUND ){ //拖动调整高度
Screen->Cursor = crVSplit;
m_ApplicationEvents->CancelDispatch();
}
else if( Screen->Cursor==crVSplit )
Screen->Cursor = crDefault;
}
if( m_sbVert && m_sbVert->IsOperable() && pt.x >= m_sbVert->Left
&& pt.y >= m_sbVert->Top ){ //滚动条自动显示
m_sbVert->Visible = true;
m_ApplicationEvents->CancelDispatch();
}
}
else if( Screen->Cursor==crHSplit && g_iToolPanelShow==1
&& ( pt.x<0 || pt.x>=Width )
|| Screen->Cursor==crVSplit && (pt.y<0 || pt.y>=Height))
Screen->Cursor = crDefault;
}
}
//---------------------------------------------------------------------------
void __fastcall TToolpalPanel::WMMouseDown(TWMMouse &Message)
{
if( ( Message.Keys & MK_LBUTTON ) && ( Screen->Cursor==crVSplit //调整高度
|| Screen->Cursor==crHSplit )){ //调整宽度
TPoint pt;
if( Screen->Cursor==crVSplit ){
DrawDragImg( DM_ADJUSTHEIGHT );
pt.x = 1;
pt.y = 0;
}
else{
DrawDragImg( DM_ADJUSTWIDTH );
pt.x = 0;
pt.y = PANEL_TOP - Top;
}
pt = ClientToScreen( pt );
w_xOldDrag = w_xImgDrag = pt.X;
w_yOldDrag = w_yImgDrag = pt.Y;
w_xOffDrag = Message.XPos - 1;
w_yOffDrag = Message.YPos;
SetCapture( Handle );
Message.Result = 1;
}
}
//---------------------------------------------------------------------------
void TToolpalPanel::DrawDragImg( int mode )
{
w_imgDrag = new TImage(this);
if( mode==DM_ADJUSTWIDTH ){
COLORREF clrPixel[2] = { clWhite, clBlack };
w_imgDrag->Width = 4;
w_imgDrag->Height = Application->MainForm->Height - PANEL_TOP - STATE_HEIGHT;
TRect rcDraw( 0, 0, w_imgDrag->Width, w_imgDrag->Height );
for( int i=0; i<w_imgDrag->Width; i++ ){
for( int j=0; j<w_imgDrag->Height; j++ ){
w_imgDrag->Canvas->Pixels[i][j] = clrPixel[(i+j)%2];
}
}
}
else if( mode==DM_ADJUSTHEIGHT ){
COLORREF clrPixel[2] = { clWhite, clBlack };
w_imgDrag->Width = Width-2;
w_imgDrag->Height = 4;
TRect rcDraw( 0, 0, w_imgDrag->Width, w_imgDrag->Height );
for( int i=0; i<w_imgDrag->Width; i++ ){
for( int j=0; j<w_imgDrag->Height; j++ ){
w_imgDrag->Canvas->Pixels[i][j] = clrPixel[(i+j)%2];
}
}
}
w_bDraging = true;
w_iDragMode = mode;
}
//---------------------------------------------------------------------------
bool TToolpalPanel::ShowDragImg( bool bShow, int iState )
{
int w = w_imgDrag->Width,
h = w_imgDrag->Height;
TPoint ptOld( w_xOldDrag, w_yOldDrag ),
ptNew( w_xImgDrag, w_yImgDrag );
RECT rtInvalid;
ptOld = ScreenToClient( ptOld );
ptNew = ScreenToClient( ptNew );
if( w_iDragMode==DM_ADJUSTWIDTH ){
rtInvalid.left = Width;
rtInvalid.right = 0;
rtInvalid.top = 1;
rtInvalid.bottom = Height-1;
if( ptOld.X>0 && ptOld.X<Width
|| ptOld.X+w>0 && ptOld.X+w<Width ){
rtInvalid.left = min( ptOld.X, rtInvalid.left );
rtInvalid.right = max( ptOld.X+w, rtInvalid.right );
}
if( bShow && ( ptNew.X>0 && ptNew.X<Width
|| ptNew.X+w>0 && ptNew.X+w<Width )){
rtInvalid.left = min( ptNew.X, rtInvalid.left );
rtInvalid.right = max( ptNew.X+w, rtInvalid.right );
}
if( rtInvalid.left<0 ) rtInvalid.left = 0;
if( rtInvalid.right>Width ) rtInvalid.right = Width;
if( rtInvalid.right>rtInvalid.left ){
InvalidateRect( Handle, &rtInvalid, false );
}
}
return false;
}
//---------------------------------------------------------------------------
void TToolpalPanel::DeleteToolBtn( int index )
{
if( index<m_lstBtnTools.size() ){
delete m_lstBtnTools[index];
m_lstBtnTools.erase( m_lstBtnTools.begin() + index );
LayoutBtns();
}
}
//---------------------------------------------------------------------------
void TToolpalPanel::LayoutBtns()
{
int r = Width;
for( int i=0; i<m_lstBtnTools.size(); i++ ){
TPNGButton* pBtn = m_lstBtnTools[i];
pBtn->Left = r - pBtn->Width;
if( i==0 ) pBtn->Left -= 4;
r = pBtn->Left;
}
}
//---------------------------------------------------------------------------
void __fastcall TToolpalPanel::BtnToolMouseEnter(TObject* Sender)
{
if( Screen->Cursor!=crDefault )
Screen->Cursor = crDefault;
}
//---------------------------------------------------------------------------