Initial commit
This commit is contained in:
@@ -0,0 +1,400 @@
|
||||
//---------------------------------------------------------------------------
|
||||
#include <vcl.h>
|
||||
#pragma hdrstop
|
||||
|
||||
#include "PayMentPanelUnit.h"
|
||||
//---------------------------------------------------------------------------
|
||||
#pragma package(smart_init)
|
||||
//---------------------------------------------------------------------------
|
||||
#define LINE_HEIGHT (20)
|
||||
#define SCOLLBAR_WIDTH (14)
|
||||
#define STYLE_NAME_WIDTH (Width/2)
|
||||
#define STYLE_PAY_WIDTH (Width - STYLE_NAME_WIDTH - SCOLLBAR_WIDTH)
|
||||
|
||||
const static COLORREF
|
||||
CLR_TXT_HOT = RGB(0, 0, 0),
|
||||
CLR_BKG_INTERNAL = RGB(207, 163, 124),
|
||||
CLR_BKG_INTERNAL_LIGHT = RGB(234, 184, 140),
|
||||
CLR_CONTENT_DB_LINE_DARK = RGB(192, 148, 109),
|
||||
CLR_CONTENT_DB_LINE_LIGHT = RGB(237, 193, 154),
|
||||
COLOR_BORDER = RGB(186,124,83);
|
||||
//---------------------------------------------------------------------------
|
||||
__fastcall TPayMentPanel::TPayMentPanel( TComponent* Owner)
|
||||
: Vcl::Extctrls::TPanel( Owner )
|
||||
{
|
||||
m_ScrollBar = NULL;
|
||||
|
||||
m_iTopLine = 0;
|
||||
m_iShowLine = 1;
|
||||
bStylePayShow = true;
|
||||
DoubleBuffered = true;
|
||||
ParentCtl3D = false;
|
||||
Ctl3D = false;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TPayMentPanel::CreateWnd()
|
||||
{
|
||||
Vcl::Extctrls::TPanel::CreateWnd();
|
||||
|
||||
Canvas->Font->Size = Font->Size;//int(8 * 96.0 / g_yDpi + 0.5);
|
||||
|
||||
SetShowLine();
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
__fastcall TPayMentPanel::~TPayMentPanel()
|
||||
{
|
||||
if( m_ScrollBar ){
|
||||
delete m_ScrollBar;
|
||||
m_ScrollBar = NULL;
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TPayMentPanel::WMEraseBkgnd(TWMEraseBkgnd &Message)
|
||||
{
|
||||
|
||||
TRect rect = GetClientRect();
|
||||
|
||||
TCanvas* tempCanvas = new TCanvas;
|
||||
tempCanvas->Handle = Message.DC;
|
||||
|
||||
tempCanvas->Brush->Color = CLR_BKG_INTERNAL; //背景颜色
|
||||
tempCanvas->FillRect( rect );
|
||||
tempCanvas->Brush->Color = CLR_CONTENT_DB_LINE_DARK;
|
||||
tempCanvas->FrameRect( rect );
|
||||
|
||||
delete tempCanvas;
|
||||
tempCanvas = NULL;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TPayMentPanel::WMVScroll(Winapi::Messages::TWMScroll &Message)
|
||||
{
|
||||
int minpos, maxpos, page, curpos;
|
||||
m_ScrollBar->GetScrollRange(&minpos, &maxpos);
|
||||
page = m_ScrollBar->GetPageSize();
|
||||
// Get the current position of scroll box.
|
||||
curpos = m_ScrollBar->GetScrollPos();
|
||||
|
||||
// Determine the new position of scroll box.
|
||||
switch (Message.ScrollCode)
|
||||
{
|
||||
case SB_TOP: // Scroll to far top.
|
||||
curpos = minpos;
|
||||
break;
|
||||
|
||||
case SB_BOTTOM: // Scroll to far bottom.
|
||||
curpos = maxpos-page+1;
|
||||
break;
|
||||
|
||||
case SB_ENDSCROLL: // End scroll.
|
||||
break;
|
||||
|
||||
case SB_LINEUP: // Scroll left.
|
||||
if (curpos > minpos)
|
||||
curpos--;
|
||||
break;
|
||||
|
||||
case SB_LINEDOWN: // Scroll right.
|
||||
if (curpos < maxpos-page+1)
|
||||
curpos++;
|
||||
break;
|
||||
|
||||
case SB_PAGEUP: // Scroll one page left.
|
||||
if (curpos > minpos)
|
||||
curpos = (minpos > curpos-page) ? minpos : curpos-page;
|
||||
//max(minpos, curpos-page);
|
||||
break;
|
||||
|
||||
case SB_PAGEDOWN: // Scroll one page right.
|
||||
if( curpos<maxpos )
|
||||
curpos = (maxpos-page+1 < curpos+page) ? maxpos-page+1 : curpos+page;
|
||||
//min(maxpos-page+1, curpos+page);
|
||||
break;
|
||||
|
||||
case SB_THUMBPOSITION: // Scroll to absolute position. nPos is the position
|
||||
curpos = Message.Pos; // of the scroll box at the end of the drag operation.
|
||||
break;
|
||||
|
||||
case SB_THUMBTRACK: // Drag scroll box to specified position. nPos is the
|
||||
curpos = Message.Pos; // position that the scroll box has been dragged to.
|
||||
break;
|
||||
}
|
||||
|
||||
// Set the new position of the thumb (scroll box).
|
||||
if( Message.ScrollBar!=m_ScrollBar->Handle ){
|
||||
m_ScrollBar->SetPosition(curpos);
|
||||
// Paint();
|
||||
}
|
||||
if( m_iTopLine != curpos ){
|
||||
m_iTopLine = curpos;
|
||||
// Invalidate();
|
||||
if( m_nAddCost>0 ) {
|
||||
InvalidateRect(this->Handle,
|
||||
&TRect(0, LINE_HEIGHT, Width, Height-2*LINE_HEIGHT),
|
||||
false);
|
||||
}else{
|
||||
InvalidateRect(this->Handle,
|
||||
&TRect(0, LINE_HEIGHT, Width, Height-LINE_HEIGHT),
|
||||
false);
|
||||
}
|
||||
}
|
||||
|
||||
Message.Result = true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TPayMentPanel::WMMouseWheel(TWMMouseWheel &Message)
|
||||
{
|
||||
if( m_ScrollBar && m_ScrollBar->Visible ){
|
||||
UINT nSBCode;
|
||||
|
||||
if( Message.WheelDelta>0 ) nSBCode = SB_LINEUP;
|
||||
else nSBCode = SB_LINEDOWN;
|
||||
|
||||
Perform( WM_VSCROLL, MAKELONG(nSBCode,0), NULL );
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TPayMentPanel::SetContent(int iOperation, int nIdCount,
|
||||
UINT *aIdStyle, int *aStyleCost,
|
||||
int nCost, int nBalance)
|
||||
{
|
||||
int nCostTotal = 0;
|
||||
TSTYLEINFO *tStyle = new TSTYLEINFO;
|
||||
|
||||
STYLEPAY stylePayName;
|
||||
stylePayName.strStyleName = L"风格";
|
||||
stylePayName.strStyleCost = L"唱作音符";
|
||||
m_VCStylePay.push_back(stylePayName);
|
||||
if( iOperation==e_PO_Pay4Basic ||
|
||||
(iOperation == (e_PO_Pay4Basic|e_PO_Pay4Midi) ) )
|
||||
{
|
||||
bStylePayShow = false;
|
||||
}else{
|
||||
|
||||
for(int i=0; i<nIdCount; i++)
|
||||
{
|
||||
f_SM_GetStyleInfo(aIdStyle[i], tStyle);
|
||||
|
||||
STYLEPAY stylePayStyle;
|
||||
stylePayStyle.strStyleName = UTF8ToMBCS(tStyle->detail.strStyleName).c_str();
|
||||
|
||||
if( aStyleCost[i]==0 )
|
||||
stylePayStyle.strStyleCost = "免费";
|
||||
else if( aStyleCost[i]==-2 )
|
||||
stylePayStyle.strStyleCost = "已支付";
|
||||
else{
|
||||
stylePayStyle.strStyleCost = IntToStr(aStyleCost[i]);
|
||||
nCostTotal += aStyleCost[i];
|
||||
}
|
||||
|
||||
m_VCStylePay.push_back(stylePayStyle);
|
||||
}
|
||||
if(tStyle){
|
||||
delete tStyle;
|
||||
tStyle=NULL;
|
||||
}
|
||||
}
|
||||
|
||||
m_nAddCost = nCost - nCostTotal;
|
||||
if( m_nAddCost>0 ) {
|
||||
STYLEPAY stylePayDefault;
|
||||
stylePayDefault.strStyleName = L"功能费";
|
||||
stylePayDefault.strStyleCost = IntToStr(m_nAddCost);
|
||||
m_VCStylePay.push_back(stylePayDefault);
|
||||
}
|
||||
|
||||
STYLEPAY stylePayTotal;
|
||||
stylePayTotal.strStyleName = L"合计:";
|
||||
stylePayTotal.strStyleCost = IntToStr(nCost);
|
||||
m_VCStylePay.push_back(stylePayTotal);
|
||||
|
||||
if( m_nAddCost>0 )
|
||||
m_nStyleNum = m_VCStylePay.size()-3;
|
||||
else
|
||||
m_nStyleNum = m_VCStylePay.size()-2;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TPayMentPanel::CutOffString(String &cutOffStr)
|
||||
{
|
||||
String strTmp = cutOffStr;
|
||||
TSize size = Canvas->TextExtent( strTmp );
|
||||
int nLen = strTmp.Length();
|
||||
|
||||
if( size.Width >= STYLE_NAME_WIDTH )
|
||||
{
|
||||
nLen = nLen*(STYLE_NAME_WIDTH)/size.Width;
|
||||
nLen -= 1;
|
||||
|
||||
if(nLen <= 0){
|
||||
strTmp = strTmp.SubString(0, 1);
|
||||
}else{
|
||||
strTmp = strTmp.SubString(0, nLen);
|
||||
strTmp += "..";
|
||||
}
|
||||
|
||||
cutOffStr = strTmp;
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
int __fastcall TPayMentPanel::GetLineNumber()
|
||||
{
|
||||
return m_nStyleNum;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TPayMentPanel::SetShowLine()
|
||||
{
|
||||
if( bStylePayShow ) {
|
||||
if( m_nAddCost>0 )
|
||||
m_iShowLine = Height/LINE_HEIGHT - 3;
|
||||
else
|
||||
m_iShowLine = Height/LINE_HEIGHT - 2;
|
||||
int totalLine = GetLineNumber();
|
||||
if( totalLine>m_iShowLine ){
|
||||
m_ScrollBar = new TSkinScrollBar(this);
|
||||
m_ScrollBar->m_pWndCtrl = this;
|
||||
m_ScrollBar->Parent = this;
|
||||
if( m_nAddCost>0 )
|
||||
m_ScrollBar->Height = Height-3*LINE_HEIGHT-2;
|
||||
else
|
||||
m_ScrollBar->Height = Height-2*LINE_HEIGHT-2;
|
||||
m_ScrollBar->Left = Width - m_ScrollBar->Width - 1;
|
||||
m_ScrollBar->Top = LINE_HEIGHT+1;
|
||||
}
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TPayMentPanel::SetSB()
|
||||
{
|
||||
vector<STYLEPAY>::iterator vc_pFind;
|
||||
for(vc_pFind = m_VCStylePay.begin(); vc_pFind != m_VCStylePay.end(); vc_pFind++){
|
||||
CutOffString(vc_pFind->strStyleName);
|
||||
}
|
||||
|
||||
if( m_ScrollBar ){
|
||||
int totalLine = GetLineNumber();
|
||||
m_ScrollBar->SetRange( 0, totalLine-1 );
|
||||
m_ScrollBar->SetPageSize( m_iShowLine );
|
||||
m_ScrollBar->SetPosition( m_iTopLine );
|
||||
m_ScrollBar->Visible = true;
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void __fastcall TPayMentPanel::Paint(void)
|
||||
{
|
||||
vector<STYLEPAY>::iterator vc_pFind = m_VCStylePay.begin();
|
||||
TSize sizeFont;
|
||||
|
||||
Canvas->Font->Color = CLR_TXT_HOT;
|
||||
Canvas->Brush->Style = bsClear;
|
||||
|
||||
int curX, curY;
|
||||
|
||||
|
||||
///////////////////////////////
|
||||
sizeFont = Canvas->TextExtent(vc_pFind->strStyleName);
|
||||
curX = (STYLE_NAME_WIDTH - sizeFont.Width)/2;
|
||||
curY = (LINE_HEIGHT - sizeFont.Height)/2 ;
|
||||
Canvas->TextOutW( curX, curY, vc_pFind->strStyleName );
|
||||
|
||||
sizeFont = Canvas->TextExtent(vc_pFind->strStyleCost);
|
||||
curX = STYLE_NAME_WIDTH + (STYLE_PAY_WIDTH - sizeFont.Width)/2;
|
||||
Canvas->TextOutW( curX, curY, vc_pFind->strStyleCost );
|
||||
|
||||
curY = LINE_HEIGHT;
|
||||
|
||||
/////////////////////////////////
|
||||
if( m_nAddCost>0 )
|
||||
curY = Height - 2*LINE_HEIGHT;
|
||||
else
|
||||
curY = Height - LINE_HEIGHT;
|
||||
Canvas->Brush->Color = CLR_BKG_INTERNAL_LIGHT; //背景颜色
|
||||
Canvas->FillRect( TRect(1, LINE_HEIGHT,
|
||||
Width-1, curY ) );
|
||||
|
||||
/////////////////////////////////
|
||||
Canvas->Font->Color = CLR_TXT_HOT;
|
||||
Canvas->Brush->Style = bsClear;
|
||||
if( bStylePayShow ){
|
||||
|
||||
vc_pFind++;
|
||||
vc_pFind = vc_pFind + m_iTopLine;
|
||||
sizeFont = Canvas->TextExtent(vc_pFind->strStyleName);
|
||||
curY = LINE_HEIGHT + (LINE_HEIGHT - sizeFont.Height)/2;
|
||||
|
||||
int nShowAdd = 1;
|
||||
if( m_nAddCost>0 ) nShowAdd = 2;
|
||||
|
||||
for( int i=m_iTopLine;
|
||||
(m_nStyleNum > 0) &&
|
||||
(i < m_nStyleNum ) &&
|
||||
(vc_pFind != m_VCStylePay.end()-nShowAdd) &&
|
||||
(i <= m_iTopLine + m_iShowLine -1);
|
||||
i++, vc_pFind++ )
|
||||
{
|
||||
sizeFont = Canvas->TextExtent(vc_pFind->strStyleName);
|
||||
curX = (STYLE_NAME_WIDTH - sizeFont.Width)/2;
|
||||
Canvas->TextOutW( curX, curY, vc_pFind->strStyleName );
|
||||
|
||||
sizeFont = Canvas->TextExtent(vc_pFind->strStyleCost);
|
||||
curX = STYLE_NAME_WIDTH + (STYLE_PAY_WIDTH - sizeFont.Width)/2;
|
||||
Canvas->TextOutW( curX, curY, vc_pFind->strStyleCost);
|
||||
|
||||
curY += LINE_HEIGHT;
|
||||
}
|
||||
|
||||
/////////////////////////////////
|
||||
curY = Height - nShowAdd*LINE_HEIGHT;
|
||||
|
||||
Canvas->Pen->Color = CLR_CONTENT_DB_LINE_DARK;
|
||||
Canvas->MoveTo( 0, curY-1 );
|
||||
Canvas->LineTo( Width, curY-1 );
|
||||
Canvas->Pen->Color = CLR_CONTENT_DB_LINE_LIGHT;
|
||||
Canvas->MoveTo( 0, curY );
|
||||
Canvas->LineTo( Width, curY );
|
||||
}
|
||||
|
||||
if( m_nAddCost>0 ) {
|
||||
|
||||
vc_pFind = m_VCStylePay.end() -2;
|
||||
sizeFont = Canvas->TextExtent(vc_pFind->strStyleName);
|
||||
curX = (STYLE_NAME_WIDTH - sizeFont.Width)/2;
|
||||
curY += (LINE_HEIGHT - sizeFont.Height)/2 ;
|
||||
Canvas->TextOutW( curX, curY, vc_pFind->strStyleName );
|
||||
|
||||
sizeFont = Canvas->TextExtent(vc_pFind->strStyleCost);
|
||||
curX = STYLE_NAME_WIDTH + (STYLE_PAY_WIDTH - sizeFont.Width)/2;
|
||||
Canvas->TextOutW( curX, curY, vc_pFind->strStyleCost );
|
||||
}
|
||||
|
||||
/////////////////////////////
|
||||
vc_pFind = m_VCStylePay.end()-1;
|
||||
sizeFont = Canvas->TextExtent(vc_pFind->strStyleName);
|
||||
curX = (STYLE_NAME_WIDTH - sizeFont.Width)/2;
|
||||
curY = Height - LINE_HEIGHT +
|
||||
(LINE_HEIGHT - sizeFont.Height)/2 ;
|
||||
|
||||
Canvas->TextOutW( curX, curY, vc_pFind->strStyleName );
|
||||
|
||||
sizeFont = Canvas->TextExtent(vc_pFind->strStyleCost);
|
||||
curX = STYLE_NAME_WIDTH + (STYLE_PAY_WIDTH - sizeFont.Width)/2;
|
||||
Canvas->TextOutW( curX, curY, vc_pFind->strStyleCost );
|
||||
|
||||
curY = Height - LINE_HEIGHT;
|
||||
Canvas->Pen->Color = CLR_CONTENT_DB_LINE_DARK;
|
||||
Canvas->MoveTo( 0, curY-1 );
|
||||
Canvas->LineTo( Width, curY-1 );
|
||||
Canvas->Pen->Color = CLR_CONTENT_DB_LINE_LIGHT;
|
||||
Canvas->MoveTo( 0, curY );
|
||||
Canvas->LineTo( Width, curY );
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
Reference in New Issue
Block a user