国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【MFC】10.MFC六大機制:RTTI(運行時類型識別),動態(tài)創(chuàng)建機制,窗口切分,子類化-筆記

這篇具有很好參考價值的文章主要介紹了【MFC】10.MFC六大機制:RTTI(運行時類型識別),動態(tài)創(chuàng)建機制,窗口切分,子類化-筆記。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

運行時類信息(RTTI)

C++:

##是拼接

#是替換成字符串

// RTTI.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。
//
#include <iostream>
#include <afxwin.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

CWinApp theApp;

int main()
{
	//CListBox是MFC自帶的控件類
	CListBox* pListBox = new CListBox;
	//GetRuntimeClass方法返回運行時類信息
	CRuntimeClass* pRuntimeClass = pListBox->GetRuntimeClass();
	std::cout << pRuntimeClass->m_lpszClassName << std::endl;

	//運行時類的IsDeriverFrome方法可以判斷該類是否繼承于某類
	if (pRuntimeClass->IsDerivedFrom(RUNTIME_CLASS(CWnd))) {
		std::cout<<"CListBox類繼承于CWnd類"<<std::endl;
	}
	if (pRuntimeClass->IsDerivedFrom(RUNTIME_CLASS(CView))) {
		std::cout << "CListBox類繼承于視圖類" << std::endl;
	}

	//運行時類的m_pfnGetBaseClass方法可以獲取父類的信息
	CRuntimeClass* pParentClass = pRuntimeClass->m_pfnGetBaseClass();
	if (pParentClass->IsDerivedFrom(RUNTIME_CLASS(CWnd))) {
		std::cout << "運行時類的父類繼承于CWnd類" << std::endl;
	}

	//動態(tài)創(chuàng)建一個對象:
	CWnd* pWnd = (CWnd*)pParentClass->m_pfnCreateObject();

	return 0;
}

這是MFC提供的運行時類信息的使用,如果我們自己創(chuàng)建一個類,如果想用這些方法,必須要滿足三個條件:

  • 這個類必須繼承于CObject類
  • 類內(nèi)必須聲明DECLARE_DYNAMIC
  • 類外必須實現(xiàn)IMPLENENT_DYNAMIC

我們來看看是如何實現(xiàn)的:

拆分宏
DECLARE_DYNAMIC(SHape)
public: 
	//靜態(tài)的結(jié)構(gòu)體
	//本來是static const CRuntimeClass class##class_name;,拼接之后:
	static const CRuntimeClass classSHape; 
	//虛函數(shù)
	virtual CRuntimeClass* GetRuntimeClass() const; 

//IMPLEMENT_DYNAMIC(SHape,CObject)
IMPLEMENT_RUNTIMECLASS(SHape, CObject, 0xFFFF, NULL, NULL)

AFX_COMDAT const CRuntimeClass SHape::classSHape = 
{ 
		"SHape", 
		sizeof(class SHape), 
		0xFFFF, 
		NULL, 
		RUNTIME_CLASS(CObject),//返回父類靜態(tài)結(jié)構(gòu)體的地址
		NULL,
		NULL 
}; 

CRuntimeClass* SHape::GetRuntimeClass() const 
{ 
	return RUNTIME_CLASS(SHape);
}


struct CRuntimeClass
{
	LPCSTR m_lpszClassName;					//類名稱
	int m_nObjectSize;						//類大小
	UINT m_wSchema; 						//類版本
	CObject* (PASCAL* m_pfnCreateObject)(); //動態(tài)創(chuàng)建才會使用 暫時NULL函數(shù)指針
	CRuntimeClass* m_pBaseClass;			//父類信息
	CRuntimeClass* m_pNextClass;      		//NULL
	const AFX_CLASSINIT* m_pClassInit;		//NULL
}

#define RUNTIME_CLASS(class_name) _RUNTIME_CLASS(class_name)
((CRuntimeClass*)(&SHape::classSHape))
}

這里給出RTTI的圖,每一個類中都保存了這樣一個結(jié)構(gòu),相當于鏈表,我們有當前的類信息,就可以得到所有父類信息:
【MFC】10.MFC六大機制:RTTI(運行時類型識別),動態(tài)創(chuàng)建機制,窗口切分,子類化-筆記,MFC,mfc,c++,筆記

動態(tài)創(chuàng)建機制

如果想在MFC中實現(xiàn)動態(tài)創(chuàng)建:

  1. 也必須繼承與CObject類
  2. 類內(nèi)聲明DECLARE_DYNCREATE
  3. 類外實現(xiàn)IMPLEMENT_DYNCREATE
class SHape : public CObject
{
public:
	DECLARE_DYNCREATE(SHape)
};
IMPLEMENT_DYNCREATE(SHape,CObject)

class CLine : public SHape
{
public:
	DECLARE_DYNCREATE(CLine)
};
IMPLEMENT_DYNCREATE(CLine, SHape)

需要注意的是,動態(tài)創(chuàng)建宏中包含了動態(tài)信息的宏

使用:

int main()
{

	HMODULE hModule = ::GetModuleHandle(nullptr);
	AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0);

	//定義直線類:
	CLine line;

	//方法內(nèi)部this指針指向line
	//該方法用于判斷是否繼承與某個類
	if (line.IsKindOf(RUNTIME_CLASS(SHape))) {
		std::cout << "是圖形" << std::endl;
	}
	if (line.IsKindOf(RUNTIME_CLASS(CWnd))) {
		std::cout << "是窗口" << std::endl;
	}
	else {
		std::cout << "不是窗口" << std::endl;
	}

	CObject* pLine = RUNTIME_CLASS(CLine)->CreateObject();
	if (pLine->IsKindOf(RUNTIME_CLASS(SHape))) {
		std::cout << "創(chuàng)建成功" << std::endl;
	}

	return 0;
}

動態(tài)創(chuàng)建包括了類信息

//函數(shù)跟蹤
BOOL CObject::IsKindOf(const CRuntimeClass* pClass) const
{
	//拿到鏈表頭節(jié)點
	CRuntimeClass* pClassThis = this->GetRuntimeClass();
	
	pClassThis->IsDerivedFrom(參數(shù)是判斷的結(jié)構(gòu)體地址)
	{
		while (pClassThis != NULL)
		{
			if (pClassThis == 參數(shù))
				return TRUE;

			if (pClassThis->m_pfnGetBaseClass == NULL)
				break;
			//獲取父類靜態(tài)結(jié)構(gòu)體地址
			pClassThis = pClassThis->m_pBaseClass;
		}
	}
	}


#define DECLARE_DYNCREATE(class_name) \
	DECLARE_DYNAMIC(class_name) \
	static CObject* PASCAL CreateObject();
	
CObject* PASCAL CLine::CreateObject() 
		{ 
				return new CLine; 
		} \
	IMPLEMENT_RUNTIMECLASS(CLine, SHape, 0xFFFF, class_name::CreateObject, NULL)

AFX_COMDAT const CRuntimeClass class_name::class##class_name = 
{ 
		"CLine", 
		sizeof(class CLine),
		0xFFFF, 
		pfnNew, 
		RUNTIME_CLASS(base_class_name), 
		NULL,
		class_init 
}; 

視圖分割

CSplitterWnd:專門負責窗口切分

創(chuàng)建對話框,視圖:Create函數(shù)

重載父類框架類的虛函數(shù)CFrandWnd::OnCreateClient,這個函數(shù)專門用于切分

動態(tài)創(chuàng)建:Create函數(shù)

靜態(tài)創(chuàng)建:CreateStatic函數(shù)

  • 靜態(tài)分割(在窗口創(chuàng)建的時候就已經(jīng)分割好了)

    在我們的框架類中:

    class CMyFrameWnd:public CFrameWnd{
    public:
      CSplitterWnd spWnd;
      CSplitterWnd spWnd1;
      virtual BOOL OnCreateClient(LPCREATESTRUCT* lpcs,CCreateContext* pContext){
        spWnd.CreateStatic(this,2,1);
        spWnd1.CreateStatic(this,1,2,WS_CHILD|WS_CISIBLE,IdFromRowCol(0,0));
        
        return true;
      }
      }
    }
    

    我們這樣寫完了之后,發(fā)現(xiàn)運行不起來,這是因為我們只是創(chuàng)建了框架,但是沒有創(chuàng)建視圖

    我們需要給視圖類添加動態(tài)創(chuàng)建機制,我們重新寫代碼:

    //我們自己的視圖類:
    class MyView:public CView{
      DECLARE_DYNREATE(MyView);
      virtual void OnDrow(DCD* pDC){
        
      }
    }
    IMPLEMENT_DYNCREATE(MyView,CView)
    //我們自己的框架窗口類:
    class CMyFrameWnd:public CFrameWnd{
    public:
      CSplitterWnd spWnd;
      CSplitterWnd spWnd1;
      virtual BOOL OnCreateClient(LPCREATESTRUCT* lpcs,CCreateContext* pContext){
        spWnd.CreateStatic(this,2,1);
        spWnd1.CreateStatic(&spWnd,1,2,WS_CHILD|WS_CISIBLE,spWnd,IdFromRowCol(0,0));
        //創(chuàng)建視圖:
        spWnd1.CreateView(0,0,RUNTIME_CLASS(MyVIew),CSize(50,50),pContext);
        spWnd1.CreateView(0,1,RUNTIME_CLASS(CTreeView),CSize(50,50),pContext);
        
        spWnd.CreateView(1,0,RUNTIME_CLASS(CHtmlView),CSize(50,50),pContext);
       
        //設(shè)置行信息:
        spWnd.SetRowInfo(0,200,100);
        //設(shè)置列信息
        spWnd1.SetColumnInfo(0,200,100);
        spWnd1.SetColumnInfo(1,200,100);
        
        CHtmlView* html = (CHtmlView*)spWnd.GetPane(1,0);
        
        html->Navigate(L"e:/");
        return true;
      }
    }
    

    現(xiàn)在我們創(chuàng)建了三個窗口

    這些控件都被MFC接管了,Win32 EDIT處理函數(shù),微軟定義的,

    如果想要處理消息,就要使用Win32子類化(筆記在本篇最后面)

    • 現(xiàn)在我們想處理樹視圖上的消息


    • Create方法:

        virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs,CCreateContext* pContext){
          swWnd.CreateStatic(CWnd* pParentEnd,//分隔器窗口的父框架窗口句柄
          int nRows,//行數(shù),這個值必須不超過16
          int nCols,//列數(shù),這個值必須不超過16
          dwStyle,//指定窗口的風格
          nID//此窗口的ID,如果這個分隔器窗口不是嵌套在另一個分隔器窗口中的,則這個ID可以是AFX_IDW_PANE_FIRSH
          )
      
    • 獲取窗口ID:CSplitterWnd::IdFromRowCol方法:

      int IdFromRowCol(int row,int col);//參數(shù):行數(shù),列數(shù)
      返回值:返回此窗格的子窗口的ID
      
    • 在分隔器中創(chuàng)建一個窗格:CreateVIew方法:

      virtual BOOL CreateView(int row,int col,CRuntimeClass* pVIewClass,SIZE sizeInit,CCreateContext* pCOntext);
      參數(shù):行數(shù),列數(shù),運行時類信息,初始尺寸,用來創(chuàng)建此試圖的創(chuàng)建環(huán)境的指針
      
  • 動態(tài)分隔:

    //我們自己的視圖類:
    class MyView:public CView{
      DECLARE_DYNREATE(MyView);
      virtual void OnDrow(DCD* pDC){
        
      }
    }
    IMPLEMENT_DYNCREATE(MyView,CView)
    //我們自己的框架窗口類:
    class CMyFrameWnd:public CFrameWnd{
    public:
      CSplitterWnd spWnd;
      CSplitterWnd spWnd1;
      virtual BOOL OnCreateClient(LPCREATESTRUCT* lpcs,CCreateContext* pContext){
        CCreateContext Context;
        Context.m_pNewViewClass = RUNTIME_CLASS(MyView);
        spWnd.Create(this,2,2,CSize(50,50),&Context);
        return true;
      }
    }
    
    • 動態(tài)切分,Create方法:
      BOOL CSplitterWnd::Create(
        CWnd* pParentWnd,//分隔器父窗口的句柄
        int nMaxRows,//分隔器窗口的最大行數(shù),這個值不能超過2
        int nMaxCols,//分隔器窗口的最大列數(shù),這個值不能超過2
        SIZE sizeMin,//指出顯示一個窗格所需的最小尺寸
        CCreateCOntext* pContext,//指向一個CCreateContext結(jié)構(gòu)的指針
        DWORD dwStyle = WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|SPLS_DYNAMIC_SPLIT,//窗口風格
        UINT nID = AFX_IDW_PANE_FIRST//此窗口的子窗口ID。如果這個分隔器窗口不是嵌套在另一個分隔器窗口中的,則這個ID可以是AFX_IDW_PANE_FIRST
        )
      

Win32子類化

在win32編輯框,可以設(shè)置屬性,風格,字母不可見,****等

現(xiàn)在有一個需求:只允許輸入小寫字母和數(shù)字

C++中,只要繼承,重寫虛函數(shù),在交給父類處理

在Win32中,添加一個編輯框,和一個按鈕,

添加一個全局變量,保存原來的edit消息處理函數(shù)

WNDPROC OldProc;

然后添加按鈕回調(diào)函數(shù):

LRESULT CALLBACK MyProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam){
  if(uMsg == WM_CHAR){
    if(wParam>='a'&&wParam<='z'||wParam>='0'&&wParam<='9'){
      //交給原來的處理函數(shù)處理
      return OldProc(hDlg,uMsg,wParam,lParam);
    }else{
      return 0;
    }
  }
}

消息處理函數(shù)中:

if(LOWORD(wParam)==IDC_BUTTON1){
  //要先找到窗口句柄:
  HWND hEdit = GetDlgItem(hDlg,IDC_EDIT1);
  //修改原來的過程函數(shù)(原來是操作系統(tǒng)默認的
  //OldProc = (WNDPROC)SetWindowLogn(hEdit,GWL_WNDPROC,(LONG)MyProc);
  //第二種方式,之前創(chuàng)建的編輯框不好使,但是之后創(chuàng)建的對話框,可以使用
  //這個子類化方式實際上是改了類的回調(diào),就是EDIT類的回調(diào),之后創(chuàng)建的EDIt類就好使了
  OldProc = (WNDPROC)SetWindowLogn(hEdit,GCL_WNDPROC,(LONG)MyProc);
}

第二種方式:

再添加一個按鈕

HISRANCE hInst;

消息回調(diào):

if(LPWORD(wParam)==IDC_BUTTON2){
  CreateWindow(L"EDIT","ads",WS_CHILD|WS_VISIBLE,100,100,100,100,hDlg,NULL,hInst);
}

MFC子類化

這里我們把第一個視圖換成一個窗口(對話框)

  1. 創(chuàng)建一個對話框
  2. 為該對話框添加一個類:CMyFormView
  3. 主cpp中,包含剛才添加的類的頭文件
  4. 然后把第一個改為我們創(chuàng)建的類
    //我們自己的視圖類:
    class MyView:public CView{
      DECLARE_DYNREATE(MyView);
      virtual void OnDrow(DCD* pDC){
        
      }
    }
    IMPLEMENT_DYNCREATE(MyView,CView)
    //我們自己的框架窗口類:
    class CMyFrameWnd:public CFrameWnd{
    public:
      CSplitterWnd spWnd;
      CSplitterWnd spWnd1;
      virtual BOOL OnCreateClient(LPCREATESTRUCT* lpcs,CCreateContext* pContext){
        spWnd.CreateStatic(this,2,1);
        spWnd1.CreateStatic(&spWnd,1,2,WS_CHILD|WS_CISIBLE,spWnd,IdFromRowCol(0,0));
        //創(chuàng)建視圖:
        spWnd1.CreateView(0,0,RUNTIME_CLASS(MyFormView),CSize(50,50),pContext);
        spWnd1.CreateView(0,1,RUNTIME_CLASS(CTreeView),CSize(50,50),pContext);
        
        spWnd.CreateView(1,0,RUNTIME_CLASS(CHtmlView),CSize(50,50),pContext);
       
        //設(shè)置行信息:
        spWnd.SetRowInfo(0,200,100);
        //設(shè)置列信息
        spWnd1.SetColumnInfo(0,200,100);
        spWnd1.SetColumnInfo(1,200,100);
        
        CHtmlView* html = (CHtmlView*)spWnd.GetPane(1,0);
        
        html->Navigate(L"e:/");
        return true;
      }
    }
    
  5. 需要把我們創(chuàng)建的對話框修改為子窗口類,否則會報錯
  • DDX/DDV虛函數(shù):

    就是空間綁定變量/數(shù)據(jù),調(diào)用UpdataTA(),交互數(shù)據(jù)用

    控件綁定變量

    值綁定變量文章來源地址http://www.zghlxwxcb.cn/news/detail-644777.html

到了這里,關(guān)于【MFC】10.MFC六大機制:RTTI(運行時類型識別),動態(tài)創(chuàng)建機制,窗口切分,子類化-筆記的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 微軟MFC技術(shù)運行機制

    微軟MFC技術(shù)運行機制

    我是荔園微風,作為一名在IT界整整25年的老兵,今天總結(jié)一下微軟MFC技術(shù)運行機制。 很多初學者誤以為VC++開發(fā)必須使用MFC,其實不一定的。MFC的使用只能是提高程序在某些情況下的開發(fā)效率,而不能替代整個Win32程序設(shè)計。我認為我們有必要再來好好講講MFC的本質(zhì)、MFC中的

    2024年02月08日
    瀏覽(19)
  • MFC動態(tài)創(chuàng)建控件與建立消息響應(yīng)

    以動態(tài)創(chuàng)建按鈕為例,新建MFC工程 在解決方案管理器,Resource.h中編輯,添加一個IDC_BUTTON0的資源ID

    2024年02月14日
    瀏覽(18)
  • MFC第二十九天 CView類的分支(以及其派生類的功能)、MFC六大關(guān)鍵技術(shù)

    MFC第二十九天 CView類的分支(以及其派生類的功能)、MFC六大關(guān)鍵技術(shù)

    對CMainView使用了CEditView類的派生,對其默認字體進行改變。 需要添加#include afxhtml.h頭文件 MainFrm.h CMainFrame 類的接口 CMainView .h a)CListCtrl的內(nèi)部創(chuàng)建原理是通過CWnd::Create(sClassName,…)來實現(xiàn)的。 b)CStatic,CEdit,CButton的內(nèi)部創(chuàng)建原理無一不是這個原理,即使是拖入對話框的控件底層也

    2024年02月13日
    瀏覽(23)
  • C++編譯與運行:其一、靜態(tài)類型和動態(tài)類型

    先說結(jié)論:編譯期間可以明確的類型是靜態(tài)類型;運行期間才能明確的類型是動態(tài)類型。 后半句可能有點不好理解,通俗地說,需要通過執(zhí)行代碼才能明確的類型是動態(tài)類型。 假如我們有兩個類,分別是基類A,和派生類B。 第一行,編譯的時候編譯器就知道了,a的類型是

    2024年02月08日
    瀏覽(20)
  • 【STM32&RT-Thread零基礎(chǔ)入門】 7. 線程創(chuàng)建應(yīng)用(多線程運行機制)

    【STM32&RT-Thread零基礎(chǔ)入門】 7. 線程創(chuàng)建應(yīng)用(多線程運行機制)

    硬件:STM32F103ZET6、ST-LINK、usb轉(zhuǎn)串口工具、4個LED燈、1個蜂鳴器、4個1k電阻、2個按鍵、面包板、杜邦線 本章進一步研究多線程的運行機制。要求實現(xiàn)功能如下:創(chuàng)建2個線程,線程名稱分別為LED和BEEP。兩個線程的任務(wù)是連續(xù)5次打印本線程的名字后退出線程(注意:線程不執(zhí)行

    2024年02月03日
    瀏覽(30)
  • 10. unity預(yù)制體、動態(tài)創(chuàng)建實體案例

    10. unity預(yù)制體、動態(tài)創(chuàng)建實體案例

    1. 預(yù)制體 預(yù)制體 Prefab 就是事先制作好的物體,可以提高開發(fā)效率。 1.1 預(yù)制體的制作 第一步 :在界面編輯器中先創(chuàng)建一個三維模型,比如創(chuàng)建一個正方體,命名為“骰子”,然后給它添加一個材質(zhì),再掛載一個旋轉(zhuǎn)的腳本,如圖所示: 第二步 :經(jīng)過上述步驟制作好模型后

    2024年02月05日
    瀏覽(21)
  • Tomcat的介紹和安裝配置、eclipse中動態(tài)web項目的創(chuàng)建和運行、使用IDEA創(chuàng)建web項目并運行

    Tomcat的介紹和安裝配置、eclipse中動態(tài)web項目的創(chuàng)建和運行、使用IDEA創(chuàng)建web項目并運行

    一、Tomcat的介紹和安裝配置 安裝tomcat: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 環(huán)境變量的配置: 配置之后重啟cmd,執(zhí)行startup命令,啟動tomcat 在localhost:8080,能進入tomcat主界面,說明配置成功 二、eclipse中動態(tài)web項目的創(chuàng)建和運行 tomcat可以在面板上配,可以去windows中pr

    2024年02月14日
    瀏覽(41)
  • Qt+opencv 鼠標畫線實現(xiàn)幾何圖形識別并動態(tài)創(chuàng)建

    Qt+opencv 鼠標畫線實現(xiàn)幾何圖形識別并動態(tài)創(chuàng)建

    使用Qt + OpenCV實現(xiàn),通過鼠標畫線繪制幾何圖形,然后通過opencv進行圖形輪廓識別,返回圖形頂點,然后創(chuàng)建對應(yīng)的幾何圖形添加到場景中。繪制使用QGraphics體系完成。 看效果圖: 本文demo在這里 點擊下載 環(huán)境: Qt5.15.2 + vs2019 64bit 支持圖形:直線、圓、橢圓、矩形、三角形。

    2024年02月10日
    瀏覽(159)
  • 【MFC】05.MFC第一大機制:程序啟動機制-筆記

    【MFC】05.MFC第一大機制:程序啟動機制-筆記

    MFC程序開發(fā)所謂是非常簡單,但是對于我們逆向人員來說,如果想要逆向MFC程序,那么我們就必須了解它背后的機制,這樣我們才能夠清晰地逆向出MFC程序,今天這篇文章就來帶領(lǐng)大家了解MFC的第一大機制:程序啟動機制: 首先,我們創(chuàng)建一個單文檔架構(gòu)程序,我們來觀察一

    2024年02月14日
    瀏覽(18)
  • 環(huán)境配置 | win10上配置Docker,創(chuàng)建容器并運行【圖文詳解】

    環(huán)境配置 | win10上配置Docker,創(chuàng)建容器并運行【圖文詳解】

    本文利用圖文,詳解了在win10上如何配置Docker,創(chuàng)建容器并運行,超簡單版~ 電腦環(huán)境:windows10家庭版 一定要確認好版本:查看自己的電腦版本,以下操作win10家庭版和專業(yè)版都可以。 點擊右側(cè)的getDocker 即可,可以看到按鈕上面對操作系統(tǒng)的要求為win10專業(yè)版 或企業(yè)版64位,

    2024年02月07日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包