专职C++

不能停止的脚步

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  159 Posts :: 7 Stories :: 135 Comments :: 0 Trackbacks

常用链接

留言簿(13)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

#

今天无意先用google找一下自己的文章,正常,然后用百度的找,结果就看到了这个剽窃者:看引擎(http://www.kankanews.com/ICkengine/categories/program),完全无视cppblog作者的版权和辛苦成果。
不反对转载文章,但是最鄙视那么把文章拿过去后,说是自己的原创。我看了一下,他是用工作把cppblog上面的文章,全部复制过去,然后换成自己的名子,并写上原创。
下面附两张截图。希望剽窃者立刻删除剽窃的文章,或要注意原作者是谁,还有文章来源。


posted @ 2014-05-10 12:15 冬瓜 阅读(1424) | 评论 (2)编辑 收藏

对应的CentOS 6.x也就可能使用!
下载地址:
第一步:安装
wget http://www.balabit.com/downloads/files/syslog-ng/open-source-edition/3.5.4.1/source/syslog-ng_3.5.4.1.tar.gz
wget http://www.balabit.com/downloads/files/syslog-ng/open-source-edition/3.5.4.1/source/eventlog_0.2.12%2B20120504%2B1700.tar.gz
tar xvf eventlog_0.2.12+20120504+1700.tar.gz 
cd eventlog-0.2.12+20120504+1700
./configure --prefix=/usr/local/services/eventlog 
make 
make install 
cd ..
tar -xvf syslog-ng_3.5.4.1.tar.gz 
cd syslog-ng-3.5.4.1/
export PKG_CONFIG_PATH=/usr/local/services/eventlog/lib/pkgconfig 
./configure --prefix=/usr/local/services/syslog-ng
#如果提示no package 'glib-2.0' found centos
#那么就用yum install libgnomeui-devel
make
make install
第二步:添加服务
配置
将syslog-ng添加为系统服务, 
vim /etc/init.d/syslog-ng  #内容如下 
################################################################################
#!/bin/bash 
#  
# chkconfig: -  60 27 
# description: syslog-ng SysV script.  
. /etc/rc.d/init.d/functions 
 
syslog_ng=/usr/local/services/syslog-ng/sbin/syslog-ng 
prog=syslog-ng 
pidfile=/usr/local/services/syslog-ng/var/syslog-ng.pid 
lockfile=/usr/local/services/syslog-ng/var/syslog-ng.lock 
RETVAL=0 
STOP_TIMEOUT=${STOP_TIMEOUT-10} 
 
start() { 
        echo -n $"Starting $prog: " 
        daemon --pidfile=$pidfile $syslog_ng $OPTIONS 
        RETVAL=$? 
        echo 
        [ $RETVAL = 0 ] && touch ${lockfile} 
        return $RETVAL 
 
stop() { 
    echo -n $"Stopping $prog: " 
    killproc -p $pidfile -d $STOP_TIMEOUT $syslog_ng 
    RETVAL=$? 
    echo 
    [ $RETVAL = 0 ] && rm -f $lockfile $pidfile 
 
case "$1" in 
  start) 
    start 
    ;; 
  stop) 
    stop 
    ;; 
  status) 
        status -p $pidfile $syslog_ng 
    RETVAL=$? 
    ;; 
  restart) 
    stop 
    start 
    ;; 
  *) 
    echo $"Usage: $prog {start|stop|restart|status}" 
    RETVAL=2 
esac 
exit $RETVAL 
##################################################################################
#启动服务
chmod a+x /etc/init.d/syslog-ng 
killall syslogd 
chkconfig --add syslog-ng 
chkconfig syslog-ng on 
service syslog-ng start 
第三步:实际配置
命令 vi /usr/local/services/syslog-ng/etc/syslog-ng.conf
#################################################################################################### 
#############################################################################
# Default syslog-ng.conf file which collects all local logs into a
# single file called /var/log/messages.
#
@version: 3.5
@include "scl.conf"
options {
        create_dirs(yes);
        dir_perm(0755);
        use_dns(no);
        perm(0644);
        chain_hostnames(off);
        stats_freq(30);
};
source s_local {
        system();
        internal();
};
source s_network {
        udp(ip("0.0.0.0") port(514));
};
destination d_local {
        file("/var/log/messages");
};
log {
        source(s_local);
        # uncomment this line to open port 514 to receive messages
        source(s_network);
        destination(d_local);
};
template t_onlymsgip { template("$MSGONLY|$SOURCEIP\n"); };
template t_onlymsg { template("$MSGONLY\n"); };
filter f_cgioss { program("CGI") and level(crit); };
destination d_cgioss { file("/usr/local/services/lzlog/cgioss/$YEAR$MONTH/$YEAR$MONTH$DAY-$HOUR.oss" template(t_onlymsg)); };
log { source(s_network); filter(f_cgioss); destination(d_cgioss); flags(final);};
##### CGI ERR #####
filter f_cgierr { program("CGI") and level(err); };
destination d_cgierr { file("/usr/local/services/lzlog/cgierr/$YEAR$MONTH/$YEAR$MONTH$DAY-$HOUR.err" template(t_onlymsgip)); };
log { source(s_network); filter(f_cgierr); destination(d_cgierr); };
##### CGI LOG #####
filter f_cgilog { program("CGI") ; };
destination d_cgilog { file("/usr/local/services/lzlog/cgilog/$YEAR$MONTH/$YEAR$MONTH$DAY-$HOUR.log" template(t_onlymsgip)); };
destination d_minutecgilog { file("/usr/local/services/lzlog/cgilog/$YEAR$MONTH/$YEAR$MONTH$DAY-$HOUR-$MIN.log" template(t_onlymsgip)); };
#log { source(s_network); filter(f_cgilog); destination(d_minutecgilog); };
log { source(s_network); filter(f_cgilog); destination(d_cgilog); flags(final);};
#### SVR BILL #####
#现在量少,不用分10个文件
filter f_svrbill { program("SVR") and level(info); };
destination d_svrbill { file("/usr/local/services/lzlog/svrbill/$YEAR$MONTH/$YEAR$MONTH$DAY-$HOUR.oss" template(t_onlymsg)); };
log { source(s_local); filter(f_svrbill); destination(d_svrbill); flags(final);};
filter f_paybill { program("PAY"); };
destination d_paybill { file("/usr/local/services/lzlog/paybill/$YEAR$MONTH/$YEAR$MONTH$DAY-$HOUR.oss" template(t_onlymsg)); };
log { source(s_local); filter(f_paybill); destination(d_paybill); flags(final);};
###########################################################################################################
posted @ 2014-05-07 18:32 冬瓜 阅读(1815) | 评论 (0)编辑 收藏

     摘要: 一次,在csdn的一个回复里,看到了basic4android(后面简称B4A),我想这个是什么东西。一查,原来是一个外国人搞的用basic开发android应用,安装包非常小,需要Android SDK。语法和VB基本一样。了解了一下,这个B4A还是相当完备的。对basic有兴趣的朋友,可以去了解一下。B4A的主界面如下  阅读全文
posted @ 2014-05-07 11:13 冬瓜 阅读(1652) | 评论 (0)编辑 收藏

(基于cocos2dx2.2.2)cocos2dx的按钮类定义在extensions\GUI\CCControlExtension\CCControlButton.h
在需要用的时候,包括就可以了。
我们在相应的申明的地方,包含下面三个头文件

#include "GUI/CCControlExtension/CCControlButton.h"
#include "GUI/CCControlExtension/CCScale9Sprite.h"
#include "GUI/CCControlExtension/CCControl.h"
然按钮的事件有如下定义
enum 
{
    CCControlEventTouchDown           = 1 << 0,    // A touch-down event in the control.
    CCControlEventTouchDragInside     = 1 << 1,    // An event where a finger is dragged inside the bounds of the control.
    CCControlEventTouchDragOutside    = 1 << 2,    // An event where a finger is dragged just outside the bounds of the control. 
    CCControlEventTouchDragEnter      = 1 << 3,    // An event where a finger is dragged into the bounds of the control.
    CCControlEventTouchDragExit       = 1 << 4,    // An event where a finger is dragged from within a control to outside its bounds.
    CCControlEventTouchUpInside       = 1 << 5,    // A touch-up event in the control where the finger is inside the bounds of the control. 
    CCControlEventTouchUpOutside      = 1 << 6,    // A touch-up event in the control where the finger is outside the bounds of the control.
    CCControlEventTouchCancel         = 1 << 7,    // A system event canceling the current touches for the control.
    CCControlEventValueChanged        = 1 << 8      // A touch dragging or otherwise manipulating a control, causing it to emit a series of different values.
};
事件原型定义:typedef void (CCObject::*SEL_CCControlHandler)(CCObject*, CCControlEvent); 并用宏cccontrol_selector定义了 #define cccontrol_selector(_SELECTOR) (SEL_CCControlHandler)(&_SELECTOR) 事件的两个参数分别的产生事件的对象,具体的事件,这是一个无符号32位整数,事件值就是CCControlEventTouchDown等定义的值。
在这里,定义了事件函数    void OnTouchDown(CCObject* pSender, extension::CCControlEvent event);
    void OnTouchDragEnter(CCObject* pSender, extension::CCControlEvent event);
    void OnTouchDragExit(CCObject* pSender, extension::CCControlEvent event);
    void OnTouchDragInside(CCObject* pSender, extension::CCControlEvent event);
    void OnTouchDragOutside(CCObject* pSender, extension::CCControlEvent event);
    void OnTouchUpInside(CCObject* pSender, extension::CCControlEvent event);
    void OnTouchUpOutside(CCObject* pSender, extension::CCControlEvent event);
    void OnTouchCancel(CCObject* pSender, extension::CCControlEvent event);
具体事件实现如下

void HelloWorld::OnTouchDown(CCObject* pSender, extension::CCControlEvent event)
{
    PrintLog("OnTouchDown:%u", event);
}

void HelloWorld::OnTouchDragEnter(CCObject* pSender, extension::CCControlEvent event)
{
    PrintLog("OnTouchDragEnter:%u", event);

}

void HelloWorld::OnTouchDragExit(CCObject* pSender, extension::CCControlEvent event)
{
    PrintLog("OnTouchDragExit:%u", event);

}

void HelloWorld::OnTouchDragInside(CCObject* pSender, extension::CCControlEvent event)
{
    PrintLog("OnTouchDragInside:%u", event);
}

void HelloWorld::OnTouchDragOutside(CCObject* pSender, extension::CCControlEvent event)
{
    PrintLog("OnTouchDragOutside:%u", event);
}

void HelloWorld::OnTouchUpInside(CCObject* pSender, extension::CCControlEvent event)
{
    PrintLog("OnTouchUpInside:%u", event);
}

void HelloWorld::OnTouchUpOutside(CCObject* pSender, extension::CCControlEvent event)
{
    PrintLog("OnTouchUpOutside:%u", event);
}

void HelloWorld::OnTouchCancel(CCObject* pSender, extension::CCControlEvent event)
{
    PrintLog("OnTouchCancel:%u", event);
}
然后定义一个按钮,在init中实现 

            {
                extension::CCScale9Sprite * pBtnNormal = extension::CCScale9Sprite::create("up.png");
                extension::CCScale9Sprite * pBtnDown = extension::CCScale9Sprite::create("up.png");
                CCLabelTTF * pBtnCaption = CCLabelTTF::create("", "宋体", 30);
                extension::CCControlButton * pBtn = extension::CCControlButton::create(pBtnCaption, pBtnNormal);
                pBtn->setBackgroundSpriteForState(pBtnDown, extension::CCControlStateSelected);
                pBtn->setPosition(GetPosition(pPlayerLayer, "UpPoint"));
                pBtn->setAnchorPoint(CCPointZero);
                pBtn->setPreferredSize(CCSizeMake(32, 32));
                pBtn->setTag(100);
                this->addChild(pBtn);

                pBtn->addTargetWithActionForControlEvents(this,    cccontrol_selector(HelloWorld::OnTouchDown), CCControlEventTouchDown);
                pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchDragEnter), CCControlEventTouchDragEnter);
                pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchDragExit), CCControlEventTouchDragExit);
                pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchDragInside), CCControlEventTouchDragInside);
                pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchDragOutside), CCControlEventTouchDragOutside);
                pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchUpInside), CCControlEventTouchUpInside);
                pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchUpOutside), CCControlEventTouchUpOutside);
                pBtn->addTargetWithActionForControlEvents(this, cccontrol_selector(HelloWorld::OnTouchCancel), CCControlEventTouchCancel);


                
            }
需要注意的事件,不要开启touch事件,否则会找不到。 也就是这句//CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
具体的按钮事件实验结果说明:
CCControlEventTouchDown:鼠标该处于按下并曾经点中按钮时,则触发一次 
CCControlEventTouchDragEnter:当鼠标处于按下并曾经点中按钮的状态下,鼠标进入按钮范围,则触发一次 ,也就是处于按下状态,回到该按钮区域
CCControlEventTouchDragExit:当鼠标处于按下并曾经点中按钮的状态下,鼠标离开按钮范围,则触发一次 ,也就是处于按下状态,离开该按钮区域
CCControlEventTouchDragInside:当鼠标处于按下并曾经点中按钮的状态下,鼠标进入按钮范围,则触发,每产生移动,就会触发 ,
CCControlEventTouchDragOutside: 当鼠标处于按下并曾经点中按钮的状态下,鼠标离开按钮范围,则触发,每产生移动,就会触发 
CCControlEventTouchUpInside:当鼠标处于按下并曾经点中按钮的状态下,鼠标松开且在按钮范围内,则触发一次,也就是处于按下状态,并在该按钮区域放起
CCControlEventTouchUpOutside:当鼠标处于按下并曾经点中按钮的状态下,鼠标松开且在按钮范围外,则触发一次 也就是处于按下状态,但是已经离开该按钮区域,再放起
CCControlEventTouchCancel:暂时没有发现能用鼠标触发这个事件的操作
了解后,就可以根据实际要求实现了
posted @ 2014-05-05 23:49 冬瓜 阅读(4650) | 评论 (0)编辑 收藏

因为要用到调试json的解析结果,所以在这里写了一个,结果近似json格式

void PrintJsonList(const string & paramPre, Json::Value & paramValue)
{
    Json::Value::Members mem = paramValue.getMemberNames();  
    for (auto iter = mem.begin(); iter != mem.end(); iter++)  
    {  
        cout<<paramPre<<"\""<<*iter<<"\":";  
        if (paramValue[*iter].type() == Json::objectValue)  
        {  
            cout<<paramPre<<"{"<<endl;  
            PrintJsonList(paramPre + "   ", paramValue[*iter]);  
            cout<<paramPre<<"},"<<endl;
        }  
        else if (paramValue[*iter].type() == Json::arrayValue)  
        {  
            cout<<paramPre<<"["<<endl;  
            auto cnt = paramValue[*iter].size();  
            for (auto i = 0; i < cnt; i++)  
            {  
                Json::Value & pElem = paramValue[*iter][i];
                if (pElem.type() == Json::arrayValue)
                {
                    cout <<paramPre<< "["<<endl;
                    PrintJsonList(paramPre + "   ", pElem);  
                    cout <<paramPre<< "],"<<endl;
                }
                else if (pElem.type() == Json::objectValue)
                {
                    cout <<paramPre<< "{"<<endl;
                    PrintJsonList(paramPre + "   ", pElem);  
                    cout <<paramPre<< "},"<<endl;
                }
                else PrintJsonList(paramPre + "   ", pElem);  
            }  
            cout<<paramPre<<"]"<<endl;  
        }  
        else if (paramValue[*iter].type() == Json::stringValue)  
        {  
            cout<<"\""<<paramValue[*iter].asString()<<"\""<<endl;  
        }  
        else if (paramValue[*iter].type() == Json::realValue)  
        {  
            cout<<paramValue[*iter].asDouble()<<endl;  
        }  
        else if (paramValue[*iter].type() == Json::uintValue)  
        {  
            cout<<paramValue[*iter].asUInt()<<endl;  
        }  
        else
        {  
            cout<<paramValue[*iter].asInt()<<endl;  
        }  
    }  
    return;  
}
posted @ 2014-04-29 16:30 冬瓜 阅读(1248) | 评论 (0)编辑 收藏

     摘要: C++Builder XE6,这个发布了,同时这次破解也很快发布了(以前,每次更新只是更新防破解,搞的人家懒的破解了),于是,我就有兴趣下载下来试用了,我的目的是Fire Monkey的移动应用开发。  阅读全文
posted @ 2014-04-29 14:01 冬瓜 阅读(7415) | 评论 (5)编辑 收藏

最近在搞一个项目,需要用的curl。因为使用windows下面开发比较习惯,于是用它了。然并不是一帆风顺的。
先去官网下载curl。我先下下载了libcurl-7.19.3_win32_ssl_msvc.zip,然后提示"应用程序无法正常启动(0xc000007)",反复测试没用(本人是win7 64位环境),它自带的也是这样。看到也有人说这个问题,好像是64位环境的问题,于是就重新搞一下。
首先到官网下载64位的:http://curl.haxx.se/download.html,在这里选择Use the curl Download Wizard!,然后按照要求,下载了一个64位版本。下载后的文件名是curl-7.34.0-devel-mingw64.7z。然后解压就可以了。
vs工程也要加一个,选择工程树具体的某个工程,点该工程的属性,终出下面的对话框后,选择配置管理器(图中所示)


设置先成后,选择相应的工程配置方案,就可以了。


下步就是如何加到工程,在下载的libcurl中,是用mingw编译了,没有的lib文件,但是他提供了def文件,我们可以用它来生成lib。在curl-7.34.0-devel-mingw64\lib64里面。
在windows的开始菜单找到visual studio 2013,选择visual studio tools,会打开一个目录,然后选择“VS2013 x64 本机工具命令提示”进入命令提示符下面。
进入到libcurl解压的目录,在lib64目录下面。然后输入下面两个命令,就可以得到两个lib了
lib /DEF:libcurl.def /MACHINE:X64
lib /DEF:libssh2.def /MACHINE:X64
把生成的libcurl.lib和libssh2.lib放到工程可以找到的lib目录,再把curl-7.34.0-devel-mingw64\bin下的所有dll复制到程序生成.exe的目录,这样,就可以在工程中使用curl了。
下面的博客提供了一个curl的使用,可以直接用,并编译通过。http://dewei.iteye.com/blog/1572016,唯一不同的指定lib
#include "curl/curl.h"  
#pragma comment(lib, "libcurl.lib")  

posted @ 2014-04-15 17:03 冬瓜 阅读(7913) | 评论 (2)编辑 收藏

平时用dynamic_cast,但是一直没有考虑过性能。但是性能怎么样,还真没想过。下测试就是一段测试程序,在linux下跑。
循环2亿次,用dynamic_cast<XTestEx *>()的时候是2.39978秒,用(XTestEx *)直接转的时间是0.723503秒。如果加上附加代码带来的误差。dynamic_cast<XTestEx *>()费时是(XTestEx *)的近4倍.但总的来说,性能影响不大!
#include <iostream>
#include<sys/time.h>

using namespace std;

class XTestBase
{
public:
    virtual ~XTestBase(){}
    virtual int getValue() = 0;
    
};

class XTestEx : public XTestBase
{
public:
    virtual ~XTestEx(){}
    virtual int getValue() 
    {
        return 100;
    }
};

int main(int argc, char * argv[])
{
    struct timeval st1,st2;

    XTestBase * pB = new XTestEx();
    int iC = 0;
    gettimeofday(&st1, NULL);
    for(int i = 0; i < 200000000; i++)
    {
        XTestEx * p = dynamic_cast<XTestEx *>(pB);
        iC += p->getValue();
    }
    gettimeofday(&st2, NULL);
    long long diff  = 1000000ll * (st2.tv_sec-st1.tv_sec)+ st2.tv_usec-st1.tv_usec;
    cout<<"diff:"<<(diff/1000000.0)<<endl;

    gettimeofday(&st1, NULL);
    for(int i = 0; i < 200000000; i++)
    {
        XTestEx * p = (XTestEx *)pB;
        iC += p->getValue();
    }
    gettimeofday(&st2, NULL);
    diff  = 1000000ll * (st2.tv_sec-st1.tv_sec)+ st2.tv_usec-st1.tv_usec;
    cout<<"diff:"<<(diff/1000000.0)<<endl;

    return 0;
}
posted @ 2014-04-02 11:46 冬瓜 阅读(1387) | 评论 (1)编辑 收藏

     摘要: 第一:没有美术,只好自己用PS。先用PS在原来的4个方向上,做一个履带差异的4方向坦克。
第二:用SpritePacker打包成tankbase.plist。然后用CCSpriteFrameCache加载到内存中。
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("basetank.plist");  阅读全文
posted @ 2014-03-25 00:05 冬瓜 阅读(1216) | 评论 (1)编辑 收藏

(基于cocos2dx 2.2.2)
如果很多图片很小或常用,可以使用CCSpriteFrameCache,来避免资源被反复加载。 
(注:对于plist,我这里使用的是一个免费的工具,SpritePacker,http://spritepacker.kernys.net)

如:CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("basetank.plist");
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>frames</key>
    <dict>
        <key>basetank_down.png</key>
        <dict>
            <key>frame</key>
            <string>{{0,0},{26,26}}</string>
            <key>offset</key>
            <string>{0,0}</string>
            <key>rotated</key>
            <false/>
            <key>sourceColorRect</key>
            <string>{{3,3},{26,26}}</string>
            <key>sourceSize</key>
            <string>{32,32}</string>
        </dict>
        <key>basetank_left.png</key>
        <dict>
            <key>frame</key>
            <string>{{0,27},{26,26}}</string>
            <key>offset</key>
            <string>{0,0}</string>
            <key>rotated</key>
            <false/>
            <key>sourceColorRect</key>
            <string>{{3,3},{26,26}}</string>
            <key>sourceSize</key>
            <string>{32,32}</string>
        </dict>
        <key>basetank_right.png</key>
        <dict>
            <key>frame</key>
            <string>{{0,54},{26,26}}</string>
            <key>offset</key>
            <string>{0,0}</string>
            <key>rotated</key>
            <false/>
            <key>sourceColorRect</key>
            <string>{{3,3},{26,26}}</string>
            <key>sourceSize</key>
            <string>{32,32}</string>
        </dict>
        <key>basetank_up.png</key>
        <dict>
            <key>frame</key>
            <string>{{0,81},{26,26}}</string>
            <key>offset</key>
            <string>{0,0}</string>
            <key>rotated</key>
            <false/>
            <key>sourceColorRect</key>
            <string>{{3,3},{26,26}}</string>
            <key>sourceSize</key>
            <string>{32,32}</string>
        </dict>
    </dict>
    <key>metadata</key>
    <dict>
        <key>format</key>
        <integer>2</integer>
        <key>realTextureFileName</key>
        <string>basetank.png</string>
        <key>size</key>
        <string>{32,128}</string>
        <key>smartupdate</key>
        <string>{None}</string>
        <key>textureFileName</key>
        <string>basetank.png</string>
    </dict>
</dict>
</plist>
这样,就可以完成一组图片资源加载。
            CCSprite * p1Pic = CCSprite::createWithSpriteFrameName(“basetank_up.png”);
            p1Pic->setPosition(GetPosition(pPlayerLayer, "Player1"));
            p1Pic->setAnchorPoint(ccp(0, 0));
            this->addChild(p1Pic);
如需更换图片,
p1Pic
->setDisplayFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("basetank_right.png"));
这里的作用相当于是把tank向右转
posted @ 2014-03-24 00:08 冬瓜 阅读(1417) | 评论 (0)编辑 收藏

仅列出标题
共16页: First 5 6 7 8 9 10 11 12 13 Last