zoukankan      html  css  js  c++  java
  • 俄罗斯方块SDK版

    前言

    本来可以从俄罗斯方块控制台版改一版, 将UI接口换掉, 变成SDK版.

    正好放假了, 有时间.

    就用了一个星期来重头做一个新版, 享受一下静下心来, 有条不紊干活的感觉^_^

    这个工程用来验证SDK编程中对消息循环, UI绘制, 局部刷新的理解.

    做这么个东西, 以自己为用户, 玩起来还是挺耐玩.

    完全靠4个箭头键实现左移, 右移, 旋转, 下落, 消行或固定

    考虑到自己智商比较挫, 没有加自动落下的实现. 毕竟每个人都不喜欢输的感觉.

    如果真是全心投入, 如果输了, 应该能总结出输的原因 : "做人心不能贪, 不能眼高手低, 如果有问题, 要立即解决, 不要指望时来运转".

    反正输了之后, 能总结的失败原因能总结出来一堆.

    正宗方块的资料

    UI预览

    工程下载

    vc6sp6 + win7x64
    工程下载点:俄罗斯方块SDK版

    工程预览

    4格骨牌数据,没有搞成内建数据类型的数组,封装成了类的数组, 如果要加入新的异形骨牌,容易维护.
    我觉得这个数组比上次做的好, 增加再多的数据,也不会显的乱.
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. CTetrominoData m_TetrominoData[TETROMINODATA_ARY_SIZE];  
     
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. void CRussiaBlock::TetrominoDataInit() {  
    2.     /// I型(方向0,90,180,270)  
    3.     m_TetrominoData[0] = CTetrominoDataI0();  
    4.     m_TetrominoData[1] = CTetrominoDataI90();  
    5.     m_TetrominoData[2] = CTetrominoDataI180();  
    6.     m_TetrominoData[3] = CTetrominoDataI270();  
    7.       
    8.     m_TetrominoData[0].SetRotateL(&m_TetrominoData[3]);  
    9.     m_TetrominoData[0].SetRotateR(&m_TetrominoData[1]);  
    10.       
    11.     m_TetrominoData[1].SetRotateL(&m_TetrominoData[0]);  
    12.     m_TetrominoData[1].SetRotateR(&m_TetrominoData[2]);  
    13.       
    14.     m_TetrominoData[2].SetRotateL(&m_TetrominoData[1]);  
    15.     m_TetrominoData[2].SetRotateR(&m_TetrominoData[3]);  
    16.       
    17.     m_TetrominoData[3].SetRotateL(&m_TetrominoData[2]);  
    18.     m_TetrominoData[3].SetRotateR(&m_TetrominoData[0]);  
    19.   
    20.     /// O型(方向0,90,180,270)  
    21.     m_TetrominoData[4] = CTetrominoDataO0();  
    22.     m_TetrominoData[5] = CTetrominoDataO90();  
    23.     m_TetrominoData[6] = CTetrominoDataO180();  
    24.     m_TetrominoData[7] = CTetrominoDataO270();  
    25.       
    26.     m_TetrominoData[4].SetRotateL(&m_TetrominoData[7]);  
    27.     m_TetrominoData[4].SetRotateR(&m_TetrominoData[5]);  
    28.       
    29.     m_TetrominoData[5].SetRotateL(&m_TetrominoData[4]);  
    30.     m_TetrominoData[5].SetRotateR(&m_TetrominoData[6]);  
    31.       
    32.     m_TetrominoData[6].SetRotateL(&m_TetrominoData[4]);  
    33.     m_TetrominoData[6].SetRotateR(&m_TetrominoData[7]);  
    34.       
    35.     m_TetrominoData[7].SetRotateL(&m_TetrominoData[6]);  
    36.     m_TetrominoData[7].SetRotateR(&m_TetrominoData[4]);  
    37.       
    38.     /// T型(方向0,90,180,270)  
    39.     m_TetrominoData[8] = CTetrominoDataT0();  
    40.     m_TetrominoData[9] = CTetrominoDataT90();  
    41.     m_TetrominoData[10] = CTetrominoDataT180();  
    42.     m_TetrominoData[11] = CTetrominoDataT270();  
    43.       
    44.     m_TetrominoData[8].SetRotateL(&m_TetrominoData[11]);  
    45.     m_TetrominoData[8].SetRotateR(&m_TetrominoData[9]);  
    46.       
    47.     m_TetrominoData[9].SetRotateL(&m_TetrominoData[8]);  
    48.     m_TetrominoData[9].SetRotateR(&m_TetrominoData[10]);  
    49.       
    50.     m_TetrominoData[10].SetRotateL(&m_TetrominoData[9]);  
    51.     m_TetrominoData[10].SetRotateR(&m_TetrominoData[11]);  
    52.       
    53.     m_TetrominoData[11].SetRotateL(&m_TetrominoData[10]);  
    54.     m_TetrominoData[11].SetRotateR(&m_TetrominoData[8]);  
    55.   
    56.     /// J型(方向0,90,180,270)  
    57.     m_TetrominoData[12] = CTetrominoDataJ0();  
    58.     m_TetrominoData[13] = CTetrominoDataJ90();  
    59.     m_TetrominoData[14] = CTetrominoDataJ180();  
    60.     m_TetrominoData[15] = CTetrominoDataJ270();  
    61.       
    62.     m_TetrominoData[12].SetRotateL(&m_TetrominoData[15]);  
    63.     m_TetrominoData[12].SetRotateR(&m_TetrominoData[13]);  
    64.       
    65.     m_TetrominoData[13].SetRotateL(&m_TetrominoData[12]);  
    66.     m_TetrominoData[13].SetRotateR(&m_TetrominoData[14]);  
    67.       
    68.     m_TetrominoData[14].SetRotateL(&m_TetrominoData[13]);  
    69.     m_TetrominoData[14].SetRotateR(&m_TetrominoData[15]);  
    70.       
    71.     m_TetrominoData[15].SetRotateL(&m_TetrominoData[14]);  
    72.     m_TetrominoData[15].SetRotateR(&m_TetrominoData[12]);  
    73.   
    74.     /// L型(方向0,90,180,270)  
    75.     m_TetrominoData[16] = CTetrominoDataL0();  
    76.     m_TetrominoData[17] = CTetrominoDataL90();  
    77.     m_TetrominoData[18] = CTetrominoDataL180();  
    78.     m_TetrominoData[19] = CTetrominoDataL270();  
    79.       
    80.     m_TetrominoData[16].SetRotateL(&m_TetrominoData[19]);  
    81.     m_TetrominoData[16].SetRotateR(&m_TetrominoData[17]);  
    82.       
    83.     m_TetrominoData[17].SetRotateL(&m_TetrominoData[16]);  
    84.     m_TetrominoData[17].SetRotateR(&m_TetrominoData[18]);  
    85.       
    86.     m_TetrominoData[18].SetRotateL(&m_TetrominoData[17]);  
    87.     m_TetrominoData[18].SetRotateR(&m_TetrominoData[19]);  
    88.       
    89.     m_TetrominoData[19].SetRotateL(&m_TetrominoData[18]);  
    90.     m_TetrominoData[19].SetRotateR(&m_TetrominoData[16]);  
    91.   
    92.     /// S型(方向0,90,180,270)  
    93.     m_TetrominoData[20] = CTetrominoDataS0();  
    94.     m_TetrominoData[21] = CTetrominoDataS90();  
    95.     m_TetrominoData[22] = CTetrominoDataS180();  
    96.     m_TetrominoData[23] = CTetrominoDataS270();  
    97.       
    98.     m_TetrominoData[20].SetRotateL(&m_TetrominoData[23]);  
    99.     m_TetrominoData[20].SetRotateR(&m_TetrominoData[21]);  
    100.       
    101.     m_TetrominoData[21].SetRotateL(&m_TetrominoData[20]);  
    102.     m_TetrominoData[21].SetRotateR(&m_TetrominoData[22]);  
    103.       
    104.     m_TetrominoData[22].SetRotateL(&m_TetrominoData[21]);  
    105.     m_TetrominoData[22].SetRotateR(&m_TetrominoData[23]);  
    106.       
    107.     m_TetrominoData[23].SetRotateL(&m_TetrominoData[22]);  
    108.     m_TetrominoData[23].SetRotateR(&m_TetrominoData[20]);  
    109.   
    110.     /// Z型(方向0,90,180,270)  
    111.     m_TetrominoData[24] = CTetrominoDataZ0();  
    112.     m_TetrominoData[25] = CTetrominoDataZ90();  
    113.     m_TetrominoData[26] = CTetrominoDataZ180();  
    114.     m_TetrominoData[27] = CTetrominoDataZ270();  
    115.       
    116.     m_TetrominoData[24].SetRotateL(&m_TetrominoData[27]);  
    117.     m_TetrominoData[24].SetRotateR(&m_TetrominoData[25]);  
    118.       
    119.     m_TetrominoData[25].SetRotateL(&m_TetrominoData[24]);  
    120.     m_TetrominoData[25].SetRotateR(&m_TetrominoData[26]);  
    121.       
    122.     m_TetrominoData[26].SetRotateL(&m_TetrominoData[25]);  
    123.     m_TetrominoData[26].SetRotateR(&m_TetrominoData[27]);  
    124.       
    125.     m_TetrominoData[27].SetRotateL(&m_TetrominoData[26]);  
    126.     m_TetrominoData[27].SetRotateR(&m_TetrominoData[24]);  
    127. }  

    骨牌数据类
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. // TetrominoData.h: interface for the CTetrominoData class.  
    2. //  
    3. //////////////////////////////////////////////////////////////////////  
    4.   
    5. #if !defined(AFX_TETROMINODATA_H__B5414B4A_2708_4A07_AD1D_7AAB52962115__INCLUDED_)  
    6. #define AFX_TETROMINODATA_H__B5414B4A_2708_4A07_AD1D_7AAB52962115__INCLUDED_  
    7.   
    8. #if _MSC_VER > 1000  
    9. #pragma once  
    10. #endif // _MSC_VER > 1000  
    11.   
    12. #include "common.h"  
    13.   
    14. class CTetrominoData    
    15. {  
    16. public:  
    17.     CTetrominoData();  
    18.     virtual ~CTetrominoData();  
    19.   
    20.     void SetColor(COLORREF color) {m_color = color;}  
    21.     COLORREF GetColor() {return m_color;}  
    22.   
    23.     void SetData(BYTE uc0, BYTE uc1, BYTE uc2, BYTE uc3,   
    24.         BYTE uc4, BYTE uc5, BYTE uc6, BYTE uc7,  
    25.         BYTE uc8, BYTE uc9, BYTE uc10, BYTE uc11,   
    26.         BYTE uc12, BYTE uc13, BYTE uc14, BYTE uc15);  
    27.     BYTE operator [](int iIndex);  
    28.   
    29.     void SetRotateL(CTetrominoData* pIn) {m_RotateL = pIn;}  
    30.     void SetRotateR(CTetrominoData* pIn) {m_RotateR = pIn;}  
    31.   
    32.     CTetrominoData* GetRotateL() {return m_RotateL;}  
    33.     CTetrominoData* GetRotateR() {return m_RotateR;}  
    34.     int GetDataRows(); ///< 得到数据行数, 从左上角到最下面的有数据的行数  
    35.     int GetDataCols(); ///< 得到数据列数, 从左上角到最右面的有数据的列数  
    36.   
    37. private:  
    38.     COLORREF m_color;  
    39.     BYTE m_ucData[16];  
    40.   
    41.     CTetrominoData* m_RotateL; ///< 向左转是哪个骨牌  
    42.     CTetrominoData* m_RotateR; ///< 向右转是哪个骨牌  
    43. };  
    44.   
    45. #endif // !defined(AFX_TETROMINODATA_H__B5414B4A_2708_4A07_AD1D_7AAB52962115__INCLUDED_)  

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. // TetrominoData.cpp: implementation of the CTetrominoData class.  
    2. //  
    3. //////////////////////////////////////////////////////////////////////  
    4.   
    5. #include "TetrominoData.h"  
    6.   
    7. //////////////////////////////////////////////////////////////////////  
    8. // Construction/Destruction  
    9. //////////////////////////////////////////////////////////////////////  
    10.   
    11. CTetrominoData::CTetrominoData()  
    12. {  
    13.     ZeroMemory(m_ucData, (sizeof(m_ucData) / sizeof(m_ucData[0])));  
    14.     m_color = RGB(0, 0, 0);  
    15. }  
    16.   
    17. CTetrominoData::~CTetrominoData()  
    18. {  
    19.   
    20. }  
    21.   
    22. void CTetrominoData::SetData(BYTE uc0, BYTE uc1, BYTE uc2, BYTE uc3,   
    23.                              BYTE uc4, BYTE uc5, BYTE uc6, BYTE uc7,  
    24.                              BYTE uc8, BYTE uc9, BYTE uc10, BYTE uc11,   
    25.                              BYTE uc12, BYTE uc13, BYTE uc14, BYTE uc15) {  
    26.     m_ucData[0] = uc0;  
    27.     m_ucData[1] = uc1;  
    28.     m_ucData[2] = uc2;  
    29.     m_ucData[3] = uc3;  
    30.   
    31.     m_ucData[4] = uc4;  
    32.     m_ucData[5] = uc5;  
    33.     m_ucData[6] = uc6;  
    34.     m_ucData[7] = uc7;  
    35.   
    36.     m_ucData[8] = uc8;  
    37.     m_ucData[9] = uc9;  
    38.     m_ucData[10] = uc10;  
    39.     m_ucData[11] = uc11;  
    40.   
    41.     m_ucData[12] = uc12;  
    42.     m_ucData[13] = uc13;  
    43.     m_ucData[14] = uc14;  
    44.     m_ucData[15] = uc15;  
    45. }  
    46.   
    47. int CTetrominoData::GetDataRows() {  
    48.     if ((0 != m_ucData[12])  
    49.         || (0 != m_ucData[13])  
    50.         || (0 != m_ucData[14])  
    51.         || (0 != m_ucData[15])) {  
    52.         return 4;  
    53.     } else if ((0 != m_ucData[8])  
    54.         || (0 != m_ucData[9])  
    55.         || (0 != m_ucData[10])  
    56.         || (0 != m_ucData[11])) {  
    57.         return 3;  
    58.     } else if ((0 != m_ucData[4])  
    59.                || (0 != m_ucData[5])  
    60.                || (0 != m_ucData[6])  
    61.                || (0 != m_ucData[7])) {  
    62.         return 2;  
    63.     } else if ((0 != m_ucData[3])  
    64.                || (0 != m_ucData[2])  
    65.                || (0 != m_ucData[1])  
    66.                || (0 != m_ucData[0])) {  
    67.         return 1;  
    68.     }  
    69.   
    70.     return 0;  
    71. }  
    72.   
    73. int CTetrominoData::GetDataCols() {  
    74.     if ((0 != m_ucData[3])  
    75.         || (0 != m_ucData[7])  
    76.         || (0 != m_ucData[11])  
    77.         || (0 != m_ucData[15])) {  
    78.         return 4;  
    79.     } else if ((0 != m_ucData[2])  
    80.         || (0 != m_ucData[6])  
    81.         || (0 != m_ucData[10])  
    82.         || (0 != m_ucData[14])) {  
    83.         return 3;  
    84.     } else if ((0 != m_ucData[1])  
    85.         || (0 != m_ucData[5])  
    86.         || (0 != m_ucData[9])  
    87.         || (0 != m_ucData[13])) {  
    88.         return 2;  
    89.     } else if ((0 != m_ucData[0])  
    90.         || (0 != m_ucData[4])  
    91.         || (0 != m_ucData[8])  
    92.         || (0 != m_ucData[12])) {  
    93.         return 1;  
    94.     }  
    95.       
    96.     return 0;  
    97. }  
    98.   
    99. BYTE CTetrominoData::operator [](int iIndex) {  
    100.     BOOL bValid = (iIndex >= 0) && (iIndex < (sizeof(m_ucData) / sizeof(m_ucData[0])));  
    101.     return bValid ? m_ucData[iIndex] : m_ucData[0];  
    102. }  

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. // TetrominoDataS0.h: interface for the CTetrominoDataS0 class.  
    2. //  
    3. //////////////////////////////////////////////////////////////////////  
    4.   
    5. #if !defined(AFX_TetrominoDataS0_H__D23B94A8_C1F2_44A4_9ACD_2B934A82F86A__INCLUDED_)  
    6. #define AFX_TetrominoDataS0_H__D23B94A8_C1F2_44A4_9ACD_2B934A82F86A__INCLUDED_  
    7.   
    8. #if _MSC_VER > 1000  
    9. #pragma once  
    10. #endif // _MSC_VER > 1000  
    11.   
    12. #include "TetrominoData.h"  
    13.   
    14. class CTetrominoDataS0 : public CTetrominoData    
    15. {  
    16. public:  
    17.     CTetrominoDataS0();  
    18.     virtual ~CTetrominoDataS0();  
    19.   
    20. };  
    21.   
    22. #endif // !defined(AFX_TetrominoDataS0_H__D23B94A8_C1F2_44A4_9ACD_2B934A82F86A__INCLUDED_)  
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. // TetrominoDataS90.h: interface for the CTetrominoDataS90 class.  
    2. //  
    3. //////////////////////////////////////////////////////////////////////  
    4.   
    5. #if !defined(AFX_TetrominoDataS90_H__4157546E_E5CA_4624_B8A5_63AE11EBCD5C__INCLUDED_)  
    6. #define AFX_TetrominoDataS90_H__4157546E_E5CA_4624_B8A5_63AE11EBCD5C__INCLUDED_  
    7.   
    8. #if _MSC_VER > 1000  
    9. #pragma once  
    10. #endif // _MSC_VER > 1000  
    11.   
    12. #include "TetrominoDataS0.h"  
    13.   
    14. class CTetrominoDataS90 : public CTetrominoDataS0    
    15. {  
    16. public:  
    17.     CTetrominoDataS90();  
    18.     virtual ~CTetrominoDataS90();  
    19.   
    20. };  
    21.   
    22. #endif // !defined(AFX_TetrominoDataS90_H__4157546E_E5CA_4624_B8A5_63AE11EBCD5C__INCLUDED_)  
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. // TetrominoDataS180.h: interface for the CTetrominoDataS180 class.  
    2. //  
    3. //////////////////////////////////////////////////////////////////////  
    4.   
    5. #if !defined(AFX_TetrominoDataS180_H__FC5200AC_B7CC_4291_AE86_3C2E983BD4C9__INCLUDED_)  
    6. #define AFX_TetrominoDataS180_H__FC5200AC_B7CC_4291_AE86_3C2E983BD4C9__INCLUDED_  
    7.   
    8. #if _MSC_VER > 1000  
    9. #pragma once  
    10. #endif // _MSC_VER > 1000  
    11.   
    12. #include "TetrominoDataS0.h"  
    13.   
    14. class CTetrominoDataS180 : public CTetrominoDataS0    
    15. {  
    16. public:  
    17.     CTetrominoDataS180();  
    18.     virtual ~CTetrominoDataS180();  
    19.   
    20. };  
    21.   
    22. #endif // !defined(AFX_TetrominoDataS180_H__FC5200AC_B7CC_4291_AE86_3C2E983BD4C9__INCLUDED_)  
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. // TetrominoDataS270.h: interface for the CTetrominoDataS270 class.  
    2. //  
    3. //////////////////////////////////////////////////////////////////////  
    4.   
    5. #if !defined(AFX_TetrominoDataS270_H__4DDC72B7_219B_4E7B_8573_EA98D82CD754__INCLUDED_)  
    6. #define AFX_TetrominoDataS270_H__4DDC72B7_219B_4E7B_8573_EA98D82CD754__INCLUDED_  
    7.   
    8. #if _MSC_VER > 1000  
    9. #pragma once  
    10. #endif // _MSC_VER > 1000  
    11.   
    12. #include "TetrominoDataS90.h"  
    13.   
    14. class CTetrominoDataS270 : public CTetrominoDataS90    
    15. {  
    16. public:  
    17.     CTetrominoDataS270();  
    18.     virtual ~CTetrominoDataS270();  
    19.   
    20. };  
    21.   
    22. #endif // !defined(AFX_TetrominoDataS270_H__4DDC72B7_219B_4E7B_8573_EA98D82CD754__INCLUDED_)  

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. // TetrominoDataS0.cpp: implementation of the CTetrominoDataS0 class.  
    2. //  
    3. //////////////////////////////////////////////////////////////////////  
    4.   
    5. #include "TetrominoDataS0.h"  
    6.   
    7. //////////////////////////////////////////////////////////////////////  
    8. // Construction/Destruction  
    9. //////////////////////////////////////////////////////////////////////  
    10.   
    11. CTetrominoDataS0::CTetrominoDataS0()  
    12. {  
    13.     SetColor(RGB(10, 249, 10));  
    14.     SetData(  
    15.         0, 1, 1, 0,  
    16.         1, 1, 0, 0,  
    17.         0, 0, 0, 0,  
    18.         0, 0, 0, 0);  
    19. }  
    20.   
    21. CTetrominoDataS0::~CTetrominoDataS0()  
    22. {  
    23.   
    24. }  

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. // TetrominoDataS90.cpp: implementation of the CTetrominoDataS90 class.  
    2. //  
    3. //////////////////////////////////////////////////////////////////////  
    4.   
    5. #include "TetrominoDataS90.h"  
    6.   
    7. //////////////////////////////////////////////////////////////////////  
    8. // Construction/Destruction  
    9. //////////////////////////////////////////////////////////////////////  
    10.   
    11. CTetrominoDataS90::CTetrominoDataS90()  
    12. {  
    13.     SetData(  
    14.         1, 0, 0, 0,  
    15.         1, 1, 0, 0,  
    16.         0, 1, 0, 0,  
    17.         0, 0, 0, 0);  
    18. }  
    19.   
    20. CTetrominoDataS90::~CTetrominoDataS90()  
    21. {  
    22.   
    23. }  

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. // TetrominoDataS180.cpp: implementation of the CTetrominoDataS180 class.  
    2. //  
    3. //////////////////////////////////////////////////////////////////////  
    4.   
    5. #include "TetrominoDataS180.h"  
    6.   
    7. //////////////////////////////////////////////////////////////////////  
    8. // Construction/Destruction  
    9. //////////////////////////////////////////////////////////////////////  
    10.   
    11. CTetrominoDataS180::CTetrominoDataS180()  
    12. {  
    13.     SetData(  
    14.         0, 1, 1, 0,  
    15.         1, 1, 0, 0,  
    16.         0, 0, 0, 0,  
    17.         0, 0, 0, 0);  
    18. }  
    19.   
    20. CTetrominoDataS180::~CTetrominoDataS180()  
    21. {  
    22.   
    23. }  
    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. // TetrominoDataS270.cpp: implementation of the CTetrominoDataS270 class.  
    2. //  
    3. //////////////////////////////////////////////////////////////////////  
    4.   
    5. #include "TetrominoDataS270.h"  
    6.   
    7. //////////////////////////////////////////////////////////////////////  
    8. // Construction/Destruction  
    9. //////////////////////////////////////////////////////////////////////  
    10.   
    11. CTetrominoDataS270::CTetrominoDataS270()  
    12. {  
    13.     SetData(  
    14.         1, 0, 0, 0,  
    15.         1, 1, 0, 0,  
    16.         0, 1, 0, 0,  
    17.         0, 0, 0, 0);  
    18. }  
    19.   
    20. CTetrominoDataS270::~CTetrominoDataS270()  
    21. {  
    22.   
    23. }  

    http://blog.csdn.net/lostspeed/article/details/50643208

  • 相关阅读:
    Getting Started with MongoDB (MongoDB Shell Edition)
    Ioc
    BsonDocument
    Find or Query Data with C# Driver
    Insert Data with C# Driver
    Connect to MongoDB
    What's the difference between returning void and returning a Task?
    Import Example Dataset
    jQuery来源学习笔记:整体结构
    Word文件交换的电脑打开字体、排版变化的原因和解决方法!
  • 原文地址:https://www.cnblogs.com/findumars/p/5187264.html
Copyright © 2011-2022 走看看