关于作者

用户名:rabbitweng
笔名:rabbitweng
地区:
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



访问统计:
文章个数:17
评论个数:21
留言条数:0




Powered by BlogDriver 2.1

rabbitweng的博客

 

文章

如何使MDI程序在启动时不创建一个新文档

在程序的initinstance中的processshellcommand函数之前加入:

cmdinfo.m_nshellcommand = ccommandlineinfo::filenothing

- 作者: rabbitweng 2005年06月3日, 星期五 20:32  回复(1) |  引用(1) 加入博采

坐标转换

在所在的view类中添加:

CClientDC dc(this);//建立设备文本
OnPrepareDC(&dc,NULL);//设备映射处理
dc.DPtoLP(&point);//鼠标指针转换

这样就完成了从device units到logical units的转换,在OnMouseMove()函数中使用以上代码就能使得point从相对于子窗口的坐标转换到相对于子窗口中显示的图片的坐标。

ps:

当然还有dc.LPtoDP(&point)函数了

- 作者: rabbitweng 2005年06月2日, 星期四 22:10  回复(1) |  引用(1) 加入博采

改变dlg类DoModal()的返回值

例如:你的模态对话框有个button。用1作为验证成功的返回值
void MyCDlg::OnBUTTON()
{
     EndDialog(1);     //domodal的返回值
     DestroyWindow();  //销毁对话框
}

而在主程序中可用下面语句。
for( ;MyCDlg.DoModal()!=1; );

- 作者: rabbitweng 2005年06月1日, 星期三 20:24  回复(1) |  引用(1) 加入博采

各个类指针的使用


我现在还没有搞得很清楚到底那些可以用,该如何用,因为试验的结果是有些可以编译但是运行出错,不知是否是我rpwt,先记一下,来源:
http://www.jzxx.net/myvc/Teach/Frame/C/200502/28.html#A3
 【在View中获得Doc指针 】
CMyDoc *pDoc=GetDocument();一个视只能有一个文档。
ps:
这个肯定能行,因为mfc中的doc/view结构就是这样实现的,呵呵

【 在App中获得MainFrame指针】
CWinApp 中的 m_pMainWnd变量就是MainFrame的指针,
或者
CMainFrame *pMain =(CMainFrame *)AfxGetMainWnd();
ps:
Afx函数有一些很有用,比如这个AfxGetGetMainWnd()和AfxGetApp()


【在View中获得MainFrame指针】
CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;


【获得View(已建立)指针 】
CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;
CyouView *pView=(CyouView *)pMain->GetActiveView();


 【获得当前文档指针 】
CDocument * pCurrentDoc =(CFrameWnd *)m_pMainWnd->GetActiveDocument();


【获得状态栏与工具栏指针 】
CStatusBar * pStatusBar=(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
CToolBar * pToolBar=(CtoolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOLBAR);


 【在任何类中获得应用程序类】
用MFC全局函数AfxGetApp()获得


【从文档类取得视图类的指针】
我是从http://download.cqcnc.com/soft/program/article/vc/vc405.html学到的,从文档获得视图类指针目的一般为了控制同一文档的多个视图的定位问题,我的体会特别是文字处理CEditView当产生多个视图类时,这个功能是非常需要的。
CDocument类提供了两个函数用于视图类的定位:
GetFirstViewPosition()和GetNextView()

virtual POSITION GetFirstViewPosition() const;
virtual CView* GetNextView(POSITION& rPosition) const;


注意:GetNextView()括号中的参数用的是引用方式,因此执行后值可能改变。
GetFirstViewPosition()用于返回第一个视图位置(返回的并非视图类指针,而是一个POSITION类型值),GetNextView()有两个功能:返回下一个视图类的指针以及用引用调用的方式来改变传入的POSITION类型参数的值。很明显,在Test程序中,只有一个视图类,因此只需将这两个函数调用一次即可得到CTestView的指针如下(需定义一个POSITION结构变量来辅助操作):

CTestView* pTestView;
POSITION pos=GetFirstViewPosition();
pTestView=GetNextView(pos);
这样,便可到了CTestView类的指针pTestView.执行完几句后,变量pos=NULL,因为没有下一个视图类,自然也没有下一个视图类的POSITION.但是这几条语句太简单,不具有太强的通用性和安全特征;当象前面说的那样,当要在多个视图为中返回某个指定类的指针时,我们需要遍历所有视图类,直到找到指定类为止。判断一个类指针指向的是否某个类的实例时,可用IsKindOf()成员函数时行检查,如:

pView->IsKindOf(RUNTIME_CLASS(CTestView));
即可检查pView所指是否是CTestView类。

有了以上基础,我们已经可以从文档类取得任何类的指针。为了方便,我们将其作为一个文档类的成员函数,它有一个参数,表示要获得哪个类的指针。实现如下:

CView* CTestDoc::GetView(CRuntimeClass* pClass)
{
 CView* pView;
 POSITION pos=GetFirstViewPosition();

 while(pos!=NULL){
  pView=GetNextView(pos);
  if(!pView->IsKindOf(pClass))
  break;
 }

 if(!pView->IsKindOf(pClass)){
  AfxMessageBox("Connt Locate the View.\r\n http://www.VCKBASE.com");
  return NULL;
 }

 return pView;
}

其中用了两次视图类的成员函数IsKindOf()来判断,是因为退出while循环有三种可能:

1.pos为NULL,即已经不存在下一个视图类供操作;
2.pView已符合要求。

1和2同是满足。这是因为GetNextView()的功能是将当前视图指针改变成一个视图的位置同时返回当前视图指针,因此pos是pView的下一个视图类的POSITION,完全有可能既是pos==NULL又是pView符合需要。当所需的视图是最后一个视图是最后一个视图类时就如引。因此需采用两次判断。
使用该函数应遵循如下格式(以取得CTestView指针为例):

CTestView* pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView));
RUNTIME_CLASS是一个宏,可以简单地理解它的作用:将类的名字转化为CRuntimeClass为指针。
至于强制类型转换也是为了安全特性考虑的,因为从同一个基类之间的指针类型是互相兼容的。这种强制类型转换也许并不必要,但能避免一些可能出现的麻烦。

3.从一个视图类取得另一视图类的指针 综合1和2,很容易得出视图类之间互相获得指针的方法:就是用文档类作中转,先用1的方法得到文档类的指针,再用2的方法,以文档类的视图定位函数取得另一个视图类。同样,可以实现成一个函数:
(假设要从CTestAView中取得指向其它视图类的指针)

CView* CTestAView::GetView(CRuntimeClass* pClass)
{
 CTestDoc* pDoc=(CTestDoc*)GetDocument();
 CView* pView;
 POSITION pos=pDoc->GetFirstViewPosition();
 while(pos!=NULL){
  pView=pDoc->GetNextView(pos);
  if(!pView->IsKindOf(pClass))
  break;
 }
 if(!pView->IsKindOf(pClass)){
  AfxMessageBox("Connt Locate the View.");
  return NULL;
 }

 return pView;
}
这个函数和2中的GetView()相比,一是多了第一句以取得文档类指针,二是在GetFirstViewPosition()和GetNextView()前加上了文档类指针,以表示它们是文档类成员函数。
有了此函数;当要从CTestAView中取得CTestBView的指针时,只需如下:

CTestBView* pTestbView=(CTestView*)GetView(RUNTIME_CLASS(CTestBView));


对于单文档中也可以加入多个文档模板,但是一般的开发就使用MDI方式开发多文档模板,其方法与上述视图的获取方法很接近,这里稍做解释,如果不清楚,请查阅MSDN,
来源:http://sanjianxia.myrice.com/vc/vc45.htm

可以用CWinApp::GetFirstDocTemplatePostion获得应用程序注册的第一个文档模板的位置;
利用该值来调用CWinApp::GetNextDocTemplate函数,获得第一个CDocTemplate对象指针。

POSITION GetFirstDocTemplate( ) const;
CDocTemplate *GetNextDocTemplate( POSITION & pos ) const;

第二个函数返回由pos 标识的文档模板。POSITION是MFC定义的一个用于迭代或对象指针检索的值。通过这两个函数,应用程序可以遍历整个文档模板列表。如果被检索的文档模板是模板列表中的最后一个,则pos参数被置为NULL。


一个文档模板可以有多个文档,每个文档模板都保留并维护了一个所有对应文档的指针列表。
用CDocTemplate::GetFirstDocPosition函数获得与文档模板相关的文档集合中第一个文档的位置,并用POSITION值作为CDocTemplate::GetNextDoc的参数来重复遍历与模板相关的文档列表。函数原形为:

viaual POSITION GetFirstDocPosition( ) const = 0;
visual CDocument *GetNextDoc(POSITION & rPos) const = 0; 
如果列表为空,则rPos被置为NULL.


在文档中可以调用CDocument::GetDocTemplate获得指向该文档模板的指针。函数原形如下:

CDocTemplate * GetDocTemplate ( ) const;
如果该文档不属于文档模板管理,则返回值为NULL。


一个文档可以有多个视。每一个文档都保留并维护一个所有相关视的列表。CDocument::AddView将一个视连接到文档上,将该视加入到文档相联系的视的列表中,并将视的文档指针指向该文档。当有File/New、File/Open、Windows/New或Window/Split的命令而将一个新创建的视的对象连接到文档上时, MFC会自动调用该函数,框架通过文档/视的结构将文档和视联系起来。当然,程序员也可以根据自己的需要调用该函数。

Virtual POSITION GetFirstViewPosition( ) const;
Virtual CView * GetNextView( POSITION &rPosition) cosnt;
应用程序可以调用CDocument::GetFirstViewPosition返回与调用文档相联系的视的列表中的第一个视的位置,并调用CDocument::GetNextView返回指定位置的视,并将rPositon的值置为列表中下一个视的POSITION值。如果找到的视为列表中的最后一个视,则将rPosition置为NULL.


从一个视图类取得另一视图类的指针
这个应用在多视的应用程序中很多见,一般如果自己在主程序或者主框架中做好变量记号,也可以获得,还有比较通用的就是用文档类作中转,以文档类的视图遍历定位,取得另一个视图类。

- 作者: rabbitweng 2005年06月1日, 星期三 13:41  回复(1) |  引用(1) 加入博采

上工守神,下工守形
这几天都在抽时间看刘力红的《思考中医》,虽然作为一名信息工程的学生,对中医这门博大精深的学问没有什么研究,但还是比较感趣,阅读过程中,我能体会到这样一门伴随中华文化发展的医学到处都能看到古人的智慧,虽然中国古代的著作大都不是象欧洲那些哲学体系有着极强的逻辑体系,而是多数是以语录的形式表达的,但这丝毫不能掩盖中国古代先圣们的东方智慧,给我极大的启发,刘力红老师写的也不错,呵呵,就我读到的部分,我觉得给我最深映象的就是这句“上工守神,下工守形”,这充分体现了中医的精髓,中医治疗的最高境界就是在疾病出现之前解决它。这点,现代西方医学还差的远的说。

- 作者: rabbitweng 2005年05月31日, 星期二 19:29  回复(1) |  引用(1) 加入博采

花中十友
宋人曾端伯称以下十花为十友

  茶糜——韵友

  茉莉——难友

  瑞香——殊友

  荷花——诤友

  岩桂——仙友

  海棠——名友

  菊花——佳友

  芍药——艳友

  梅花——清友

  栀子——禅友

- 作者: rabbitweng 2005年05月7日, 星期六 15:36  回复(1) |  引用(1) 加入博采

《思考中医》这本书挺好的!
虽然我不是学中医的,但我还是很希望了解一些中国传统的被成为国粹的东西,这也许是受了我的中文教授的父亲的影响吧,有点殉道者的味道(虽然还差的远,呵呵),真希望我们对中医的了解不要越来越肤浅!

- 作者: rabbitweng 2005年05月7日, 星期六 10:54  回复(1) |  引用(1) 加入博采

FreeBSD安装及汉化

安装过程与4.x没什么区别,但接下来的设置就有点郁闷了,查了半天资料才搞定: (部分内容来自Gavin@tjuwww.freebsdchina.org上的帖子http://www.freebsdchina.org/forum/viewtopic.php?t=7686&highlight=xorg&sid=fc2d5bef2fdd50974a74958a1a65051e)

/etc/rc.conf

kern_securelevel_enable="NO" #内核安全级别,我没有使用 linux_enable="YES" #linux虚拟库,建议加载 sendmail_enable="NONE" #因为我需要用到sendmail服务,所以打开了,没有用可以设置为"NONE"来彻底关掉它 sshd_enable="NO" usbd_enable="YES" allscreens_flags="-g 100x37 VESA_800x600" #这行是我设置来让我的字符界面分辨率为800x600,需要编译内核之后才行。

 /etc/make.conf

一开始装完5.x后发现/etc/default下没有make.conf(或只有短短几行,还是安装perl时自动生成的)make.conf.example,后来才发现原来在/usr/share/examples/etc下有make.conf,把它添加到/etc/make.conf下就好了。然后修改为:

CPUTYPE?=i686 #在这个地方选择适合你的cpu类型,以便编译安装软件的时候按照你的cpu类型进行优化。

CFLAGS= -O2 -pipe -fomit-frame-pointer #这个是c优化参数,我从网络上抄过来的,编译通不过的话,记得注释掉它。

CXXFLAGS+= -fmemoize-lookups -fsave-memoized #这个是系统带的 c++ 的优化参数,默认先加上 CFLAGS 那一行 #下面这些是升级源代码,ports以及doc用的,请确保你安装了 ports/net/cvsup 或者 ports/net/cvsup-without-gui

SUP_UPDATE= yes

SUP= /usr/local/bin/cvsup

SUPFLAGS= -g -L 2

SUPHOST= 211.81.54.130

SUPFILE= /usr/share/examples/cvsup/standard-supfile PORTSSUPFILE= /usr/share/examples/cvsup/ports-supfile DOCSUPFILE= /usr/share/examples/cvsup/doc-supfile #你可以添加下面这些来指定用 ports 安装软件的时候首先从离你比较近的镜像服务器下载源代码包。

MASTER_SITE_BACKUP?= \ ftp://ftp.freebsd.org.cn/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/ \ MASTER_SITE_OVERRIDE?= ${MASTER_SITE_BACKUP} 由于字体的原因,还要添加 WITH_CJK=yes 然后升级ports,并强行更新: /usr/ports print/freetyp2;x11- fonts/fontconfig;x11-fonts/libXft;x11-toolkits/pango(顺序不能错,中间也不要插入编译其他的软件)

/etc/login.conf~/.login_conf

这里可以设置本地化的全局变量,而不管你使用的是 csh 还是 bash,在 default 的排列下面加上如下两行: 代码: :lang=zh_CN.GBK:\ :charset=GBK: 注意格式哦,加了这两行之后上面的 :umask=022:后面就要加上"\"符号。 ~/.login_conf 同理,只不过是单个用户的局部设置罢了。

~/.cshrc(我个人比较喜欢用tcsh)]

# $FreeBSD: src/share/skel/dot.cshrc,v 1.13 2001/01/10 17:35:28 archie Exp $ # # .cshrc - csh resource script, read at beginning of execution by each shell # # see also csh(1), environ(7). # alias h history 25 alias j jobs -l alias la ls -a alias lf ls -FA alias ll ls -lA

alias vi env LC_CTYPE=en_US.ISO_8859-1 vi #vi的国际化做的不好,但是定义成8859-1可以显示中文

alias ls env LC_CTYPE=en_US.ISO_8859-1 ls -G #同样,ls也是,-G选项让ls可以显示彩色 # A righteous umask umask 22

set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin /usr/X11R6/bin $HOME/bin)

setenv EDITOR vi

setenv PAGER more

setenv BLOCKSIZE K

setenv LANG zh_CN.GBK #设定LANG环境变量为简体中文,到目前为止,建议在5.x版本上使用 GBK,如果你使用 4.x 版本,那么将 GBK 更改为或者eucCN

setenv LC_ALL zh_CN.GBK #设定LC_ALL环境变量为简体中文

setenv G_BROKEN_FILENAMES 1 #这个环境变量可以让 GNOME2.x 不使用默认的UTF-8 编码,而使用系统 LANG 变量的编码

setenv SGML_CATALOG_FILES /usr/local/share/sgml/catalog

setenv XML_CATALOG_FILES /usr/local/share/xml/catalog.ports #这两个是我写sgml用的:)

setenv LSCOLORS ExFxCxDxBxEgDxDEhGAcHd #这个环境变量可以定义ls显示的彩色样式,试试看有什么区别:) if ($?prompt) then # An interactive shell -- set some stuff up

set prompt = '%n:%~%# ' #来个好看一点的提示符:-)

set filec

set history = 100

set savehist = 100

set mail = (/var/mail/$USER)

set dspmbyte = 0000000000000000000000000000000000000000000000000000000000000000222 22222222222222222222222222222222222222222222222222222222222223333333333333333333 33333333333333333333333333333333333333333333333333333333333333333333333333333333 33333333333333333333333333330 #设定 tcsh 可以支持 GBK 输入,如果你用 eucCN 类似的 locale,就不需要了。感谢 intron@SMTH。这一串字符是 64 064 2127 31 0:-)

if ( $?tcsh ) then bindkey "^W" backward-delete-word bindkey -k up history-search-backward bindkey -k down history-search-forward endif endif

做完以上工作,然后在/usr/src下执行make update(我也是刚学的这个方法,以前都是用cvsup直接升级,比较笨的说),然后src,ports,doc全都更新了。high

[编译整个系统]

/usr/src下执行make buildworld(这里的make千万不要加-j参数,会出错的,我就是受害者,sigh)然后在/usr/src/sys/i386/conf下复制文件GENERIC文件为MK,然后加入以下选项: options VESA

options SC_PIXEL_MODE

device sound #声卡驱动通用部分

device snd_ich #注意这个选择适合您自己声卡的驱动程序再去掉一些不需要的如usb keyboard设备,firewire设备,使内核尽量精简。然后在/usr/src下执行

make -j 64 buildkernel KERNCONF=MK;make -j 64 installkernel KERNCONF=MK,然后重启机子(为了安全起见,其实我从未遇到过因为跳过重启这一步而出问题的),到/usr/src下执行make installworld,最后执行mergemaster -a(自动),基本一切okay了,然后再重启机子,呵呵,焕然一新。

x-window

由于5.xFreeBSDXOrg为默认的X Server,所以配置它的命令也相应改为xorgconfig,依样画葫芦,设置一下显示器刷新率和显卡型号,存盘即可。然后安装x-windowwindow manager。听别人推荐icewm,试了一下,果然觉得比xfcefluxbox好用,还有好看的theme更新,又high了一把。 [中文输入法]以前一直用fcitx,看帖子有推荐scim的,尝试了一下,不错,我现在用的是它的kde前端skim,要安装: /usr/ports/chinese/scim-tables/usr/ports/textproc/skim,然后在桌面下执行skim -d(后台daemon)就好了,拼音用的挺顺的。

[中文显示]

由于是5.x,这里有些设置与4.x有所不同: alias ls ls -aG alias cls clear limit coredumpsize 0 #使coredump时不产生内存映像文件 setenv XMODIFIERS @im=SCIM setenv XIM SCIM setenv XIM_PROGRAM SCIM setenv LANG zh_CN.GBK setenv LC_ALL zh_CN.GBK setenv G_BROKEN_FILENAMES 1 setenv LSCOLORS ExFxCxDxBxEgDxDEhGAcHd #ls的彩色显示有所改善 写得好累呀,虽然中间有不少的ctrl+c,ctrl+v,还是费了不少精力和时间。先写这么多,以后再补充

 

- 作者: rabbitweng 2005年04月27日, 星期三 19:44  回复(1) |  引用(1) 加入博采

春游归来

      昨天和今天的上午都是在柞水县城那度过的,去了那得叫顶峰台的地方,还到山上的观音庙中走了走,奇怪的是那里只有一个年轻的和尚在售门票,他居然联系主持还要通过手机,看来哪个庙太小了,连一个主持都容不下,呵呵,南无阿弥陀佛!

      除此之外,我们还到柞水那得比较有名的柞水溶洞走了一遭,那溶洞里真可以说是冬暖夏凉,导游说溶洞了一年四季都是18度----一个让人觉得很舒服的温度(那些导游挺爽的,看来),而且那的风景确实挺好的,特别是站在顶峰台最好的那个庙中,放眼望去尽是层层叠叠的山峦,确实能使人产生一种"歌以咏志"的冲动,只可惜偶不会写诗,失败呀!


- 作者: rabbitweng 2005年04月20日, 星期三 21:00  回复(1) |  引用(1) 加入博采

dd命令使用[zz]
―――在系统中增加一块新硬盘,并进行完全备份

说明:dd - 作用:转换和拷贝文件。是对设备进行使用的!
将ds10的资料从源盘完全拷贝到目标盘上!(注:两块硬盘容量一样36G)
操作系统tru64 5.1b
整个操作过程如下:
目标盘:/dev/rdisk/dsk1c ,
源盘: /dev/rdisk/dsk0c

1) ds10通过scsi卡来接第二块硬盘时,必须使用跳线,(我是用的光驱跳线帽了^_^)。
2) 开机,show dev , 找到两块硬盘 ,boot 启动。
3) 以超级用户登录,diskconfig看到两块硬盘。可以将目标盘先配置为advfs格式,将整个硬盘选上,此处是用c来表示整个硬盘! 在/dev/disk目录下也会看到dsk0 ,dsk1说明有两块硬盘。
4) 查看目前的主盘,sizer -r 可以看到是dsk0 ,表示当前的主盘(源盘)。
5) 使用硬件管理命令:hwmgr 查看当前硬件组成。 hwmgr -view device 显示如下
# hwmgr -view device
HWID: Device Name Mfg Model Location
------------------------------------------------------------------------------
3: /dev/dmapi/dmapi
4: /dev/scp_scsi
5: /dev/kevm
33: /dev/disk/floppy0c 3.5in floppy fdi0-unit-0
43: /dev/disk/cdrom0c HL-DT-ST CD-ROM GCR-8480B bus-1-targ-0-lun-0
45: /dev/random
46: /dev/urandom
47: /dev/disk/dsk0c COMPAQ BD03695CC8 bus-2-targ-0-lun-0
48:/dev/disk/dsk1c ......
6) /dev/disk/dsk1c即目标盘,通过使用label,它的作用是读、写一个磁盘组套的标志并且格式化硬盘分区。操作命令如下:
# disklabel -wr /dev/rdisk/dsk1c scsi
对rdisk进行说明是表示"raw disk"即原来的磁盘。 -wr 表示:间接的或从磁盘读写label,而不是在在内存中拷贝label。(w的作用很重要,如果没有该参数,以后重新启动的时候会遇到osf_boot 不能打开的问题的问题的!)
针对:" open osf_boot"
有一个补救方法:进入原来的双硬盘系统中,
#disklabel -r /dev/rdisk/dsk1a > /tmp/rd1label
#disklabel -t advfs -r -R /dev/rdisk/dsk1a /tmp/rd1label scsi
以后下同11)。
7) 在进行复制之前必须取消disk label ,
# disklabel -z dev/rdisk/dsk1c -z 表示:清除磁盘的label 。否则会提示错误。
8) 可以进行整个磁盘的拷贝了:
# dd if=/dev/rdisk/dsk0c of=/dev/rdisk/dsk1c bs=512k conv=swab,notrunc 解释各个参数 if : input file 表示输入文件的源是dsk0c , of : output file 表示输出到文件地址 dsk1c , bs : bs=bytes ,一次读和写 bytes 字节。最大可以设置到65536k,默认是512k。它是scsi卡传输所决定的!注意:swap和notrunc之间只有",",没有空格。
9) 喝杯咖啡吧,小憩!(大概50分钟吧,不过是原汁原味了!等,也是值得的!)
10) 停机,将跳线去掉,调换两块硬盘的位置。
11) 以单用户进入
#mount -a 会出现一些错误,不要理会,此时是报告一些分区没有加载上。使用:
#dn_setup init 清除原来的设置,包括指向的swap ,boot等
# dsfmgr -k

12) mount -a 或者 bcheckrc ,刚才的error全部不见了。分区加载上了。
13) init 3
14) 进入图形界面,呵呵大功告成!

下面的3篇参考文章 , 在此表示谢谢!
http://www.fanqiang.com/a1/b1/20010508/135910.html
http://www.chinaunix.net/forum/viewtopic.php?t=13058
http://www.chinaunix.net/jh/11/31484.html

- 作者: rabbitweng 2005年04月15日, 星期五 18:49  回复(1) |  引用(1) 加入博采