GdiPlus控件Static和Button的使用

关于GdiPlus的使用方法见上一篇文章《GdiPlus使用方法》

本篇文章主要使用GdiPlus设置对话框Static控件和Button控件的效果


开发工具:VS2008

1.新建对话框应用程序

在对话框上添加相应的控件,并且添加相关素材到工程中


2.重写相应的类

CMyStatic

#pragma once


// CMyStatic

class CMyStatic : public CStatic
{
	DECLARE_DYNAMIC(CMyStatic)

public:
	CMyStatic();
	virtual ~CMyStatic();

protected:
	DECLARE_MESSAGE_MAP()

public:
	CString m_sTitle;
	UINT m_nFormat;
	DWORD m_dwColor;
	LOGFONT m_LogFontTitle;
	afx_msg void OnPaint();
	void SetTitle(CString sTitle);
};

// MyStatic.cpp : 实现文件
//

#include "stdafx.h"
#include "MyGdiDemo.h"
#include "MyStatic.h"


// CMyStatic

IMPLEMENT_DYNAMIC(CMyStatic, CStatic)

CMyStatic::CMyStatic()
{
	m_sTitle = _T("测试标题");

	m_LogFontTitle.lfHeight = 39;
	m_LogFontTitle.lfWeight = 0;
	m_LogFontTitle.lfOrientation= 0;
	m_LogFontTitle.lfEscapement = 0;
	m_LogFontTitle.lfWidth = 0;
	m_LogFontTitle.lfItalic = false;
	m_LogFontTitle.lfUnderline = false;
	m_LogFontTitle.lfStrikeOut = false;
	m_LogFontTitle.lfCharSet = GB2312_CHARSET;
	m_LogFontTitle.lfOutPrecision = OUT_DEFAULT_PRECIS;
	m_LogFontTitle.lfClipPrecision = CLIP_DEFAULT_PRECIS;
	m_LogFontTitle.lfQuality = PROOF_QUALITY;
	m_LogFontTitle.lfPitchAndFamily = DEFAULT_PITCH;
	wcscpy_s(m_LogFontTitle.lfFaceName,_T("微软雅黑"));

	m_nFormat = DT_SINGLELINE|DT_CENTER	|DT_VCENTER|DT_END_ELLIPSIS;
	m_dwColor = RGB(255,0,255);
}

CMyStatic::~CMyStatic()
{
}


BEGIN_MESSAGE_MAP(CMyStatic, CStatic)
	ON_WM_PAINT()
END_MESSAGE_MAP()



// CMyStatic 消息处理程序



void CMyStatic::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	// TODO: 在此处添加消息处理程序代码
	// 不为绘图消息调用 CStatic::OnPaint()

	RECT rect;
	GetClientRect(&rect);

	HFONT hFont = ::CreateFontIndirect(&m_LogFontTitle);
	HFONT hOldFont = (HFONT)::SelectObject(dc.m_hDC,hFont);
	dc.SetTextColor(m_dwColor);//画文字
	dc.SetBkMode(TRANSPARENT);
	dc.DrawText(m_sTitle,&rect,m_nFormat);
	hFont = (HFONT)::SelectObject(dc.m_hDC,hOldFont);
	::DeleteObject(hFont);
}

void CMyStatic::SetTitle(CString sTitle)
{
	m_sTitle = sTitle;
}

CMyButton

#pragma once


// CMyButton

class CMyButton : public CButton
{
	DECLARE_DYNAMIC(CMyButton)

public:
	CMyButton();
	virtual ~CMyButton();

protected:
	DECLARE_MESSAGE_MAP()

private:
	Image* m_pImageBackDef;
	Image* m_pImageBackSel;
	int m_nBackWidth , m_nBackHeight;
	bool   m_bSel;
	CString m_sTitle;
	LOGFONT m_LogFontTitle;
public:
	virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
	void SetTitle(CString sTitle);
	void SetSel(bool bSel);
	BOOL LoadBitmaps(UINT nIDImageBackDef, UINT nIDImageBackSel);
	BOOL LoadBitmaps(CString sImageBackDef, CString sImageBackSel);
	afx_msg void OnPaint();
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
};

// MyButton.cpp : 实现文件
//

#include "stdafx.h"
#include "MyGdiDemo.h"
#include "MyButton.h"


// CMyButton

IMPLEMENT_DYNAMIC(CMyButton, CButton)

CMyButton::CMyButton()
{
	m_pImageBackDef = NULL;
	m_pImageBackSel = NULL;
	m_nBackWidth = 0;
	m_nBackHeight = 0;
	m_bSel = false;
	m_sTitle = _T("");

	m_LogFontTitle.lfHeight = 32;
	m_LogFontTitle.lfWeight = 600;
	m_LogFontTitle.lfOrientation= 0;
	m_LogFontTitle.lfEscapement = 0;
	m_LogFontTitle.lfWidth = 14;
	m_LogFontTitle.lfItalic = false;
	m_LogFontTitle.lfUnderline = false;
	m_LogFontTitle.lfStrikeOut = false;
	m_LogFontTitle.lfCharSet = GB2312_CHARSET;
	m_LogFontTitle.lfOutPrecision = OUT_DEFAULT_PRECIS;
	m_LogFontTitle.lfClipPrecision = CLIP_DEFAULT_PRECIS;
	m_LogFontTitle.lfQuality = PROOF_QUALITY;
	m_LogFontTitle.lfPitchAndFamily = DEFAULT_PITCH;
	wcscpy_s(m_LogFontTitle.lfFaceName,_T("黑体"));
}

CMyButton::~CMyButton()
{
}


BEGIN_MESSAGE_MAP(CMyButton, CButton)
	ON_WM_PAINT()
	ON_WM_ERASEBKGND()
END_MESSAGE_MAP()



// CMyButton 消息处理程序



void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
	CDC* pDC = CDC::FromHandle(lpDIS->hDC);
	CRect rcClient;
	GetClientRect(&rcClient);


	ASSERT(lpDIS != NULL);
	Image* m_pImageBack = NULL;
	DWORD  color = RGB(0,0,0);
	if(m_bSel)
	{
		if(!m_pImageBackSel)
		{
			return;
		}
		m_pImageBack = m_pImageBackSel;
		color = RGB(244,129,0);

	}
	else
	{
		if(!m_pImageBackDef)
		{
			return;
		}
		m_pImageBack = m_pImageBackDef;
		color = RGB(0,0,0);

	}

	// draw the whole button

	CDC dcMem;
	CBitmap bmpMem;

	dcMem.CreateCompatibleDC(pDC);
	if(bmpMem.CreateCompatibleBitmap(pDC,rcClient.Width(),rcClient.Height()))
	{
		CBitmap* pOldBmp = dcMem.SelectObject(&bmpMem);

		Graphics graph(dcMem.m_hDC);
		Point points[] = { Point(0, 0), 
			Point(m_nBackWidth, 0), 
			Point(0, m_nBackHeight),
		};
		graph.DrawImage(m_pImageBack, points, 3);
		graph.ReleaseHDC(dcMem.m_hDC);


		CRect rect;
		rect.CopyRect(&lpDIS->rcItem);

		HFONT hFont = ::CreateFontIndirect(&m_LogFontTitle);
		HFONT hOldFont = (HFONT)::SelectObject(dcMem.m_hDC,hFont);
		dcMem.SetTextColor(color);//画文字
		dcMem.SetBkMode(TRANSPARENT);
		dcMem.DrawText(m_sTitle,&rect,DT_SINGLELINE|DT_CENTER	|DT_BOTTOM|DT_END_ELLIPSIS);
		hFont = (HFONT)::SelectObject(dcMem.m_hDC,hOldFont);
		::DeleteObject(hFont);


		pDC->BitBlt(0,0,m_nBackWidth,m_nBackHeight,&dcMem,0,0,SRCCOPY);
		dcMem.SelectObject(pOldBmp);
		bmpMem.DeleteObject();
	}
	dcMem.DeleteDC();
}

void CMyButton::SetTitle(CString sTitle)
{
	m_sTitle = sTitle;
}

void CMyButton::SetSel(bool bSel)
{
	if(bSel == m_bSel)
	{
		return;
	}
	m_bSel = bSel;

	RECT rect;
	GetClientRect(&rect);	
	InvalidateRect(&rect,FALSE);
}

BOOL CMyButton::LoadBitmaps(UINT nIDImageBackDef, UINT nIDImageBackSel)
{
	if(m_pImageBackDef)
	{
		delete m_pImageBackDef;
	}
	if(m_pImageBackSel)
	{
		delete m_pImageBackSel;
	}

	ImageFromIDResource(nIDImageBackDef,_T("PNG"),m_pImageBackDef);
	m_nBackWidth  = m_pImageBackDef->GetWidth();
	m_nBackHeight = m_pImageBackDef->GetHeight();

	ImageFromIDResource(nIDImageBackSel,_T("PNG"),m_pImageBackSel);
	m_nBackWidth  = m_pImageBackSel->GetWidth();
	m_nBackHeight = m_pImageBackSel->GetHeight();

	return TRUE;
}

BOOL CMyButton::LoadBitmaps(CString sImageBackDef, CString sImageBackSel)
{
	if(m_pImageBackDef)
	{
		delete m_pImageBackDef;
	}
	if(m_pImageBackSel)
	{
		delete m_pImageBackSel;
	}

	ImageFromIDResource(sImageBackDef,m_pImageBackDef);
	m_nBackWidth  = m_pImageBackDef->GetWidth();
	m_nBackHeight = m_pImageBackDef->GetHeight();

	ImageFromIDResource(sImageBackSel,m_pImageBackSel);
	m_nBackWidth  = m_pImageBackSel->GetWidth();
	m_nBackHeight = m_pImageBackSel->GetHeight();

	return TRUE;
}

void CMyButton::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	// TODO: 在此处添加消息处理程序代码
	// 不为绘图消息调用 CButton::OnPaint()

	Image* m_pImageBack = NULL;
	DWORD  color = RGB(0,0,0);
	if(m_bSel)
	{
		if(!m_pImageBackSel)
		{
			return;
		}
		m_pImageBack = m_pImageBackSel;
		color = RGB(244,129,0);

	}
	else
	{
		if(!m_pImageBackDef)
		{
			return;
		}
		m_pImageBack = m_pImageBackDef;
		color = RGB(0,0,0);

	}

	// draw the whole button
	CRect rcClient;
	GetClientRect(&rcClient);
	CDC dcMem;
	CBitmap bmpMem;
	CDC* pDC = CDC::FromHandle(dc.m_hDC);
	dcMem.CreateCompatibleDC(pDC);
	if(bmpMem.CreateCompatibleBitmap(pDC,rcClient.Width(),rcClient.Height()))
	{
		CBitmap* pOldBmp = dcMem.SelectObject(&bmpMem);

		Graphics graph(dcMem.m_hDC);
		Point points[] = { Point(0, 0), 
			Point(m_nBackWidth, 0), 
			Point(0, m_nBackHeight),
		};
		graph.DrawImage(m_pImageBack, points, 3);
		graph.ReleaseHDC(dcMem.m_hDC);


		CRect rect;
		GetClientRect(&rect);

		HFONT hFont = ::CreateFontIndirect(&m_LogFontTitle);
		HFONT hOldFont = (HFONT)::SelectObject(dcMem.m_hDC,hFont);
		dcMem.SetTextColor(color);//画文字
		dcMem.SetBkMode(TRANSPARENT);
		dcMem.DrawText(m_sTitle,&rect,DT_SINGLELINE|DT_CENTER	|DT_BOTTOM|DT_END_ELLIPSIS);
		hFont = (HFONT)::SelectObject(dcMem.m_hDC,hOldFont);
		::DeleteObject(hFont);


		dc.BitBlt(0,0,m_nBackWidth,m_nBackHeight,&dcMem,0,0,SRCCOPY);
		dcMem.SelectObject(pOldBmp);
		bmpMem.DeleteObject();
	}
	dcMem.DeleteDC();
}

BOOL CMyButton::OnEraseBkgnd(CDC* pDC)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	return TRUE;
	return CButton::OnEraseBkgnd(pDC);
}

CMyButtonStyle

#pragma once


// CMyButtonStyle

class CMyButtonStyle : public CButton
{
	DECLARE_DYNAMIC(CMyButtonStyle)

public:
	CMyButtonStyle();
	virtual ~CMyButtonStyle();

protected:
	DECLARE_MESSAGE_MAP()

private:
	// all bitmaps must be the same size
	Image *m_pImageDef;
	Image *m_pImageSel;
	Image *m_pImageFocus;
	Image *m_pImageDisabled;

	int m_nImageWidth , m_nImageHeight ;

	Image* m_pImageBack;
	int m_nBackWidth , m_nBackHeight;
	RECT m_MyRt;
public:
	virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
	void DrawBackground(HDC hDC, Image* pImage);
	BOOL LoadBitmaps(UINT nIDBitmapResource, UINT nIDBitmapResourceSel, UINT nIDBitmapResourceFocus, UINT nIDBitmapResourceDisabled);
	void SetBtnCfg(Image* pImage, int nWidth, int nHeight, RECT rt);
};

// MyButtonStyle.cpp : 实现文件
//

#include "stdafx.h"
#include "MyGdiDemo.h"
#include "MyButtonStyle.h"


// CMyButtonStyle

IMPLEMENT_DYNAMIC(CMyButtonStyle, CButton)

CMyButtonStyle::CMyButtonStyle()
{
	m_pImageDef = NULL;
	m_pImageSel = NULL;
	m_pImageFocus = NULL;
	m_pImageDisabled = NULL;

	m_pImageBack = NULL;
	m_nBackWidth = 0;
	m_nBackHeight = 0;
}

CMyButtonStyle::~CMyButtonStyle()
{
}


BEGIN_MESSAGE_MAP(CMyButtonStyle, CButton)
END_MESSAGE_MAP()



// CMyButtonStyle 消息处理程序



void CMyButtonStyle::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
	ASSERT(lpDIS != NULL);
	// must have at least the first bitmap loaded before calling DrawItem
	ASSERT(m_pImageDef != NULL);     // required


	// use the main bitmap for up, the selected bitmap for down

	Image *pImage = m_pImageDef;

	UINT state = lpDIS->itemState;
	if ((state & ODS_SELECTED) && m_pImageSel != NULL)
	{
		pImage = m_pImageSel;
	}
	else if ((state & ODS_FOCUS) && m_pImageFocus != NULL)
	{
		pImage = m_pImageFocus;   // third image for focused
	}
	else if ((state & ODS_DISABLED) && m_pImageDisabled != NULL)
	{
		pImage = m_pImageDisabled;   // last image for disabled
	}
	else
	{
		pImage = m_pImageDef;
	}

	CRect rcClient;
	GetClientRect(&rcClient);
	CDC dcMem;
	CBitmap bmpMem;
	CDC* pDC = CDC::FromHandle(lpDIS->hDC);
	dcMem.CreateCompatibleDC(pDC);
	if(bmpMem.CreateCompatibleBitmap(pDC,m_nBackWidth,m_nBackHeight))
	{
		CBitmap* pOldBmp = dcMem.SelectObject(&bmpMem);

		Graphics graph(dcMem.m_hDC);
		Point points[] = { Point(0, 0), 
			Point(m_nBackWidth, 0), 
			Point(0, m_nBackHeight),
		};
		graph.DrawImage(m_pImageBack, points, 3);
		graph.ReleaseHDC(dcMem.m_hDC);


		DrawBackground(dcMem.m_hDC,pImage);



		pDC->BitBlt(0,0,m_MyRt.right-m_MyRt.left,m_MyRt.bottom-m_MyRt.top,&dcMem,m_MyRt.left,m_MyRt.top,SRCCOPY);
		dcMem.SelectObject(pOldBmp);
		bmpMem.DeleteObject();
	}
	dcMem.DeleteDC();
}

void CMyButtonStyle::DrawBackground(HDC hDC, Image* pImage)
{
	RECT rct;
	GetWindowRect(&rct);
	POINT ptWinPos={rct.left,rct.top};
	Graphics graph(hDC);

	Point points[] = { Point(m_MyRt.left, m_MyRt.top), 
		Point(m_MyRt.left+m_nImageWidth, m_MyRt.top), 
		Point(m_MyRt.left, m_MyRt.top+m_nImageHeight),
	};

	graph.DrawImage(pImage, points, 3);
	graph.ReleaseHDC(hDC);
}

BOOL CMyButtonStyle::LoadBitmaps(UINT nIDBitmapResource, UINT nIDBitmapResourceSel, UINT nIDBitmapResourceFocus, UINT nIDBitmapResourceDisabled)
{
	if(m_pImageDef)
	{
		delete m_pImageDef;
	}
	if(m_pImageSel)
	{
		delete m_pImageSel;
	}
	if(m_pImageFocus)
	{
		delete m_pImageFocus;
	}
	if(m_pImageDisabled)
	{
		delete m_pImageDisabled;
	}

	ImageFromIDResource(nIDBitmapResource,_T("PNG"),m_pImageDef);
	m_nImageWidth  = m_pImageDef->GetWidth();
	m_nImageHeight = m_pImageDef->GetHeight();

	ImageFromIDResource(nIDBitmapResourceSel,_T("PNG"),m_pImageSel);
	m_nImageWidth  = m_pImageSel->GetWidth();
	m_nImageHeight = m_pImageSel->GetHeight();

	ImageFromIDResource(nIDBitmapResourceFocus,_T("PNG"),m_pImageFocus);
	m_nImageWidth  = m_pImageFocus->GetWidth();
	m_nImageHeight = m_pImageFocus->GetHeight();

	ImageFromIDResource(nIDBitmapResourceDisabled,_T("PNG"),m_pImageDisabled);
	m_nImageWidth  = m_pImageDisabled->GetWidth();
	m_nImageHeight = m_pImageDisabled->GetHeight();

	return TRUE;
}

void CMyButtonStyle::SetBtnCfg(Image* pImage, int nWidth, int nHeight, RECT rt)
{
	m_pImageBack = pImage;
	m_nBackWidth = nWidth;
	m_nBackHeight = nHeight;
	m_MyRt = rt;
}

3.添加相应的处理函数

// MyGdiDemoDlg.h : 头文件
//

#pragma once
#include "afxwin.h"
#include "MyStatic.h"
#include "MyButton.h"
#include "MyButtonStyle.h"

// CMyGdiDemoDlg 对话框
class CMyGdiDemoDlg : public CDialog
{
// 构造
public:
	CMyGdiDemoDlg(CWnd* pParent = NULL);	// 标准构造函数

// 对话框数据
	enum { IDD = IDD_MYGDIDEMO_DIALOG };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()

private:
	Image *m_pImageBack;
	int m_nBackWidth , m_nBackHeight ;
public:
	CMyStatic m_stcTitle;
	CMyButton m_btn1;
	CMyButton m_btn2;
	CMyButtonStyle m_btn3;
	void MyInitDialog(void);
	void GetResource(void);
	void InitUi(void);
	void MyPaint(void);
	void DrawBackground(HDC hDC);
	afx_msg void OnBnClickedButton1();
	afx_msg void OnBnClickedButton2();
};

void CMyGdiDemoDlg::MyInitDialog(void)
{
	m_pImageBack = NULL;
	m_nBackWidth = 0;
	m_nBackHeight = 0;

	GetResource();
	InitUi();
}

void CMyGdiDemoDlg::GetResource(void)
{
	ImageFromIDResource(IDB_PNG_BACKGROUND,_T("PNG"),m_pImageBack);
	m_nBackWidth  = m_pImageBack->GetWidth();
	m_nBackHeight = m_pImageBack->GetHeight();

	m_btn1.LoadBitmaps(IDB_PNG_BTN_BLUE,IDB_PNG_BTN_RED);
	m_btn2.LoadBitmaps(IDB_PNG_BTN_RIGHT,IDB_PNG_BTN_WRONG);
	m_btn3.LoadBitmaps(IDB_PNG_BTN_STYLE1,IDB_PNG_BTN_STYLE2,IDB_PNG_BTN_STYLE3,IDB_PNG_BTN_STYLE4);

}

void CMyGdiDemoDlg::InitUi(void)
{
	//对话框背景图片宽和高
	const int nBkBmpWidth  = 500;
	const int nBkBmpHeight = 354;
	//获得电脑显示器的像素宽度和像素高度
	int ax = GetDC()->GetDeviceCaps(HORZRES) - nBkBmpWidth; 
	int ay = GetDC()->GetDeviceCaps(VERTRES) - nBkBmpHeight;

	int nWidth = 0;   
	int nHeight = 0;	
	if(ax <= 0)
	{		ax =0;	}
	else
	{		ax = ax/2;	}
	if(ay <=0 )
	{		ay =0;	}
	else
	{		ay = ay/2;	}

	RECT clientRect;
	clientRect.left = ax;
	clientRect.top = ay;
	clientRect.right = clientRect.left + nBkBmpWidth;
	clientRect.bottom = clientRect.top + nBkBmpHeight;
	MoveWindow(&clientRect);

	GetWindowRect(&clientRect);
	ScreenToClient(&clientRect);

	//改变对话框标题静态文本框位置
	int xPos = 0;
	int yPos = 0;

	//对话框标题
	xPos = clientRect.left + 100;
	yPos = clientRect.top + 30;
	m_stcTitle.MoveWindow(xPos,yPos,200,45);

	xPos = clientRect.left + 50;
	yPos = clientRect.top + 150;
	m_btn1.MoveWindow(xPos,yPos,158,59);

	xPos = clientRect.left + 220;
	yPos = clientRect.top + 150;
	m_btn2.MoveWindow(xPos,yPos,100,100);

	xPos = clientRect.left + 330;
	yPos = clientRect.top + 150;
	m_btn3.MoveWindow(xPos,yPos,100,100);

	RECT rect;
	m_btn3.GetWindowRect(&rect);
	ScreenToClient(&rect);
	m_btn3.SetBtnCfg(m_pImageBack,m_nBackWidth,m_nBackHeight,rect);
}

void CMyGdiDemoDlg::MyPaint(void)
{
	CPaintDC dc(this);

	CRect rcClient;
	GetClientRect(&rcClient);

	CDC dcMem;
	CBitmap bmpMem;
	dcMem.CreateCompatibleDC(&dc);
	if(bmpMem.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height()))
	{
		CBitmap* pOldBmp = dcMem.SelectObject(&bmpMem);
		CWnd::DefWindowProc(WM_PAINT,(WPARAM)dcMem.m_hDC,0);

		DrawBackground(dcMem.m_hDC);

		dc.BitBlt(0,0,rcClient.right,rcClient.bottom,&dcMem,0,0,SRCCOPY);
		dcMem.SelectObject(pOldBmp);
		bmpMem.DeleteObject();
	}
	dcMem.DeleteDC();
}

void CMyGdiDemoDlg::DrawBackground(HDC hDC)
{
	RECT rct;
	GetWindowRect(&rct);
	POINT ptWinPos={rct.left,rct.top};
	Graphics graph(hDC);

	Point points[] = { Point(0, 0), 
		Point(m_nBackWidth, 0), 
		Point(0, m_nBackHeight),
	};
	graph.DrawImage(m_pImageBack, points, 3);
	graph.ReleaseHDC(hDC);
}

void CMyGdiDemoDlg::OnBnClickedButton1()
{
	m_btn1.SetSel(true);
	m_btn2.SetSel(false);
}

void CMyGdiDemoDlg::OnBnClickedButton2()
{
	m_btn1.SetSel(false);
	m_btn2.SetSel(true);
}

4.运行效果

运行












  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值