posts - 35,  comments - 35,  trackbacks - 0

转载请注明出处:(鼓手)http://www.cnitblog.com/lifw/articles/vcpp_officeword.html


最近根据项目需要,需要我去用
vc++6.0 作一个 ActiveX web 组件。自己从来没有接触过这方面的编程,这次是头一遭!所以咱就做了,不过倒很出乎我的意料,比我想象的要快很多就完成了。现将 vc++6.0 操作 word 部分的关键代码部分帖出来,共享给大家。

因为我在开发的时候遇到了很多问题,并且网上的资料很少,基本都是最基本的操作。所以帖出来,希望能让大家在开发的过程少走些弯路!

 

工具: vc++6.0

关键字: c++ MFC

要求:系统安装 MS OFFICE 2000

过程:

准备工作:

1.       创建一个 MFC(EXE) 工程: MFC AppWizard exe ),工程为对话框形式(测试用)。

2.       CLASS VIEW 页面创建一个类:类名为: CWordOffice ,类的类型为: Class type Generic Class

3.       在工具栏中找到 view -> class wizard -> Automation -> add class -> from a tye library ,然后选中 offfice 安装的目录中的 MSWORD9.OLB ,然后选中所有列出的类名,点 OK 完成。

 

准备工作完成,下面贴出相关部分的代码:

CWordOffice.h 中的手动写入的代码如下(自动生成的没有加入):

 

#include "atlbase.h"
#include 
"msword9.h"

class CWordOffice 
{
private:
    _Application m_wdApp;
    Documents m_wdDocs;
    _Document m_wdDoc;
    Selection m_wdSel;
    Range     m_wdRange;
    InlineShapes m_wdInlineShapes; 
    InlineShape m_wdInlineShape;

public:
    CWordOffice();
    
virtual ~CWordOffice();

public:
    
//操作
    
//**********************创建新文档*******************************************
    BOOL CreateApp();                    //创建一个新的WORD应用程序
    BOOL CreateDocuments();                //创建一个新的Word文档集合
    BOOL CreateDocument();                //创建一个新的Word文档
    BOOL Create();                        //创建新的WORD应用程序并创建一个新的文档
    void ShowApp();                        //显示WORD文档
    void HideApp();                        //隐藏word文档

    
//**********************打开文档*********************************************
    BOOL OpenDocument(CString fileName);//打开已经存在的文档。
    BOOL Open(CString fileName);        //创建新的WORD应用程序并打开一个已经存在的文档。
    BOOL SetActiveDocument(short i);    //设置当前激活的文档。

    
//**********************保存文档*********************************************
    BOOL SaveDocument();                //文档是以打开形式,保存。
    BOOL SaveDocumentAs(CString fileName);//文档以创建形式,保存。
    BOOL CloseDocument();
    
void CloseApp(); 

    
//**********************文本书写操作*****************************************
    void WriteText(CString szText);        //当前光标处写文本
    void WriteNewLineText(CString szText, int nLineCount = 1); //换N行写字
    void WriteEndLine(CString szText);    //文档结尾处写文本
    void WholeStory();                    //全选文档内容
    void Copy();                        //复制文本内容到剪贴板
    void InsertFile(CString fileName);    //将本地的文件全部内容写入到当前文档的光标处。
    
    
//**********************图片插入操作*****************************************
    void InsertShapes(CString fileName);//在当前光标的位置插入图片
    
    
//**********************超链接插入操作*****************************************
    void InsertHyperlink(CString fileLink);//超级链接地址,可以是相对路径。
}
;

 

CWordOffice.c中的手写代码如下:

 

CWordOffice::CWordOffice()
{

}


CWordOffice::
~CWordOffice()
{
    COleVariant vTrue((
short)TRUE),    
                vFalse((
short)FALSE),
                vOptional((
long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    
//m_wdDoc.Save();
    m_wdApp.Quit(vFalse,    // SaveChanges.
             vTrue,            // OriginalFormat.
             vFalse            // RouteDocument.
             );
    
//释放内存申请资源
    m_wdInlineShape.ReleaseDispatch();
    m_wdInlineShapes.ReleaseDispatch();
    
//m_wdTb.ReleaseDispatch();
    m_wdRange.ReleaseDispatch();
    m_wdSel.ReleaseDispatch();
    
//m_wdFt.ReleaseDispatch();
    m_wdDoc.ReleaseDispatch();
    m_wdDocs.ReleaseDispatch();
    m_wdApp.ReleaseDispatch();
}


//操作
BOOL CWordOffice::CreateApp()
{
    
if (FALSE == m_wdApp.CreateDispatch("Word.Application"))
    
{
        AfxMessageBox(
"Application创建失败,请确保安装了word 2000或以上版本!", MB_OK|MB_ICONWARNING);
        
return FALSE;
    }

    
return TRUE;
}


BOOL CWordOffice::CreateDocuments()
{
    
if (FALSE == CreateApp()) 
    
{
        
return FALSE;
    }

    m_wdDocs.AttachDispatch(m_wdApp.GetDocuments());
    
if (!m_wdDocs.m_lpDispatch) 
    
{
        AfxMessageBox(
"Documents创建失败!", MB_OK|MB_ICONWARNING);
        
return FALSE;
    }

    
return TRUE;
}


BOOL CWordOffice::CreateDocument()
{
    
if (!m_wdDocs.m_lpDispatch) 
    
{
        AfxMessageBox(
"Documents为空!", MB_OK|MB_ICONWARNING);
        
return FALSE;
    }


    COleVariant varTrue(
short(1),VT_BOOL),vOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    CComVariant Template(_T(
""));    //没有使用WORD的文档模板
    CComVariant NewTemplate(false),DocumentType(0),Visible;

    m_wdDocs.Add(
&Template,&NewTemplate,&DocumentType,&Visible);    

    
//得到document变量
    m_wdDoc = m_wdApp.GetActiveDocument();
    
if (!m_wdDoc.m_lpDispatch) 
    
{
        AfxMessageBox(
"Document获取失败!", MB_OK|MB_ICONWARNING);
        
return FALSE;
    }

    
//得到selection变量
    m_wdSel = m_wdApp.GetSelection();
    
if (!m_wdSel.m_lpDispatch) 
    
{
        AfxMessageBox(
"Select获取失败!", MB_OK|MB_ICONWARNING);
        
return FALSE;
    }

    
//得到Range变量
    m_wdRange = m_wdDoc.Range(vOptional,vOptional);
    
if(!m_wdRange.m_lpDispatch)
    
{
        AfxMessageBox(
"Range获取失败!", MB_OK|MB_ICONWARNING);
        
return FALSE;
    }


    
return TRUE;
}


BOOL CWordOffice::Create()
{
    
if (FALSE == CreateDocuments()) 
    
{
        
return FALSE;
    }

    
return CreateDocument();
}


void CWordOffice::ShowApp()
{
    m_wdApp.SetVisible(TRUE);
}


void CWordOffice::HideApp()
{
    m_wdApp.SetVisible(FALSE);
}


BOOL CWordOffice::OpenDocument(CString fileName)
{
    
if (!m_wdDocs.m_lpDispatch) 
    
{
        AfxMessageBox(
"Documents为空!", MB_OK|MB_ICONWARNING);
        
return FALSE;
    }


    COleVariant vTrue((
short)TRUE),    
                vFalse((
short)FALSE),
                vOptional((
long)DISP_E_PARAMNOTFOUND, VT_ERROR),
                vZ((
short)0);
    COleVariant     vFileName(_T(fileName));
    
    
//得到document变量
    m_wdDoc.AttachDispatch(m_wdDocs.Open(
                                vFileName,        
// FileName
                                vTrue,            // Confirm Conversion.
                                vFalse,            // ReadOnly.
                                vFalse,            // AddToRecentFiles.
                                vOptional,        // PasswordDocument.
                                vOptional,        // PasswordTemplate.
                                vOptional,        // Revert.
                                vOptional,        // WritePasswordDocument.
                                vOptional,        // WritePasswordTemplate.
                                vOptional,        // Format. // Last argument for Word 97
                                vOptional,        // Encoding // New for Word 2000/2002
                                vOptional        // Visible
                                /*如下4个是word2003需要的参数。本版本是word2000。
                                //vOptional,    // OpenAndRepair
                                //vZ,            // DocumentDirection wdDocumentDirection LeftToRight
                                //vOptional,    // NoEncodingDialog
                                //vOptional
                                
*/

                                )                
// Close Open parameters
                            );                    // Close AttachDispatch
    
    
if (!m_wdDoc.m_lpDispatch) 
    
{
        AfxMessageBox(
"Document获取失败!", MB_OK|MB_ICONWARNING);
        
return FALSE;
    }

    
//得到selection变量
    m_wdSel = m_wdApp.GetSelection();
    
if (!m_wdSel.m_lpDispatch) 
    
{
        AfxMessageBox(
"Select获取失败!", MB_OK|MB_ICONWARNING);
        
return FALSE;
    }

    
//得到全部DOC的Range变量
    m_wdRange = m_wdDoc.Range(vOptional,vOptional);
    
if(!m_wdRange.m_lpDispatch)
    
{
        AfxMessageBox(
"Range获取失败!", MB_OK|MB_ICONWARNING);
        
return FALSE;
    }

    
return TRUE;
}


BOOL CWordOffice::Open(CString fileName)
{
    
if (FALSE == CreateDocuments()) 
    
{
        
return FALSE;
    }

    
return OpenDocument(fileName);
}


BOOL CWordOffice::SetActiveDocument(
short i)
{
    COleVariant     vIndex(_T(i)),vOptional((
long)DISP_E_PARAMNOTFOUND, VT_ERROR);

    m_wdDoc.AttachDispatch(m_wdDocs.Item(vIndex));
    m_wdDoc.Activate();
    
if (!m_wdDoc.m_lpDispatch) 
    
{
        AfxMessageBox(
"Document获取失败!", MB_OK|MB_ICONWARNING);
        
return FALSE;
    }

    
//得到selection变量
    m_wdSel = m_wdApp.GetSelection();
    
if (!m_wdSel.m_lpDispatch) 
    
{
        AfxMessageBox(
"Select获取失败!", MB_OK|MB_ICONWARNING);
        
return FALSE;
    }

    
//得到全部DOC的Range变量
    m_wdRange = m_wdDoc.Range(vOptional,vOptional);
    
if(!m_wdRange.m_lpDispatch)
    
{
        AfxMessageBox(
"Range获取失败!", MB_OK|MB_ICONWARNING);
        
return FALSE;
    }

    HideApp();
    
return TRUE;
}


BOOL CWordOffice::SaveDocument()
{
    
if (!m_wdDoc.m_lpDispatch) 
    
{
        AfxMessageBox(
"Document获取失败!", MB_OK|MB_ICONWARNING);
        
return FALSE;
    }

    m_wdDoc.Save();
    
return TRUE;
}


BOOL CWordOffice::SaveDocumentAs(CString fileName)
{
    
if (!m_wdDoc.m_lpDispatch) 
    
{
        AfxMessageBox(
"Document获取失败!", MB_OK|MB_ICONWARNING);
        
return FALSE;
    }

    COleVariant vTrue((
short)TRUE),    
                vFalse((
short)FALSE),
                vOptional((
long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    COleVariant vFileName(_T(fileName));

    m_wdDoc.SaveAs(
                vFileName,    
//VARIANT* FileName
                vOptional,    //VARIANT* FileFormat
                vOptional,    //VARIANT* LockComments
                vOptional,    //VARIANT* Password
                vOptional,    //VARIANT* AddToRecentFiles
                vOptional,    //VARIANT* WritePassword
                vOptional,    //VARIANT* ReadOnlyRecommended
                vOptional,    //VARIANT* EmbedTrueTypeFonts
                vOptional,    //VARIANT* SaveNativePictureFormat
                vOptional,    //VARIANT* SaveFormsData
                vOptional    //VARIANT* SaveAsAOCELetter
                );
    
return    TRUE;
}


BOOL CWordOffice::CloseDocument()
{
    COleVariant vTrue((
short)TRUE),    
                vFalse((
short)FALSE),
                vOptional((
long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    m_wdDoc.Close(vFalse,    
// SaveChanges.
             vTrue,            // OriginalFormat.
             vFalse            // RouteDocument.
             );
    m_wdDoc.AttachDispatch(m_wdApp.GetActiveDocument());
    
if (!m_wdDoc.m_lpDispatch) 
    
{
        AfxMessageBox(
"Document获取失败!", MB_OK|MB_ICONWARNING);
        
return FALSE;
    }

    
//得到selection变量
    m_wdSel = m_wdApp.GetSelection();
    
if (!m_wdSel.m_lpDispatch) 
    
{
        AfxMessageBox(
"Select获取失败!", MB_OK|MB_ICONWARNING);
        
return FALSE;
    }

    
//得到全部DOC的Range变量
    m_wdRange = m_wdDoc.Range(vOptional,vOptional);
    
if(!m_wdRange.m_lpDispatch)
    
{
        AfxMessageBox(
"Range获取失败!", MB_OK|MB_ICONWARNING);
        
return FALSE;
    }

    
return TRUE;
}


void CWordOffice::CloseApp()
{
    COleVariant vTrue((
short)TRUE),    
                vFalse((
short)FALSE),
                vOptional((
long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    m_wdDoc.Save();
    m_wdApp.Quit(vFalse,    
// SaveChanges.
             vTrue,            // OriginalFormat.
             vFalse            // RouteDocument.
             );
    
//释放内存申请资源
    m_wdInlineShape.ReleaseDispatch();
    m_wdInlineShapes.ReleaseDispatch();
    
//m_wdTb.ReleaseDispatch();
    m_wdRange.ReleaseDispatch();
    m_wdSel.ReleaseDispatch();
    
//m_wdFt.ReleaseDispatch();
    m_wdDoc.ReleaseDispatch();
    m_wdDocs.ReleaseDispatch();
    m_wdApp.ReleaseDispatch();
}


void CWordOffice::WriteText(CString szText)
{
    m_wdSel.TypeText(szText);
}


void CWordOffice::WriteNewLineText(CString szText, int nLineCount /* = 1 */)
{
    
int i;
    
if (nLineCount <= 0)
    
{
        nLineCount 
= 0;
    }

    
for (i = 0; i < nLineCount; i++)
    
{
        m_wdSel.TypeParagraph();
    }

    WriteText(szText);
}


void CWordOffice::WriteEndLine(CString szText)
{
    m_wdRange.InsertAfter(szText);
}


void CWordOffice::WholeStory()
{
    m_wdRange.WholeStory();
}


void CWordOffice::Copy()
{
    m_wdRange.CopyAsPicture();
}


void CWordOffice::InsertFile(CString fileName)
{
    COleVariant     vFileName(fileName),
                 vTrue((
short)TRUE),
                 vFalse((
short)FALSE),
                 vOptional((
long)DISP_E_PARAMNOTFOUND, VT_ERROR),
                 vNull(_T(
""));
    
/*
    void InsertFile(LPCTSTR FileName, VARIANT* Range, VARIANT* ConfirmConversions, VARIANT* Link, VARIANT* Attachment);
    
*/

    m_wdSel.InsertFile(
                    fileName,
                    vNull,
                    vFalse,
                    vFalse,
                    vFalse
                    );
}


void CWordOffice::InsertShapes(CString fileName)
{
    COleVariant vTrue((
short)TRUE),    
                vFalse((
short)FALSE),
                vOptional((
long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    m_wdInlineShapes
=m_wdSel.GetInlineShapes();
    m_wdInlineShape
=m_wdInlineShapes.AddPicture(fileName,vFalse,vTrue,vOptional);
}


void CWordOffice::InsertHyperlink(CString fileLink)
{
    COleVariant     vAddress(_T(fileLink)),vSubAddress(_T(
""));
    Range aRange 
= m_wdSel.GetRange();
    Hyperlinks vHyperlinks(aRange.GetHyperlinks());

    vHyperlinks.Add(
                    aRange,            
//Object,必需。转换为超链接的文本或图形。
                    vAddress,         //Variant 类型,可选。指定的链接的地址。此地址可以是电子邮件地址、Internet 地址或文件名。请注意,Microsoft Word 不检查该地址的正确性。
                    vSubAddress,     //Variant 类型,可选。目标文件内的位置名,如书签、已命名的区域或幻灯片编号。
                    vAddress,         //Variant 类型,可选。当鼠标指针放在指定的超链接上时显示的可用作“屏幕提示”的文本。默认值为 Address。
                    vAddress,         //Variant 类型,可选。指定的超链接的显示文本。此参数的值将取代由 Anchor 指定的文本或图形。
                    vSubAddress        //Variant 类型,可选。要在其中打开指定的超链接的框架或窗口的名字。
                    ); 
    vHyperlinks.ReleaseDispatch();
}


上边的代码是主要的核心代码,有些代码没有进行优化,请各位批判的看!

测试部分代码如下:

需要在对话框中添加一个按钮,按钮的事件方法内添加如下代码:

COfficeProjectDlg::OnButton1()

{

AfxEnableControlContainer();   

       AfxOleInit();

       CWordOffice wd;

       wd.CreateDocuments();

wd.OpenDocument(
"d:\\a.doc");

wd.ShowApp(); 
//显示word

}

 

其他方法就不一一帖出测试方法了。可以自己根据方法说明做测试。

posted on 2007-03-25 15:50 鼓手 阅读(21211) 评论(21)  编辑 收藏 引用 所属分类: 技术文章

FeedBack:
# re: vc++操作word
2007-03-26 13:20 | 踏雪赤兔
收藏~  回复  更多评论
  
# re: vc++操作word
2007-04-04 12:55 | qqcong
我是用office 2003的, m_wdDoc.SaveAs(
vFileName, //VARIANT* FileName
vOptional, //VARIANT* FileFormat
vOptional, //VARIANT* LockComments
vOptional, //VARIANT* Password
vOptional, //VARIANT* AddToRecentFiles
vOptional, //VARIANT* WritePassword
vOptional, //VARIANT* ReadOnlyRecommended
vOptional, //VARIANT* EmbedTrueTypeFonts
vOptional, //VARIANT* SaveNativePictureFormat
vOptional, //VARIANT* SaveFormsData
vOptional //VARIANT* SaveAsAOCELetter
编译时此处有错,要怎么改啊?
可以加我的Q吗?303012654
还有一些问题想请教你。
谢谢。  回复  更多评论
  
# re: vc++操作word[未登录]
2007-04-04 13:10 | 鼓手
看一下参数个数对不?

如果不对,调整参数个数对应上!都用vOptional作为参数就可以了!


  回复  更多评论
  
# re: vc++操作word
2007-04-21 22:22 | ats
我照你写的做了下。
a.doc文件闪了一下就没了,这是怎么回事。
还有我想问一下,要连接DataGrid导出到Word怎么弄~~~
谢谢~~~  回复  更多评论
  
# re: vc++操作word
2007-06-15 11:13 | zenghui
如果保存文件为 html 如何做  回复  更多评论
  
# re: vc++操作word[未登录]
2007-06-15 13:52 | 鼓手
不好意思,没做过~  回复  更多评论
  
# re: vc++操作word
2007-06-30 18:35 | 哈人一族
a.doc文件闪了一下就没了,这是怎么回事。
QQ 316446272
  回复  更多评论
  
# re: vc++操作word
2007-08-03 20:19 |
谢谢你提供的类.真的很有用.
还有
a.doc文件闪了一下就没了,是以为对象被删除了.
  回复  更多评论
  
# re: vc++操作word
2007-08-03 20:24 |
我还想问下 ,开始那几个用来创建的函数.他们能实现相同的功能.但机理上有什么不同?谢谢.
mail:
ljhuyao@163.com  回复  更多评论
  
# re: vc++操作word
2007-09-15 20:43 | adcjzt@163.com
你提供的类很有用,可以把Word文档的内容信息提取出来并拷贝到剪贴板中,我想请问一下,如果再把剪贴板中的信息写到一个TXT文件中,该怎样编程啊?  回复  更多评论
  
# re: vc++操作word
2007-09-15 21:28 | z6y6@sina.com
请教一下,Word的文本信息提取出来了,怎么编程把这个文本信息写成一个TXT文件呢?谢谢!  回复  更多评论
  
# re: vc++操作word
2007-12-19 21:56 | 你好
WordOffice.cpp
c:\program files\microsoft visual studio\自己编的程序\word1\wordoffice.h(24) : fatal error C1083: Cannot open include file: 'altbase.h': No such file or directory
Error executing cl.exe.

word1.exe - 1 error(s), 0 warning(s)
  回复  更多评论
  
# re: vc++操作word
2007-12-19 22:39 | 你好
然后选中 offfice 安装的目录中的 MSWORD9.OLB ,然后选中所有列出的类名,点 OK 完成。
这是什么意思啊
谢谢
  回复  更多评论
  
# re: vc++操作word
2008-04-14 15:12 | 能把编译好的文件传给我吗
能把编译好的文件传给我吗?谢谢  回复  更多评论
  
# re: vc++操作word
2008-04-14 15:15 | 能把编译好的文件传给我吗
我是初学者,能把一些资料和源文件传给我吗?谢谢shpsi@163.com  回复  更多评论
  
# re: vc++操作word
2008-04-25 10:30 | 菜鸟
我也是初学者,无奈做设计分到了此课题,能吧原代码发给我吗?
jincheng.no1@163.com
谢谢!  回复  更多评论
  
# re: vc++操作word[未登录]
2008-12-04 16:39 | justin
保存为HTML可以调用FileDialogSave,然后让这个对话框Show,判断返回值之后Execute就好了。保存成任何类型都可以由该对话框自动完成  回复  更多评论
  
# re: vc++操作word
2009-07-01 16:44 | 暗暗
参考了,不过问题很多,你肯定没实现  回复  更多评论
  
# re: vc++操作word
2011-07-18 17:22 | 伍鹏程
@zenghui
您好。我想问一下,这个问题你解决了没有呀!?加我QQ可以进行一下交流好吗?249390985  回复  更多评论
  
# re: vc++操作word[未登录]
2011-12-08 21:16 | 小王
我想请问下..如果直接从编辑框往word写入数据是怎么写呀? 我新手,刚学..忘指点  回复  更多评论
  
# re: vc++操作word[未登录]
2011-12-08 21:17 | 小王
这是我的代码..还需加哪些呀?

_Application m_App;
Documents m_Docs;
_Document m_Doc;
Selection m_Slection;
Range m_Range;

COleVariant vTrue((short)TRUE),
vFalse((short)FALSE),
vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR),
vZ((short)0);
COleVariant vFileName(_T("d:\\ca.doc"));
COleVariant vNull(_T(""));

m_Doc.AttachDispatch(m_Docs.Open(
vFileName, // FileName
vTrue, // Confirm Conversion.
vFalse, // ReadOnly.
vFalse, // AddToRecentFiles.
vOpt, // PasswordDocument.
vOpt, // PasswordTemplate.
vOpt, // Revert.
vOpt, // WritePasswordDocument.
vOpt, // WritePasswordTemplate.
vOpt, // Format. // Last argument for Word 97
vOpt, // Encoding // New for Word 2000/2002
vOpt, // Visible
vOpt, // OpenAndRepair
vZ, // DocumentDirection wdDocumentDirection LeftToRight
vOpt, // NoEncodingDialog
vOpt

) // Close Open parameters
); // Close AttachDispatch

//得到selection变量
m_Slection = m_App.GetSelection();
if (!m_Slection.m_lpDispatch)
{
AfxMessageBox("Select获取失败!", MB_OK|MB_ICONWARNING);

}
//得到全部DOC的Range变量
m_Range = m_Doc.Range(vOpt,vOpt);
if(!m_Range.m_lpDispatch)
{
AfxMessageBox("Range获取失败!", MB_OK|MB_ICONWARNING);

}

CString szText;
m_Range.InsertAfter(szText);
m_Slection.InsertFile(
"d:\\ca.doc",
vNull,
vFalse,
vFalse,
vFalse
);

m_Doc.Save();

m_Range.ReleaseDispatch();
m_Slection.ReleaseDispatch(); //释放selection对象
m_Docs.ReleaseDispatch(); //释放Documents对象
m_Doc.Close(vOpt,vOpt,vOpt);
m_Doc.ReleaseDispatch(); //释放Document对象
m_App.Quit(vOpt,vOpt,vOpt);
m_App.ReleaseDispatch(); //释放应用程序类对象

  回复  更多评论
  
只有注册用户登录后才能发表评论。
<2007年11月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

一个傻子的故事:
傻子一直奢望着傻人能有他的傻福!
终于有一天
傻子终于鼓足勇气让他喜欢的人知道了他喜欢她
...................
原来,那个她也一直关注着他!


常用链接

留言簿(8)

随笔分类(33)

随笔档案(35)

文章分类(2)

历史blog

最新随笔

最新评论