• 左右手川字掌

    2009-04-30

    我的左右手都是很明显的川字掌.开始有看过一本书上说.左手是携带了天命.右手是今世的命运.<女左.男右> 有很多人说川字掌好,以后会很有成就.可是到现在我还没有任何成就,哈哈哈,所以有点不相信. 但还是抱了一线希望的查了查.以下就是搜索来的结果.就当作无聊的消遣.随便更新篇日志凑数算了.

    -------------------------------------------------------------------------------

    新手相学家给另一种头脑线下过这样的定义:“起端跟生命线分开,使生命线、头脑线和感情线成了各自独立的线状这种掌线,表示那人独立能力很强,在恋爱中只知有人,因而容易造成恋爱多变和婚姻不满。” 这种掌线,在中国手相学中叫做“川字掌”、不管男女,凡有“川字掌”的人在性格上都有下列必个特点:思考迅速,而且能够迅速地吸收别人的意见和经验作为自己的意见和经验。独立能力极强,即使面对着极大的因难和痛苦,他也可以凭自己个人的力量来加以解决或承担。自尊心强,自卑感也很强。做事只知有已不知有人,对于别人的错误或过失,一点也不肯原谅。同情心比较弱。时时刻刻想控制着自己的爱人,甚至连对方的生活细节也要干涉,使对方失却个人的自由。因为这种人的性格比较特殊,使人难以适应,所以他的恋爱时时会引起轩然大波,或者会中途分开。 日本手相学家中村哲郎说:“在我个人实验中,有这种掌线的人如果他的配偶不善迁就他的话,他的婚姻可说是世上最糟糕的婚姻了。” 川掌女人个性要强,哪怕是跟了别人也要过到人前头。川掌配川掌。她必须要找一位优秀的男士才能比翼双飞。否则不够进取的男人将会承受川掌女的压力,以致终于被淘汰。

     -------------------------------------------------------------------------------

    1、掌纹 右手标准川字掌型。左手标准正常掌型。 双手1A弧线流畅,有力。 双手1C弧线流畅,有力,末段伸向8区。可见左手1C后段上部有平行的1C掌纹。 双手有发源于9区中部的2C掌纹。 双手2A弧线流畅,有力。 双手5区开阔。其它各区开阔丰满。 2、素质 社会情感丰富。情绪稳定性好。情感承受能力强。 有悟性认知模式,有务实性认知模式。既有直觉性好的特点,又有客观现实的特点。 形象思维类型倾向。想象力丰富,耐心细致,计划性、条理性很强。记忆力很好。 思维过程的秩序性、协调性很好。 具有发散性、包容性、创造性思维的倾向性。 联想丰富。联想速度很快。理解领悟素质很好。 有独立自强性意志倾向。 社会情感外向。理智个性内向。耐心细致,谨慎小心。 身体健康,坑病能力强。 3、点评 掌纹:右手川字掌,左手标准正常掌。双手1C弧线流畅,末段弯垂伸长。双手5区开阔。 素质:聪明细心,谨慎。记忆力很好。有发散性思维特征,悟性好,直觉性强。

  • 在发生下面几种事件之一时,窗口消息处理程序会接收到一个WM_PAINT消息:

    • 在使用者移动窗口或显示窗口时,窗口中先前被隐藏的区域重新可见。
    • 使用者改变窗口的大小(如果窗口类别样式有着CS_HREDRAW和CS_VREDRAW位旗标的设定)。
    • 程序使用ScrollWindow或ScrollDC函数滚动显示区域的一部分。
    • 程序使用InvalidateRect或InvalidateRgn函数刻意产生WM_PAINT消息。

    在某些情况下,显示区域的一部分被临时覆盖,Windows试图保存一个显示区域,并在以后恢复它,但这不一定能成功。在以下情况下,Windows可能发送WM_PAINT消息:

    • Windows擦除覆盖了部分窗口的对话框或消息框。
    • 菜单下拉出来,然后被释放。
    • 显示工具提示消息。

    在某些情况下,Windows总是保存它所覆盖的显示区域,然后恢复它。这些情况是:

    • 鼠标光标穿越显示区域。

    图标拖过显示区域。

    Windows内部为每个窗口保存一个「绘图信息结构」,这个结构包含了包围无效区域的最小矩形的坐标以及其它信息,这个矩形就叫做「无效矩形」,有时也称为「无效区域」。如果在窗口消息处理程序处理WM_PAINT消息之前显示区域中的另一个区域变为无效,则Windows计算出一个包围两个区域的新的无效区域(以及一个新的无效矩形),并将这种变化后的信息放在绘制信息结构中。Windows不会将多个WM_PAINT消息都放在消息队列中。

    在窗口大小改变时,Windows给窗口消息处理程序发送一个WM_SIZE消息。传给窗口消息处理程序的lParam参数的低字组中包含显示区域的宽度,高字组中包含显示区域的高度。要保存这些尺寸,需要在窗口消息处理程序中定义两个静态变量:

    static int cxClient, cyClient ;

    与cxChar和cyChar相似,这两个变量在窗口消息处理程序内定义为静态变量,因为在以后处理其它消息时会用到它们。处理WM_SIZE的方法如下:

    caseWM_SIZE:

    cxClient = LOWORD (lParam) ;

    cyClient = HIWORD (lParam) ;

    return 0 ;

  • 在对象导向的程序设计中,对象是程序与数据的组合。窗口是一种对象,其程序是窗口消息处理程序。数据是窗口消息处理程序保存的信息和Windows为每个窗口以及系统中那个窗口类别保存的信息。

    LoadIcon 加载图标供程序使用。

    LoadCursor 加载鼠标光标供程序使用。

    :: 要取得预先定义图示的句柄,可以将第一个参数设定为NULL来呼叫LoadIcon。在加载程序写作者自订的图标时(图标应该存放在磁盘上的.EXE程序文件中),这个参数应该被设定为程序的执行实体句柄hInstance。

    GetStockObject 取得一个图形对象(在这个例子中,是取得绘制窗口背景的画刷对象)。

    RegisterClass 为程序窗口注册窗口类别。

    MessageBox 显示消息框。

    CreateWindow 根据窗口类别建立一个窗口。

    ShowWindow 在屏幕上显示窗口。

    UpdateWindow 指示窗口自我更新。

    GetMessage 从消息队列中取得消息。

    TranslateMessage 转译某些键盘消息。

    DispatchMessage 将消息发送给窗口消息处理程序。

    PlaySound 播放一个声音文件。

    BeginPaint 开始绘制窗口。

    GetClientRect 取得窗口显示区域的大小。

    DrawText 显示字符串。

    EndPaint 结束绘制窗口。

    PostQuitMessage 在消息队列中插入一个「退出程序」消息。

    DefWindowProc 执行内定的消息处理。

    句柄是一个(通常为32位的)整数,它代表一个对象。Windows中的句柄类似传统C或者MS-DOS程序设计中使用的文件句柄。程序几乎总是通过呼叫Windows函数取得句柄。程序在其它Windows函数中使用这个句柄,以使用它代表的对象。代号的实际值对程序来说是无关紧要的。但是,向您的程序提供代号的Windows模块知道如何利用它来使用相对应的对象。

    前缀

    数据型态

    c

    char或WCHAR或TCHAR

    by

    BYTE (无正负号字符)

    n

    short

    i

    int

    x, y

    int分别用作x坐标和y坐标

    cx, cy

    int分别用作x长度和y长度;C代表「计数器」

    b或f

    BOOL (int);f代表「旗标」

    w

    WORD (无正负号短整数)

    l

    LONG (长整数)

    dw

    DWORD (无正负号长整数)

    fn

    function(函数)

    s

    string(字符串)

    sz

    以字节值0结尾的字符串

    h

    句柄

    p

    指标

    对WM_PAINT的处理几乎总是从一个BeginPaint呼叫开始:

    hdc = BeginPaint (hwnd, &ps) ;

    而以一个EndPaint呼叫结束:

    EndPaint (hwnd, &ps) ;

    在这两个呼叫中,第一个参数都是程序的窗口句柄,第二个参数是指向型态为PAINTSTRUCT的结构指针。PAINTSTRUCT结构中包含一些窗口消息处理程序,可以用来更新显示区域的内容。我们将在下一章中讨论该结构的各个字段。现在我们只在BeginPaint和EndPaint函数中用到它。

    在BeginPaint呼叫中,如果显示区域的背景还未被删除,则由Windows来删除。它使用注册窗口类别的WNDCLASS结构的hbrBackground字段中指定的画刷来删除背景。在HELLOWIN中, 这是一个白色备用画刷。这意味着,Windows将通过把窗口背景设定为白色来删除窗口背景。BeginPaint呼叫令整个显示区域有效,并传回一个「设备内容句柄」。设备内容是指实体输出设备(如视讯显示器)及其设备驱动程序。在窗口的显示区域显示文字和图形需要设备内容句柄。但是从BeginPaint传回的设备内容句柄不能在显示区域之外绘图,读者可以试一试。EndPaint释放设备内容句柄,使之不再有效。

  • VA_LIST的用法

    2009-04-14

    有关VA_LIST的用法

    VA_LIST 是在C语言中解决变参问题的一组宏

    VA_LIST的用法:
           (1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针
          (2)然后用VA_START宏初始化变量刚定义的VA_LIST变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数。
           (3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型。
           (4)最后用VA_END宏结束可变参数的获取。然后你就可以在函数里使用第二个参数了。如果函数有多个可变参数的,依次调用VA_ARG获取各个参数。
    VA_LIST在编译器中的处理:

    (1)在运行VA_START(ap,v)以后,ap指向第一个可变参数在堆栈的地址。
    (2)VA_ARG()取得类型t的可变参数值,在这步操作中首先apt = sizeof(t类型),让ap指向下一个参数的地址。然后返回ap-sizeof(t类型)的t类型*指针,这正是第一个可变参数在堆栈里的地址。然后用*取得这个地址的内容。
    (3)VA_END(),X86平台定义为ap = ((char*)0),使ap不再指向堆栈,而是跟NULL一样,有些直接定义为((void*)0),这样编译器不会为VA_END产生代码,例如gcc在Linux的X86平台就是这样定义的。

    要注意的是:由于参数的地址用于VA_START宏,所以参数不能声明为寄存器变量,或作为函数或数组类型。

    使用VA_LIST应该注意的问题:
       (1)因为va_start, va_arg, va_end等定义成宏,所以它显得很愚蠢,可变参数的类型和个数完全在该函数中由程序代码控制,它并不能智能地识别不同参数的个数和类型. 也就是说,你想实现智能识别可变参数的话是要通过在自己的程序里作判断来实现的.
        (2)另外有一个问题,因为编译器对可变参数的函数的原型检查不够严格,对编程查错不利.不利于我们写出高质量的代码。

    小结:可变参数的函数原理其实很简单,而VA系列是以宏定义来定义的,实现跟堆栈相关。我们写一个可变函数的C函数时,有利也有弊,所以在不必要的 场合,我们无需用到可变参数,如果在C++里,我们应该利用C++多态性来实现可变参数的功能,尽量避免用C语言的方式来实现。

    转自:http://www.cnblogs.com/wubiyu/archive/2008/07/30/1256860.html

  • 一.PlaySound函数的声明为:

    BOOL PlaySound(LPCSTR pszSound,HMODULE hmod,DWORD fdwSound);

    1.参数pszSound:是指定了要播放声音的字符串,该参数可以是WAVE文件的名字,或是WAVE资源的名字,或是

    内存中声音数据的指针,或是在系统注册表WIN.INI中定义的系统事件声音.如果该参数为NULL则停止正在播放的声音.

    2.参数hmod:是应用程序的实例句柄,当播放WAV资源时要用到该参数,否则它必须为NULL.

    3.参数fdwSound: 是标志的组合,如下表所示。若成功则函数返回TRUE,否则返回FALSE。
    二.播放标志以及含义:

    SND_APPLICATION
    用应用程序指定的关联来播放声音。

    SND_ALIAS
    pszSound参数指定了注册表或WIN.INI中的系统事件的别名。

    SND_ALIAS_ID
    pszSound参数指定了预定义的声音标识符。

    SND_ASYNC
    用异步方式播放声音,PlaySound函数在开始播放后立即返回。

    SND_FILENAME
    pszSound参数指定了WAVE文件名。

    SND_LOOP
    重复播放声音,必须与SND_ASYNC标志一块使用。

    SND_MEMORY
    播放载入到内存中的声音,此时pszSound是指向声音数据的指针。

    SND_NODEFAULT
    不播放缺省声音,若无此标志,则PlaySound在没找到声音时会播放缺省声音。

    SND_NOSTOP
    PlaySound不打断原来的声音播出并立即返回FALSE。

    SND_NOWAIT
    如果驱动程序正忙则函数就不播放声音并立即返回。
    SND_PURGE
    停止所有与调用任务有关的声音。若参数pszSound为NULL,就停止所有的声音,否则,停止pszSound指定的声音。
    SND_RESOURCE
    pszSound参数是WAVE资源的标识符,这时要用到hmod参数。
    SND_SYNC
    同步播放声音,在播放完后PlaySound函数才返回。

    三.函数使用方法及代码:

    注意:在使用函数前要加入:

    #include "mmsystem.h"//导入声音头文件

    #pragma comment(lib,"winmm.lib")//导入声音头文件库

    .直接播出声音文件:

    PlaySound("c:\\win95\\media\\The Microsoft Sound.wav", NULL, SND_FILENAME | SND_ASYNC);
    注意:参数中的路径使用两个连续的反斜杠转义代表一个反斜杠。

    .把声音文件加入到资源中,然后从资源中播放声音:

    Visual C++支持WAVE型资源,用户在资源视图中单击鼠标右键并选择Import命令,然后在文件选择对话框中选择The Microsoft Sound.wav文件,则该文件就会被加入到WAVE资源中。假定声音资源的ID为IDR_STARTWIN,则下面的调用同样会输出启动声音:
    PlaySound((LPCTSTR)IDR_STARTWIN, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC);

    或:

    PlaySound(MAKEINTRESOURCE(IDR_WAVE2),AfxGetResourceHandle(),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);//将声音文件写入到程序中
    .用PlaySound播放系统声音:

    Windows启动的声音是由SystemStart定义的系统声音,因此可以用下面的方法播放启动声音:
    PlaySound("SystemStart",NULL,SND_ALIAS|SND_ASYNC);
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    sndPlaySound函数的声明为:
    BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound);

    用法:

    除了不能指定资源名字外,参数lpszSound与PlaySound的是一样的。参数fuSound是如何播放声音的标志,可以是SND_ASYNC、SND_LOOP、SND_MEMORY、SND_NODEFAULT、SND_NOSTOP和SND_SYNC的组合,这些标志的含义与PlaySound的一样。
    可以看出,sndPlaySound不能直接播放声音资源。要用该函数播放WAVE文件,可按下面的方式调用:
    sndPlaySound("MYSOUND.WAV",SND_ASYNC);

    转自:http://www.cnblogs.com/wangliang651/archive/2006/09/25/514229.html

  •  
    #pragma 预处理指令详解

    在所有的预处理指令中,#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。

    #pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。
    依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。 
        其格式一般为: #pragma  para 
        其中para为参数,下面来看一些常用的参数。 
    (1)message 参数

        message参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,
    这对于源代码信息的控制是非常重要的。其使用方法为: 
        #pragma  message("消息文本") 
        当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。 
        当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,
    此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏,
    可以用下面的方法:
        #ifdef  _X86 
        #pragma  message("_X86  macro  activated!") 
        #endif 
        我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示"_86  macro  activated!"。
    我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。 

    (2)另一个使用得比较多的pragma参数是code_seg

        格式如: 
        #pragma  code_seg( ["section-name" [, "section-class"] ] ) 
        它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。 

    (3)#pragma once  (比较常用)

        只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,
    但是考虑到兼容性并没有太多的使用它。

    (4)#pragma  hdrstop

        表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,
    但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。   
        有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。
    你可以用#pragma  startup指定编译优先级,如果使用了#pragma  package(smart_init),
    BCB就会根据优先级的大小先后编译。  

    (5)#pragma  resource  "*.dfm"

        表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体 
    外观的定义。  

    (6)#pragma  warning( disable: 4507 34; once: 4385; error: 164 )
        等价于: 
        #pragma  warning( disable: 4507 34 )    //  不显示4507和34号警告信息 
        #pragma  warning( once: 4385 )          //  4385号警告信息仅报告一次 
        #pragma  warning( error: 164 )          //  把164号警告信息作为一个错误。

        同时这个pragma  warning  也支持如下格式: 
        #pragma  warning( push [, n ] ) 
        #pragma  warning( pop ) 
        这里n代表一个警告等级(1---4)。 
        #pragma  warning( push )保存所有警告信息的现有的警告状态。 
        #pragma  warning( push, n )保存所有警告信息的现有的警告状态,并且把全局警告等级设定为n。   
        #pragma  warning( pop )向栈中弹出最后一个警告信息,在入栈和出栈之间所作的一切改动取消。例如: 
        #pragma  warning( push ) 
        #pragma  warning( disable: 4705 ) 
        #pragma  warning( disable: 4706 ) 
        #pragma  warning( disable: 4707 ) 
        //....... 
        #pragma  warning(  pop  )   
        在这段代码的最后,重新保存所有的警告信息(包括4705,4706和4707)。

    (7)#pragma  comment(...)

        该指令将一个注释记录放入一个对象文件或可执行文件中。 
    常用的lib关键字,可以帮我们连入一个库文件。如:
        #pragma  comment(lib, "comctl32.lib")
        #pragma  comment(lib, "vfw32.lib")
        #pragma  comment(lib, "wsock32.lib")
    每个编译程序可以用#pragma指令激活或终止该编译程序支持的一些编译功能。

    例如,对循环优化功能: 
    #pragma  loop_opt(on)     //  激活 
    #pragma  loop_opt(off)    //  终止

    有时,程序中会有些函数会使编译器发出你熟知而想忽略的警告,
    如“Parameter  xxx  is  never  used  in  function  xxx”,可以这样: 
    #pragma  warn  —100         //  Turn  off  the  warning  message  for  warning  #100 
    int  insert_record(REC  *r) 
    {  /*  function  body  */  } 
    #pragma  warn  +100          //  Turn  the  warning  message  for  warning  #100  back  on 
    函数会产生一条有唯一特征码100的警告信息,如此可暂时终止该警告。

    每个编译器对#pragma的实现不同,在一个编译器中有效在别的编译器中几乎无效。可从编译器的文档中查看。

    补充 —— #pragma pack 与 内存对齐问题

        许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k
    (通常它为4或8)的倍数,这就是所谓的内存对齐,而这个k则被称为该数据类型的对齐模数(alignment modulus)。

        Win32平台下的微软C编译器(cl.exe for 80x86)在默认情况下采用如下的对齐规则:
        任何基本数据类型T的对齐模数就是T的大小,即sizeof(T)。比如对于double类型(8字节),
    就要求该类型数据的地址总是8的倍数,而char类型数据(1字节)则可以从任何一个地址开始。

        Linux下的GCC奉行的是另外一套规则(在资料中查得,并未验证,如错误请指正):
        任何2字节大小(包括单字节吗?)的数据类型(比如short)的对齐模数是2,而其它所有超过2字节的数据类型
    (比如long,double)都以4为对齐模数。

        ANSI C规定一种结构类型的大小是它所有字段的大小以及字段之间或字段尾部的填充区大小之和。
    填充区就是为了使结构体字段满足内存对齐要求而额外分配给结构体的空间。那么结构体本身有什么对齐要求吗?
    有的,ANSI C标准规定结构体类型的对齐要求不能比它所有字段中要求最严格的那个宽松,可以更严格。

    如何使用c/c++中的对齐选项

        vc6中的编译选项有 /Zp[1|2|4|8|16] ,/Zp1表示以1字节边界对齐,相应的,/Zpn表示以n字节边界对齐。
    n字节边界对齐的意思是说,一个成员的地址必须安排在成员的尺寸的整数倍地址上或者是n的整数倍地址上,取它们中的最小值。
    也就是:
        min ( sizeof ( member ),  n)

        实际上,1字节边界对齐也就表示了结构成员之间没有空洞。
        /Zpn选项是应用于整个工程的,影响所有的参与编译的结构。
        要使用这个选项,可以在vc6中打开工程属性页,c/c++页,选择Code Generation分类,在Struct member alignment可以选择。

        要专门针对某些结构定义使用对齐选项,可以使用#pragma pack编译指令:

    (1) #pragma  pack( [ n ] )

        该指令指定结构和联合成员的紧凑对齐。而一个完整的转换单元的结构和联合的紧凑对齐由/Zp 选项设置。
    紧凑对齐用pack编译指示在数据说明层设置。该编译指示在其出现后的第一个结构或联合说明处生效。
    该编译指示对定义无效。
        当你使用#pragma  pack ( n ) 时, 这里n 为1、2、4、8 或16。
        第一个结构成员之后的每个结构成员都被存储在更小的成员类型或n 字节界限内。
    如果你使用无参量的#pragma  pack, 结构成员被紧凑为以/Zp 指定的值。该缺省/Zp 紧凑值为/Zp8 。

    (2) 编译器也支持以下增强型语法:
        #pragma  pack( [ [ { push | pop } , ] [ identifier, ] ] [ n] )

        若不同的组件使用pack编译指示指定不同的紧凑对齐, 这个语法允许你把程序组件组合为一个单独的转换单元。
    带push参量的pack编译指示的每次出现将当前的紧凑对齐存储到一个内部编译器堆栈中。
        编译指示的参量表从左到右读取。如果你使用push, 则当前紧凑值被存储起来;
    如果你给出一个n 的值, 该值将成为新的紧凑值。若你指定一个标识符, 即你选定一个名称,
    则该标识符将和这个新的的紧凑值联系起来。

        带一个pop参量的pack编译指示的每次出现都会检索内部编译器堆栈顶的值,并且使该值为新的紧凑对齐值。
    如果你使用pop参量且内部编译器堆栈是空的,则紧凑值为命令行给定的值, 并且将产生一个警告信息。
    若你使用pop且指定一个n的值, 该值将成为新的紧凑值。若你使用p o p 且指定一个标识符,
    所有存储在堆栈中的值将从栈中删除, 直到找到一个匹配的标识符, 这个与标识符相关的紧凑值也从栈中移出,
    并且这个仅在标识符入栈之前存在的紧凑值成为新的紧凑值。如果未找到匹配的标识符,
    将使用命令行设置的紧凑值, 并且将产生一个一级警告。缺省紧凑对齐为8 。

       pack编译指示的新的增强功能让你编写头文件, 确保在遇到该头文件的前后的
    紧凑值是一样的。

    (3) 栈内存对齐

        在vc6中栈的对齐方式不受结构成员对齐选项的影响。它总是保持对齐,而且对齐在4字节边界上。

    转自:http://www.52rd.com/Blog/Detail_RD.Blog_sunhuibo_5025.html

  • 9月30日独自一个人跑到重庆去看艾薇儿的演唱会,感觉颇激动.虽然只有短短的一个半小时左右,但给我前所未有过的兴奋感.